altosui: Make sure packet mode is turned off when the connection fails
[fw/altos] / ao-tools / altosui / AltosSerial.java
index 0d32a5ae851807e0940a634acf7ccfef335030cd..b19143e58b7080070457d606a93e8798deaf9a71 100644 (file)
@@ -38,7 +38,7 @@ public class AltosSerial implements Runnable {
 
        static List<String> devices_opened = Collections.synchronizedList(new LinkedList<String>());
 
-       altos_device device;
+       AltosDevice device;
        SWIGTYPE_p_altos_file altos;
        LinkedList<LinkedBlockingQueue<AltosLine>> monitors;
        LinkedBlockingQueue<AltosLine> reply_queue;
@@ -114,16 +114,20 @@ public class AltosSerial implements Runnable {
 
        public void flush_input() {
                flush_output();
-               try {
-                       Thread.sleep(200);
-               } catch (InterruptedException ie) {
-               }
-               synchronized(this) {
-                       if (!"VERSION".startsWith(line) &&
-                           !line.startsWith("VERSION"))
-                               line = "";
-                       reply_queue.clear();
-               }
+               boolean got_some;
+               do {
+                       try {
+                               Thread.sleep(100);
+                       } catch (InterruptedException ie) {
+                       }
+                       got_some = !reply_queue.isEmpty();
+                       synchronized(this) {
+                               if (!"VERSION".startsWith(line) &&
+                                   !line.startsWith("VERSION"))
+                                       line = "";
+                               reply_queue.clear();
+                       }
+               } while (got_some);
        }
 
        public String get_reply() throws InterruptedException {
@@ -194,13 +198,18 @@ public class AltosSerial implements Runnable {
                        devices_opened.add(device.getPath());
                }
                altos = libaltos.altos_open(device);
-               if (altos == null)
-                       throw new FileNotFoundException(device.toString());
+               if (altos == null) {
+                       close();
+                       throw new FileNotFoundException(device.toShortString());
+               }
                input_thread = new Thread(this);
                input_thread.start();
                print("~\nE 0\n");
+               set_monitor(false);
                flush_output();
-               set_monitor(monitor_mode);
+       }
+
+       public void set_radio() {
                set_channel(AltosPreferences.channel(device.getSerial()));
                set_callsign(AltosPreferences.callsign());
        }
@@ -233,7 +242,7 @@ public class AltosSerial implements Runnable {
                }
        }
 
-       public AltosSerial(altos_device in_device) throws FileNotFoundException, AltosSerialInUseException {
+       public AltosSerial(AltosDevice in_device) throws FileNotFoundException, AltosSerialInUseException {
                device = in_device;
                line = "";
                monitor_mode = false;