From e70f3dca01b15b75b0b8795eb71bd12817af4800 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 7 Feb 2015 14:43:11 -0800 Subject: [PATCH] altoslib: Mark listener as 'not running' on EOF. This adds a 'running' member to the AltosListenerState class, and when the replay reader reaches EOF, marks the listener as no longer running. AltosUI and TeleGPS now display 'done' in the 'Age' field when this occurs, to let the user know that the replay is over. Also make sure that the display timers are stopped when this happens, or when the window is closed. Signed-off-by: Keith Packard --- altoslib/AltosListenerState.java | 2 ++ altosui/AltosFlightStatus.java | 30 ++++++++++++++++++++++++---- altosui/AltosFlightUI.java | 10 ++++++---- altosuilib/AltosDisplayThread.java | 4 +++- telegps/TeleGPS.java | 11 +++------- telegps/TeleGPSDisplayThread.java | 4 +++- telegps/TeleGPSStatus.java | 32 +++++++++++++++++++++++++----- 7 files changed, 70 insertions(+), 23 deletions(-) diff --git a/altoslib/AltosListenerState.java b/altoslib/AltosListenerState.java index ed1f0f19..bba21830 100644 --- a/altoslib/AltosListenerState.java +++ b/altoslib/AltosListenerState.java @@ -22,9 +22,11 @@ import java.io.*; public class AltosListenerState implements Serializable { public int crc_errors; public double battery; + public boolean running; public AltosListenerState() { crc_errors = 0; battery = AltosLib.MISSING; + running = true; } } diff --git a/altosui/AltosFlightStatus.java b/altosui/AltosFlightStatus.java index 7e7efa64..a847d884 100644 --- a/altosui/AltosFlightStatus.java +++ b/altosui/AltosFlightStatus.java @@ -229,10 +229,14 @@ public class AltosFlightStatus extends JComponent implements AltosFlightDisplay long last_secs = -1; void show(AltosState state, AltosListenerState listener_state) { - long secs = (System.currentTimeMillis() - state.received_time + 500) / 1000; - if (secs != last_secs) { - value.setText(String.format("%d", secs)); - last_secs = secs; + if (listener_state.running) { + long secs = (System.currentTimeMillis() - state.received_time + 500) / 1000; + if (secs != last_secs) { + value.setText(String.format("%d", secs)); + last_secs = secs; + } + } else { + value.setText("done"); } } @@ -276,6 +280,8 @@ public class AltosFlightStatus extends JComponent implements AltosFlightDisplay flight_state.show(state, listener_state); rssi.show(state, listener_state); last_packet.show(state, listener_state); + if (!listener_state.running) + stop(); } public int height() { @@ -285,6 +291,22 @@ public class AltosFlightStatus extends JComponent implements AltosFlightDisplay public String getName() { return "Flight Status"; } + AltosFlightStatusUpdate status_update; + javax.swing.Timer timer; + + public void start(AltosFlightStatusUpdate status_update) { + this.status_update = status_update; + timer = new javax.swing.Timer(100, status_update); + timer.start(); + } + + public void stop() { + if (timer != null) { + timer.stop(); + timer = null; + } + } + public AltosFlightStatus() { layout = new GridBagLayout(); diff --git a/altosui/AltosFlightUI.java b/altosui/AltosFlightUI.java index 6af345ea..d7c8223e 100644 --- a/altosui/AltosFlightUI.java +++ b/altosui/AltosFlightUI.java @@ -97,6 +97,7 @@ public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay { public void show(AltosState state, AltosListenerState listener_state) { status_update.saved_state = state; + status_update.saved_listener_state = listener_state; if (state == null) state = new AltosState(); @@ -335,9 +336,14 @@ public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay { AltosUIPreferences.register_font_listener(this); AltosPreferences.register_units_listener(this); + status_update = new AltosFlightStatusUpdate(flightStatus); + + flightStatus.start(status_update); + addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { + flightStatus.stop(); disconnect(); setVisible(false); dispose(); @@ -353,10 +359,6 @@ public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay { thread = new AltosDisplayThread(this, voice, this, reader); - status_update = new AltosFlightStatusUpdate(flightStatus); - - new javax.swing.Timer(100, status_update).start(); - thread.start(); } diff --git a/altosuilib/AltosDisplayThread.java b/altosuilib/AltosDisplayThread.java index 6b6e03e7..627088bc 100644 --- a/altosuilib/AltosDisplayThread.java +++ b/altosuilib/AltosDisplayThread.java @@ -224,8 +224,10 @@ public class AltosDisplayThread extends Thread { for (;;) { try { state = reader.read(); - if (state == null) + if (state == null) { + listener_state.running = false; break; + } reader.update(state); show_safely(); told = tell(); diff --git a/telegps/TeleGPS.java b/telegps/TeleGPS.java index a4b221e8..41f88172 100644 --- a/telegps/TeleGPS.java +++ b/telegps/TeleGPS.java @@ -67,7 +67,6 @@ public class TeleGPS TeleGPSStatus telegps_status; TeleGPSStatusUpdate status_update; - javax.swing.Timer status_timer; JTabbedPane pane; @@ -147,6 +146,7 @@ public class TeleGPS public void show(AltosState state, AltosListenerState listener_state) { try { status_update.saved_state = state; + status_update.saved_listener_state = listener_state; if (state == null) state = new AltosState(); @@ -178,11 +178,7 @@ public class TeleGPS void disconnect() { setTitle("TeleGPS"); stop_display(); - if (status_timer != null) { - status_timer.stop(); - status_timer = null; - status_update = null; - } + telegps_status.stop(); telegps_status.disable_receive(); disable_frequency_menu(); @@ -404,8 +400,7 @@ public class TeleGPS public void set_reader(AltosFlightReader reader, AltosDevice device) { status_update = new TeleGPSStatusUpdate(telegps_status); - status_timer = new javax.swing.Timer(100, status_update); - status_timer.start(); + telegps_status.start(status_update); setTitle(String.format("TeleGPS %s", reader.name)); thread = new TeleGPSDisplayThread(this, voice(), this, reader); diff --git a/telegps/TeleGPSDisplayThread.java b/telegps/TeleGPSDisplayThread.java index 18b8d9fc..6305bf2f 100644 --- a/telegps/TeleGPSDisplayThread.java +++ b/telegps/TeleGPSDisplayThread.java @@ -168,8 +168,10 @@ public class TeleGPSDisplayThread extends Thread { for (;;) { try { state = reader.read(); - if (state == null) + if (state == null) { + listener_state.running = false; break; + } reader.update(state); show_safely(); told = tell(); diff --git a/telegps/TeleGPSStatus.java b/telegps/TeleGPSStatus.java index 1d4415d6..1eeb7ed5 100644 --- a/telegps/TeleGPSStatus.java +++ b/telegps/TeleGPSStatus.java @@ -179,11 +179,15 @@ public class TeleGPSStatus extends JComponent implements AltosFlightDisplay { long last_secs = -1; void show(AltosState state, AltosListenerState listener_state) { - long secs = (System.currentTimeMillis() - state.received_time + 500) / 1000; - - if (secs != last_secs) { - value.setText(String.format("%d", secs)); - last_secs = secs; + if (listener_state.running) { + long secs = (System.currentTimeMillis() - state.received_time + 500) / 1000; + + if (secs != last_secs) { + value.setText(String.format("%d", secs)); + last_secs = secs; + } + } else { + value.setText("done"); } } @@ -232,6 +236,8 @@ public class TeleGPSStatus extends JComponent implements AltosFlightDisplay { flight.show(state, listener_state); rssi.show(state, listener_state); last_packet.show(state, listener_state); + if (!listener_state.running) + stop(); } public int height() { @@ -239,6 +245,22 @@ public class TeleGPSStatus extends JComponent implements AltosFlightDisplay { return d.height; } + TeleGPSStatusUpdate status_update; + javax.swing.Timer timer; + + public void start(TeleGPSStatusUpdate status_update) { + this.status_update = status_update; + timer = new javax.swing.Timer(100, status_update); + timer.start(); + } + + public void stop() { + if (timer != null) { + timer.stop(); + timer = null; + } + } + public TeleGPSStatus() { layout = new GridBagLayout(); -- 2.30.2