altosui: Clean up packet link connecting dialog
authorKeith Packard <keithp@keithp.com>
Tue, 29 Mar 2011 06:35:05 +0000 (23:35 -0700)
committerKeith Packard <keithp@keithp.com>
Tue, 29 Mar 2011 06:35:05 +0000 (23:35 -0700)
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>
altosui/AltosSerial.java

index 57e1344860686d1684583e183f14b7c4eeeb041f..111bd77170fc5514107c4ef75f0ca050a84c4a9a 100644 (file)
@@ -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);
                }