Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
[fw/altos] / altosui / AltosSerial.java
index 3ad16b2b955e0d0d7deccb4573d40ff980883d14..f9f9e6e425232436d9e8ce4fe6788496b5dc4cb4 100644 (file)
@@ -48,6 +48,8 @@ public class AltosSerial implements Runnable {
        int line_count;
        boolean monitor_mode;
        static boolean debug;
+       boolean remote;
+       LinkedList<String> pending_output = new LinkedList<String>();
 
        static void set_debug(boolean new_debug) {
                debug = new_debug;
@@ -83,14 +85,14 @@ public class AltosSerial implements Runnable {
                                                                for (int i = 0; i < line_count; i++)
                                                                        line = line + line_bytes[i];
                                                        }
+                                                       if (debug)
+                                                               System.out.printf("\t\t\t\t\t%s\n", line);
                                                        if (line.startsWith("VERSION") || line.startsWith("CRC")) {
                                                                for (int e = 0; e < monitors.size(); e++) {
                                                                        LinkedBlockingQueue<AltosLine> q = monitors.get(e);
                                                                        q.put(new AltosLine (line));
                                                                }
                                                        } else {
-                                                               if (debug)
-                                                                       System.out.printf("\t\t\t\t\t%s\n", line);
                                                                reply_queue.put(new AltosLine (line));
                                                        }
                                                        line_count = 0;
@@ -114,16 +116,24 @@ public class AltosSerial implements Runnable {
        }
 
        public void flush_output() {
-               if (altos != null)
+               if (altos != null) {
+                       for (String s : pending_output)
+                               System.out.print(s);
+                       pending_output.clear();
                        libaltos.altos_flush(altos);
+               }
        }
 
        public void flush_input() {
                flush_output();
                boolean got_some;
+
+               int timeout = 100;
+               if (remote)
+                       timeout = 300;
                do {
                        try {
-                               Thread.sleep(100);
+                               Thread.sleep(timeout);
                        } catch (InterruptedException ie) {
                        }
                        got_some = !reply_queue.isEmpty();
@@ -180,6 +190,8 @@ public class AltosSerial implements Runnable {
                synchronized (devices_opened) {
                        devices_opened.remove(device.getPath());
                }
+               if (debug)
+                       System.out.printf("Closing %s\n", device.getPath());
        }
 
        private void putc(char c) {
@@ -189,7 +201,7 @@ public class AltosSerial implements Runnable {
 
        public void print(String data) {
                if (debug)
-                       System.out.printf("%s", data);
+                       pending_output.add(data);
                for (int i = 0; i < data.length(); i++)
                        putc(data.charAt(i));
        }
@@ -209,6 +221,8 @@ public class AltosSerial implements Runnable {
                        close();
                        throw new FileNotFoundException(device.toShortString());
                }
+               if (debug)
+                       System.out.printf("Open %s\n", device.getPath());
                input_thread = new Thread(this);
                input_thread.start();
                print("~\nE 0\n");
@@ -250,14 +264,21 @@ public class AltosSerial implements Runnable {
        }
 
        public void start_remote() {
+               if (debug)
+                       System.out.printf("start remote\n");
                set_radio();
                printf("p\nE 0\n");
                flush_input();
+               remote = true;
        }
 
        public void stop_remote() {
+               if (debug)
+                       System.out.printf("stop remote\n");
+               flush_input();
                printf ("~");
                flush_output();
+               remote = false;
        }
 
        public AltosSerial(AltosDevice in_device) throws FileNotFoundException, AltosSerialInUseException {