X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=altosdroid%2Fapp%2Fsrc%2Fmain%2Fjava%2Forg%2Faltusmetrum%2FAltosDroid%2FAltosDroid.java;h=3cd369028b5adeb8331ae1b5f73174c9f7477050;hb=9697da4767bceb07c4ec070e1537ff4f91a74a87;hp=efb425787196d00f20b0bdde4248541689108da1;hpb=d84a777f07c9a876acdcda44ebc9186ef226d896;p=fw%2Faltos diff --git a/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/AltosDroid.java index efb42578..3cd36902 100644 --- a/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/AltosDroid.java +++ b/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/AltosDroid.java @@ -36,6 +36,7 @@ import android.os.Handler; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; +import android.os.Parcelable; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import android.view.*; @@ -72,75 +73,6 @@ class SavedState { } } -class Tracker implements CharSequence, Comparable { - int serial; - String call; - double frequency; - - String display; - - public Tracker(int serial, String call, double frequency) { - if (call == null) - call = "none"; - - this.serial = serial; - this.call = call; - this.frequency = frequency; - if (frequency == 0.0) - display = "Auto"; - else if (frequency == AltosLib.MISSING) { - display = String.format("%-8.8s %6d", call, serial); - } else { - display = String.format("%-8.8s %7.3f %6d", call, frequency, serial); - } - } - - public Tracker(AltosState s) { - this(s == null ? 0 : s.cal_data().serial, - s == null ? null : s.cal_data().callsign, - s == null ? 0.0 : s.frequency); - } - - /* CharSequence */ - public char charAt(int index) { - return display.charAt(index); - } - - public int length() { - return display.length(); - } - - public CharSequence subSequence(int start, int end) throws IndexOutOfBoundsException { - return display.subSequence(start, end); - } - - public String toString() { - return display.toString(); - } - - /* Comparable */ - public int compareTo (Object other) { - Tracker o = (Tracker) other; - if (frequency == 0.0) { - if (o.frequency == 0.0) - return 0; - return -1; - } - if (o.frequency == 0.0) - return 1; - - int a = serial - o.serial; - int b = call.compareTo(o.call); - int c = (int) Math.signum(frequency - o.frequency); - - if (b != 0) - return b; - if (c != 0) - return c; - return a; - } -} - public class AltosDroid extends FragmentActivity implements AltosUnitsListener, LocationListener, ActivityCompat.OnRequestPermissionsResultCallback { // Actions sent to the telemetry server at startup time @@ -162,10 +94,15 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, public static final int REQUEST_IDLE_MODE = 5; public static final int REQUEST_IGNITERS = 6; public static final int REQUEST_SETUP = 7; + public static final int REQUEST_SELECT_TRACKER = 8; + public static final int REQUEST_DELETE_TRACKER = 9; public static final String EXTRA_IDLE_MODE = "idle_mode"; public static final String EXTRA_IDLE_RESULT = "idle_result"; + public static final String EXTRA_FREQUENCY = "frequency"; public static final String EXTRA_TELEMETRY_SERVICE = "telemetry_service"; + public static final String EXTRA_TRACKERS = "trackers"; + public static final String EXTRA_TRACKERS_TITLE = "trackers_title"; // Setup result bits public static final int SETUP_BAUD = 1; @@ -218,7 +155,6 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, TelemetryState telemetry_state; Tracker[] trackers; - UsbDevice pending_usb_device; boolean start_with_usb; @@ -325,7 +261,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, case TelemetryState.CONNECT_CONNECTED: if (telemetry_state.config != null) { String str = String.format("S/N %d %6.3f MHz%s", telemetry_state.config.serial, - telemetry_state.frequency, idle_mode ? " (idle)" : ""); + telemetry_state.frequency, telemetry_state.idle_mode ? " (idle)" : ""); if (telemetry_state.telemetry_rate != AltosLib.ao_telemetry_rate_38400) str = str.concat(String.format(" %d bps", AltosLib.ao_telemetry_rate_values[telemetry_state.telemetry_rate])); @@ -363,7 +299,6 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, } int selected_serial = 0; - int current_serial; long switch_time; void set_switch_time() { @@ -378,11 +313,29 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, if (new_telemetry_state != null) telemetry_state = new_telemetry_state; - if (selected_serial != 0) - current_serial = selected_serial; + if (selected_frequency != AltosLib.MISSING) { + AltosState selected_state = telemetry_state.get(selected_serial); + AltosState latest_state = telemetry_state.get(telemetry_state.latest_serial); - if (current_serial == 0) - current_serial = telemetry_state.latest_serial; + if (selected_state != null && selected_state.frequency == selected_frequency) { + selected_frequency = AltosLib.MISSING; + } else if ((selected_state == null || selected_state.frequency != selected_frequency) && + (latest_state != null && latest_state.frequency == selected_frequency)) + { + selected_frequency = AltosLib.MISSING; + selected_serial = telemetry_state.latest_serial; + } + } + + if (!telemetry_state.containsKey(selected_serial)) { + selected_serial = telemetry_state.latest_serial; + AltosDebug.debug("selected serial set to %d", selected_serial); + } + + int shown_serial = selected_serial; + + if (telemetry_state.idle_mode) + shown_serial = telemetry_state.latest_serial; if (!registered_units_listener) { registered_units_listener = true; @@ -390,7 +343,8 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, } int num_trackers = 0; - for (AltosState s : telemetry_state.states.values()) { + + for (AltosState s : telemetry_state.values()) { num_trackers++; } @@ -399,44 +353,17 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, int n = 0; trackers[n++] = new Tracker(0, "auto", 0.0); - for (AltosState s : telemetry_state.states.values()) + for (AltosState s : telemetry_state.values()) trackers[n++] = new Tracker(s); Arrays.sort(trackers); - update_title(telemetry_state); + if (telemetry_state.frequency != AltosLib.MISSING) + telem_frequency = telemetry_state.frequency; - AltosState state = null; - boolean aged = true; - - if (telemetry_state.states.containsKey(current_serial)) { - state = telemetry_state.states.get(current_serial); - int age = state_age(state.received_time); - if (age < 20) - aged = false; - if (current_serial == selected_serial) - aged = false; - else if (switch_time != 0 && (switch_time - state.received_time) > 0) - aged = true; - } - - if (aged) { - AltosState newest_state = null; - int newest_age = 0; - - for (int serial : telemetry_state.states.keySet()) { - AltosState existing = telemetry_state.states.get(serial); - int existing_age = state_age(existing.received_time); - - if (newest_state == null || existing_age < newest_age) { - newest_state = existing; - newest_age = existing_age; - } - } + update_title(telemetry_state); - if (newest_state != null) - state = newest_state; - } + AltosState state = telemetry_state.get(shown_serial); update_ui(telemetry_state, state, telemetry_state.quiet); @@ -477,6 +404,19 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } + static String age_string(int age) { + String text; + if (age < 60) + text = String.format("%ds", age); + else if (age < 60 * 60) + text = String.format("%dm", age / 60); + else if (age < 60 * 60 * 24) + text = String.format("%dh", age / (60 * 60)); + else + text = String.format("%dd", age / (24 * 60 * 60)); + return text; + } + void update_age() { if (saved_state != null) { int age = state_age(saved_state.received_time); @@ -490,16 +430,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, set_screen_on(age); - String text; - if (age < 60) - text = String.format("%ds", age); - else if (age < 60 * 60) - text = String.format("%dm", age / 60); - else if (age < 60 * 60 * 24) - text = String.format("%dh", age / (60 * 60)); - else - text = String.format("%dd", age / (24 * 60 * 60)); - mAgeView.setText(text); + mAgeView.setText(age_string(age)); } } @@ -649,6 +580,13 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, R.style.Extra }; + static public int[] dialog_themes = { + R.style.Small_Dialog, + R.style.Medium_Dialog, + R.style.Large_Dialog, + R.style.Extra_Dialog + }; + @Override public void onCreate(Bundle savedInstanceState) { // Initialise preferences @@ -692,7 +630,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, mStateView = (TextView) findViewById(R.id.state_value); mAgeView = (TextView) findViewById(R.id.age_value); mAgeNewColor = mAgeView.getTextColors().getDefaultColor(); - mAgeOldColor = getResources().getColor(R.color.old_color); + mAgeOldColor = getResources().getColor(R.color.old_color, getTheme()); } private void ensureBluetooth() { @@ -943,6 +881,14 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, if (resultCode == Activity.RESULT_OK) note_setup_changes(data); break; + case REQUEST_SELECT_TRACKER: + if (resultCode == Activity.RESULT_OK) + select_tracker(data); + break; + case REQUEST_DELETE_TRACKER: + if (resultCode == Activity.RESULT_OK) + delete_track(data); + break; } } @@ -1062,7 +1008,12 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, return true; } + double telem_frequency = 434.550; + double selected_frequency = AltosLib.MISSING; + void setFrequency(double freq) { + telem_frequency = freq; + selected_frequency = AltosLib.MISSING; try { mService.send(Message.obtain(null, TelemetryService.MSG_SETFREQUENCY, freq)); set_switch_time(); @@ -1102,10 +1053,9 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, } } - void select_tracker(int serial) { - int i; + void select_tracker(int serial, double frequency) { - AltosDebug.debug("select tracker %d\n", serial); + AltosDebug.debug("select tracker %d %7.3f\n", serial, frequency); if (serial == selected_serial) { AltosDebug.debug("%d already selected\n", serial); @@ -1113,6 +1063,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, } if (serial != 0) { + int i; for (i = 0; i < trackers.length; i++) if (trackers[i].serial == serial) break; @@ -1121,35 +1072,18 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, AltosDebug.debug("attempt to select unknown tracker %d\n", serial); return; } + if (frequency != 0.0 && frequency != AltosLib.MISSING) + setFrequency(frequency); } - current_serial = selected_serial = serial; + selected_serial = serial; update_state(null); } - void touch_trackers(Integer[] serials) { - AlertDialog.Builder builder_tracker = new AlertDialog.Builder(this); - builder_tracker.setTitle("Select Tracker"); - - final Tracker[] my_trackers = new Tracker[serials.length + 1]; - - my_trackers[0] = new Tracker(null); - - for (int i = 0; i < serials.length; i++) { - AltosState s = telemetry_state.states.get(serials[i]); - my_trackers[i+1] = new Tracker(s); - } - builder_tracker.setItems(my_trackers, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int item) { - if (item == 0) - select_tracker(0); - else - select_tracker(my_trackers[item].serial); - } - }); - AlertDialog alert_tracker = builder_tracker.create(); - alert_tracker.show(); + void select_tracker(Intent data) { + int serial = data.getIntExtra(SelectTrackerActivity.EXTRA_SERIAL_NUMBER, 0); + double frequency = data.getDoubleExtra(SelectTrackerActivity.EXTRA_FREQUENCY, 0.0); + select_tracker(serial, frequency); } void delete_track(int serial) { @@ -1159,6 +1093,39 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, } } + void delete_track(Intent data) { + int serial = data.getIntExtra(SelectTrackerActivity.EXTRA_SERIAL_NUMBER, 0); + if (serial != 0) + delete_track(serial); + } + + void start_select_tracker(Tracker[] select_trackers, int title_id, int request) { + Intent intent = new Intent(this, SelectTrackerActivity.class); + AltosDebug.debug("put title id 0x%x %s", title_id, getResources().getString(title_id)); + intent.putExtra(EXTRA_TRACKERS_TITLE, title_id); + if (select_trackers != null) { + ArrayList tracker_array = new ArrayList(Arrays.asList(select_trackers)); + intent.putParcelableArrayListExtra(EXTRA_TRACKERS, tracker_array); + } else { + intent.putExtra(EXTRA_TRACKERS, (Parcelable[]) null); + } + startActivityForResult(intent, request); + } + + void start_select_tracker(Tracker[] select_trackers) { + start_select_tracker(select_trackers, R.string.select_tracker, REQUEST_SELECT_TRACKER); + } + + void touch_trackers(Integer[] serials) { + Tracker[] my_trackers = new Tracker[serials.length]; + + for (int i = 0; i < serials.length; i++) { + AltosState s = telemetry_state.get(serials[i]); + my_trackers[i] = new Tracker(s); + } + start_select_tracker(my_trackers); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { Intent serverIntent = null; @@ -1192,56 +1159,28 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, frequency_strings[i] = frequencies[i].toString(); AlertDialog.Builder builder_freq = new AlertDialog.Builder(this); - builder_freq.setTitle("Pick a frequency"); + builder_freq.setTitle("Select Frequency"); builder_freq.setItems(frequency_strings, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { setFrequency(frequencies[item]); + selected_frequency = frequencies[item].frequency; } }); AlertDialog alert_freq = builder_freq.create(); alert_freq.show(); return true; case R.id.select_tracker: - if (trackers != null) { - AlertDialog.Builder builder_serial = new AlertDialog.Builder(this); - builder_serial.setTitle("Select a tracker"); - builder_serial.setItems(trackers, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int item) { - System.out.printf("select item %d %s\n", item, trackers[item].display); - if (item == 0) - select_tracker(0); - else - select_tracker(trackers[item].serial); - } - }); - AlertDialog alert_serial = builder_serial.create(); - alert_serial.show(); - - } + start_select_tracker(trackers); return true; case R.id.delete_track: - if (trackers != null) { - AlertDialog.Builder builder_serial = new AlertDialog.Builder(this); - builder_serial.setTitle("Delete a track"); - final Tracker[] my_trackers = new Tracker[trackers.length - 1]; - for (int i = 0; i < trackers.length - 1; i++) - my_trackers[i] = trackers[i+1]; - builder_serial.setItems(my_trackers, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int item) { - delete_track(my_trackers[item].serial); - } - }); - AlertDialog alert_serial = builder_serial.create(); - alert_serial.show(); - - } + if (trackers != null && trackers.length > 0) + start_select_tracker(trackers, R.string.delete_track, REQUEST_DELETE_TRACKER); return true; case R.id.idle_mode: serverIntent = new Intent(this, IdleModeActivity.class); serverIntent.putExtra(EXTRA_IDLE_MODE, idle_mode); + serverIntent.putExtra(EXTRA_FREQUENCY, telem_frequency); startActivityForResult(serverIntent, REQUEST_IDLE_MODE); return true; }