diff options
| author | Keith Packard <keithp@keithp.com> | 2015-02-07 14:43:11 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2015-02-07 14:43:11 -0800 | 
| commit | e70f3dca01b15b75b0b8795eb71bd12817af4800 (patch) | |
| tree | 7958f178d7456fc4d66f196ac1f31f7c0f4d106e | |
| parent | 08f07d0af123e1c307bc4c0c973da07fae8246b1 (diff) | |
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 <keithp@keithp.com>
| -rw-r--r-- | altoslib/AltosListenerState.java | 2 | ||||
| -rw-r--r-- | altosui/AltosFlightStatus.java | 30 | ||||
| -rw-r--r-- | altosui/AltosFlightUI.java | 10 | ||||
| -rw-r--r-- | altosuilib/AltosDisplayThread.java | 4 | ||||
| -rw-r--r-- | telegps/TeleGPS.java | 11 | ||||
| -rw-r--r-- | telegps/TeleGPSDisplayThread.java | 4 | ||||
| -rw-r--r-- | 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(); | 
