X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosdroid%2Fapp%2Fsrc%2Fmain%2Fjava%2Forg%2Faltusmetrum%2FAltosDroid%2FAltosDroid.java;h=0b354f637f7f37c45c4deb7d06819a8d55495129;hp=46709f0f7f3c9bff417aad335ac6d85270ac08f5;hb=79f2677143f85a2807b8d4e297f3617aafbd34da;hpb=6e3c4493cfa8d92d96808d14d1c12abb35ecb442 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 46709f0f..0b354f63 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,13 @@ 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 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"; // Setup result bits public static final int SETUP_BAUD = 1; @@ -218,7 +153,6 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, TelemetryState telemetry_state; Tracker[] trackers; - UsbDevice pending_usb_device; boolean start_with_usb; @@ -325,7 +259,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 +297,6 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, } int selected_serial = 0; - int current_serial; long switch_time; void set_switch_time() { @@ -378,11 +311,15 @@ 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_serial == 0 || telemetry_state.get(selected_serial) == null) { + AltosDebug.debug("selected serial set to %d", selected_serial); + selected_serial = telemetry_state.latest_serial; + } + + int shown_serial = selected_serial; - if (current_serial == 0) - current_serial = telemetry_state.latest_serial; + if (telemetry_state.idle_mode) + shown_serial = telemetry_state.latest_serial; if (!registered_units_listener) { registered_units_listener = true; @@ -390,7 +327,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 +337,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); - - 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 (telemetry_state.frequency != AltosLib.MISSING) + telem_frequency = telemetry_state.frequency; - 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 +388,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 +414,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)); } } @@ -950,6 +865,10 @@ 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; } } @@ -1069,7 +988,10 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, return true; } + double telem_frequency = 434.550; + void setFrequency(double freq) { + telem_frequency = freq; try { mService.send(Message.obtain(null, TelemetryService.MSG_SETFREQUENCY, freq)); set_switch_time(); @@ -1109,10 +1031,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); @@ -1120,6 +1041,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; @@ -1128,12 +1050,20 @@ 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 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 touch_trackers(Integer[] serials) { AlertDialog.Builder builder_tracker = new AlertDialog.Builder(this); builder_tracker.setTitle("Select Tracker"); @@ -1143,16 +1073,16 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, my_trackers[0] = new Tracker(null); for (int i = 0; i < serials.length; i++) { - AltosState s = telemetry_state.states.get(serials[i]); + AltosState s = telemetry_state.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); + select_tracker(0, 0.0); else - select_tracker(my_trackers[item].serial); + select_tracker(my_trackers[item].serial, my_trackers[item].frequency); } }); AlertDialog alert_tracker = builder_tracker.create(); @@ -1210,23 +1140,14 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, alert_freq.show(); return true; case R.id.select_tracker: + serverIntent = new Intent(this, SelectTrackerActivity.class); 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(); - + ArrayList tracker_array = new ArrayList(Arrays.asList(trackers)); + serverIntent.putParcelableArrayListExtra(EXTRA_TRACKERS, tracker_array); + } else { + serverIntent.putExtra(EXTRA_TRACKERS, (Parcelable[]) null); } + startActivityForResult(serverIntent, REQUEST_SELECT_TRACKER); return true; case R.id.delete_track: if (trackers != null) { @@ -1249,6 +1170,7 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener, 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; }