diff options
| author | Keith Packard <keithp@keithp.com> | 2011-03-28 23:35:05 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2011-03-28 23:35:05 -0700 | 
| commit | c71a145daefb86d2c1297abec68e54bd951e3adf (patch) | |
| tree | 966b9ed98509ff55c89a8e995efec13f41c5243e /altosui/AltosSerial.java | |
| parent | c6e7e812d67f91c63ba4982f7a899a72584027de (diff) | |
altosui: Clean up packet link connecting dialog
Make sure the dialog is destroyed after use (otherwise, it hangs
around on the screen sometimes).
Switch timeout before showing dialog to 500ms -- that brings the
dialog up less often when unnecessary.
Use 'timeout_started' boolean to indicate whether the I/O thread has
queued the dialog for display and whether it needs to queue a call to
close it down.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'altosui/AltosSerial.java')
| -rw-r--r-- | altosui/AltosSerial.java | 35 | 
1 files changed, 25 insertions, 10 deletions
| diff --git a/altosui/AltosSerial.java b/altosui/AltosSerial.java index 57e13448..111bd771 100644 --- a/altosui/AltosSerial.java +++ b/altosui/AltosSerial.java @@ -137,16 +137,19 @@ public class AltosSerial implements Runnable {  	boolean	timeout_started = false;  	private void stop_timeout_dialog() { -		Runnable r = new Runnable() { -				public void run() { -					if (timeout_dialog != null) +		if (timeout_started) { +			timeout_started = false; +			Runnable r = new Runnable() { +					public void run() {  						timeout_dialog.setVisible(false); -				} -			}; -		SwingUtilities.invokeLater(r); +					} +				}; +			SwingUtilities.invokeLater(r); +		}  	}  	private void start_timeout_dialog_internal() { +  		Object[] options = { "Cancel" };  		JOptionPane	pane = new JOptionPane(); @@ -163,12 +166,14 @@ public class AltosSerial implements Runnable {  			return;  		if (options[0].equals(o))  			abort = true; +		timeout_dialog.dispose(); +		timeout_dialog = null;  	}  	private boolean check_timeout() {  		if (!timeout_started && frame != null) { -			timeout_started = true;  			if (!SwingUtilities.isEventDispatchThread()) { +				timeout_started = true;  				Runnable r = new Runnable() {  						public void run() {  							start_timeout_dialog_internal(); @@ -186,7 +191,7 @@ public class AltosSerial implements Runnable {  		int timeout = 100;  		if (remote) -			timeout = 300; +			timeout = 500;  		do {  			try {  				Thread.sleep(timeout); @@ -210,15 +215,19 @@ public class AltosSerial implements Runnable {  		return line.line;  	} +	int	in_reply; +  	public String get_reply(int timeout) throws InterruptedException {  		boolean	can_cancel = true; +		++in_reply; +  		if (SwingUtilities.isEventDispatchThread()) {  			can_cancel = false;  			System.out.printf("Uh-oh, reading serial device from swing thread\n");  		}  		flush_output();  		if (remote && can_cancel) { -			timeout = 300; +			timeout = 500;  		}  		abort = false;  		timeout_started = false; @@ -226,10 +235,13 @@ public class AltosSerial implements Runnable {  			AltosLine line = reply_queue.poll(timeout, TimeUnit.MILLISECONDS);  			if (line != null) {  				stop_timeout_dialog(); +				--in_reply;  				return line.line;  			} -			if (!remote || !can_cancel || check_timeout()) +			if (!remote || !can_cancel || check_timeout()) { +				--in_reply;  				return null; +			}  		}  	} @@ -245,6 +257,9 @@ public class AltosSerial implements Runnable {  	}  	public void close() { +		if (in_reply != 0) +			System.out.printf("Uh-oh. Closing active serial device\n"); +  		if (altos != null) {  			libaltos.altos_close(altos);  		} | 
