altosui: provide separate flush_input/flush_output for serial. deal with monitor...
authorKeith Packard <keithp@keithp.com>
Mon, 30 Aug 2010 04:36:47 +0000 (21:36 -0700)
committerKeith Packard <keithp@keithp.com>
Mon, 30 Aug 2010 04:36:47 +0000 (21:36 -0700)
(yes, this should be two patches, but the diffs in AltosSerial were merged together).

First, this replaces the existing flush/flush_reply mess with two simple functions,
one to flush output to the serial device, making sure that all data written will be seen
while we wait for input. The other sucks any pending input off of the serial line and
discards it.

Second, AltosSerial now tracks whether the serial line is being used for telemetry
monitoring. If so, it enables monitoring, otherwise it disables it. Eliminates a
bunch of manual state tracking elsewhere.

Signed-off-by: Keith Packard <keithp@keithp.com>
ao-tools/altosui/AltosConfig.java
ao-tools/altosui/AltosDebug.java
ao-tools/altosui/AltosEepromDownload.java
ao-tools/altosui/AltosSerial.java

index ac73e7c5ea88894daf6a5817e466f860a4f6b9d3..3d970748102abcd2b700cf9a80dc22b6f23142e5 100644 (file)
@@ -122,17 +122,17 @@ public class AltosConfig implements Runnable, ActionListener {
 
        void start_serial() throws InterruptedException {
                if (remote) {
 
        void start_serial() throws InterruptedException {
                if (remote) {
-                       serial_line.printf("m 0\n");
                        serial_line.set_channel(AltosPreferences.channel());
                        serial_line.set_callsign(AltosPreferences.callsign());
                        serial_line.printf("p\n");
                        serial_line.set_channel(AltosPreferences.channel());
                        serial_line.set_callsign(AltosPreferences.callsign());
                        serial_line.printf("p\n");
+                       serial_line.flush_input();
                }
        }
 
        void stop_serial() throws InterruptedException {
                if (remote) {
                }
        }
 
        void stop_serial() throws InterruptedException {
                if (remote) {
-                       serial_line.printf("~\n");
-                       serial_line.flush();
+                       serial_line.printf("~");
+                       serial_line.flush_output();
                }
        }
 
                }
        }
 
index ca2e5a9046625465130c0f4dd1ec55f9c10cba48..3f469d48214dfc4ec9a999c425631ea55ba8d0b0 100644 (file)
@@ -62,8 +62,8 @@ public class AltosDebug extends AltosSerial {
 
        void ensure_debug_mode() {
                if (!debug_mode) {
 
        void ensure_debug_mode() {
                if (!debug_mode) {
-                       printf("m 0\nD\n");
-                       flush_reply();
+                       printf("D\n");
+                       flush_input();
                        debug_mode = true;
                }
        }
                        debug_mode = true;
                }
        }
@@ -103,7 +103,7 @@ public class AltosDebug extends AltosSerial {
                throws IOException, InterruptedException {
                byte[]  data = new byte[length];
 
                throws IOException, InterruptedException {
                byte[]  data = new byte[length];
 
-               flush_reply();
+               flush_input();
                ensure_debug_mode();
                printf("I %x %x\n", length, address);
                int i = 0;
                ensure_debug_mode();
                printf("I %x %x\n", length, address);
                int i = 0;
@@ -155,7 +155,7 @@ public class AltosDebug extends AltosSerial {
        public byte[] read_bytes(int length)
                throws IOException, InterruptedException {
 
        public byte[] read_bytes(int length)
                throws IOException, InterruptedException {
 
-               flush_reply();
+               flush_input();
                ensure_debug_mode();
                printf("G %x\n", length);
                int i = 0;
                ensure_debug_mode();
                printf("G %x\n", length);
                int i = 0;
index 02a71118c331e72c0af2fb4d6d76d6b043defe49..5e43345b6197b845262deb994cc435ffd6812d23 100644 (file)
@@ -223,10 +223,10 @@ public class AltosEepromDownload implements Runnable {
 
        public void run () {
                if (remote) {
 
        public void run () {
                if (remote) {
-                       serial_line.printf("m 0\n");
                        serial_line.set_channel(AltosPreferences.channel());
                        serial_line.set_callsign(AltosPreferences.callsign());
                        serial_line.set_channel(AltosPreferences.channel());
                        serial_line.set_callsign(AltosPreferences.callsign());
-                       serial_line.printf("p\n");
+                       serial_line.printf("p\nE 0\n");
+                       serial_line.flush_input();
                }
 
                monitor = new AltosEepromMonitor(frame, Altos.ao_flight_boost, Altos.ao_flight_landed);
                }
 
                monitor = new AltosEepromMonitor(frame, Altos.ao_flight_boost, Altos.ao_flight_landed);
@@ -247,6 +247,7 @@ public class AltosEepromDownload implements Runnable {
                if (remote)
                        serial_line.printf("~");
                monitor.done();
                if (remote)
                        serial_line.printf("~");
                monitor.done();
+               serial_line.flush_output();
                serial_line.close();
        }
 
                serial_line.close();
        }
 
index 5b47960f79a28f8d7e4bd92977147b6eaad30587..99ba3324e623fbd3d3fe3c82c0323b6b3587c9f3 100644 (file)
@@ -47,6 +47,7 @@ public class AltosSerial implements Runnable {
        String line;
        byte[] line_bytes;
        int line_count;
        String line;
        byte[] line_bytes;
        int line_count;
+       boolean monitor_mode;
 
        public void run () {
                int c;
 
        public void run () {
                int c;
@@ -99,35 +100,39 @@ public class AltosSerial implements Runnable {
                }
        }
 
                }
        }
 
-       public void flush_reply() {
+       public void flush_output() {
                libaltos.altos_flush(altos);
                libaltos.altos_flush(altos);
+       }
+
+       public void flush_input() {
+               flush_output();
                try {
                try {
-                       Thread.sleep(100);
+                       Thread.sleep(200);
                } catch (InterruptedException ie) {
                }
                } catch (InterruptedException ie) {
                }
-               reply_queue.clear();
+               synchronized(this) {
+                       if (!"VERSION".startsWith(line) &&
+                           !line.startsWith("VERSION"))
+                               line = "";
+                       reply_queue.clear();
+               }
        }
 
        public String get_reply() throws InterruptedException {
        }
 
        public String get_reply() throws InterruptedException {
-               libaltos.altos_flush(altos);
+               flush_output();
                String line = reply_queue.take();
                return line;
        }
 
        public void add_monitor(LinkedBlockingQueue<String> q) {
                String line = reply_queue.take();
                return line;
        }
 
        public void add_monitor(LinkedBlockingQueue<String> q) {
+               set_monitor(true);
                monitors.add(q);
        }
 
        public void remove_monitor(LinkedBlockingQueue<String> q) {
                monitors.remove(q);
                monitors.add(q);
        }
 
        public void remove_monitor(LinkedBlockingQueue<String> q) {
                monitors.remove(q);
-       }
-
-       public void flush () {
-               synchronized(this) {
-                       if (!"VERSION".startsWith(line) && !line.startsWith("VERSION"))
-                               line = "";
-                       reply_queue.clear();
-               }
+               if (monitors.isEmpty())
+                       set_monitor(false);
        }
 
        public boolean opened() {
        }
 
        public boolean opened() {
@@ -135,8 +140,9 @@ public class AltosSerial implements Runnable {
        }
 
        public void close() {
        }
 
        public void close() {
-               if (altos != null)
+               if (altos != null) {
                        libaltos.altos_close(altos);
                        libaltos.altos_close(altos);
+               }
                if (input_thread != null) {
                        try {
                                input_thread.interrupt();
                if (input_thread != null) {
                        try {
                                input_thread.interrupt();
@@ -157,7 +163,7 @@ public class AltosSerial implements Runnable {
        }
 
        public void print(String data) {
        }
 
        public void print(String data) {
-//h            System.out.printf("\"%s\" ", data);
+//             System.out.printf("\"%s\" ", data);
                for (int i = 0; i < data.length(); i++)
                        putc(data.charAt(i));
        }
                for (int i = 0; i < data.length(); i++)
                        putc(data.charAt(i));
        }
@@ -173,17 +179,28 @@ public class AltosSerial implements Runnable {
                        throw new FileNotFoundException(device.getPath());
                input_thread = new Thread(this);
                input_thread.start();
                        throw new FileNotFoundException(device.getPath());
                input_thread = new Thread(this);
                input_thread.start();
-               print("\nE 0\n");
-               try {
-                       Thread.sleep(200);
-               } catch (InterruptedException e) {
-               }
-               flush();
+               print("~\nE 0\n");
+               set_monitor(monitor_mode);
+               flush_input();
        }
 
        public void set_channel(int channel) {
        }
 
        public void set_channel(int channel) {
-               if (altos != null)
-                       printf("m 0\nc r %d\nm 1\n", channel);
+               if (altos != null) {
+                       if (monitor_mode)
+                               printf("m 0\nc r %d\nm 1\n", channel);
+                       else
+                               printf("c r %d\n", channel);
+               }
+       }
+
+       void set_monitor(boolean monitor) {
+               monitor_mode = monitor;
+               if (altos != null) {
+                       if (monitor)
+                               printf("m 1\n");
+                       else
+                               printf("m 0\n");
+               }
        }
 
        public void set_callsign(String callsign) {
        }
 
        public void set_callsign(String callsign) {
@@ -195,6 +212,7 @@ public class AltosSerial implements Runnable {
                altos = null;
                input_thread = null;
                line = "";
                altos = null;
                input_thread = null;
                line = "";
+               monitor_mode = false;
                monitors = new LinkedList<LinkedBlockingQueue<String>> ();
                reply_queue = new LinkedBlockingQueue<String> ();
        }
                monitors = new LinkedList<LinkedBlockingQueue<String>> ();
                reply_queue = new LinkedBlockingQueue<String> ();
        }