X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=altosui%2FAltosSerial.java;h=8f8f99d7f458088aaa62abf3eb66cff23fb3e7af;hb=7f6cce5749724dbb836aaa27bbeedf977106f6f3;hp=88b38bb176f01ad00db321de36fb698d2c14019c;hpb=97517ee585462c2d355f23f999fb8d9ebd908ec1;p=fw%2Faltos diff --git a/altosui/AltosSerial.java b/altosui/AltosSerial.java index 88b38bb1..8f8f99d7 100644 --- a/altosui/AltosSerial.java +++ b/altosui/AltosSerial.java @@ -25,6 +25,7 @@ import java.lang.*; import java.io.*; import java.util.concurrent.*; import java.util.*; +import java.text.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; @@ -95,7 +96,7 @@ public class AltosSerial implements Runnable { } if (debug) System.out.printf("\t\t\t\t\t%s\n", line); - if (line.startsWith("VERSION") || line.startsWith("CRC")) { + if (line.startsWith("TELEM") || line.startsWith("VERSION") || line.startsWith("CRC")) { for (int e = 0; e < monitors.size(); e++) { LinkedBlockingQueue q = monitors.get(e); q.put(new AltosLine (line)); @@ -137,18 +138,19 @@ public class AltosSerial implements Runnable { boolean timeout_started = false; private void stop_timeout_dialog() { - System.out.printf("stop_timeout_dialog\n"); - 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() { - System.out.printf("Creating timeout dialog\n"); + Object[] options = { "Cancel" }; JOptionPane pane = new JOptionPane(); @@ -165,15 +167,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; - System.out.printf("Starting timeout dialog\n"); - if (SwingUtilities.isEventDispatchThread()) { - start_timeout_dialog_internal(); - } else { + if (!SwingUtilities.isEventDispatchThread()) { + timeout_started = true; Runnable r = new Runnable() { public void run() { start_timeout_dialog_internal(); @@ -191,7 +192,7 @@ public class AltosSerial implements Runnable { int timeout = 100; if (remote) - timeout = 300; + timeout = 500; do { try { Thread.sleep(timeout); @@ -208,16 +209,26 @@ public class AltosSerial implements Runnable { } public String get_reply() throws InterruptedException { + if (SwingUtilities.isEventDispatchThread()) + System.out.printf("Uh-oh, reading serial device from swing thread\n"); flush_output(); AltosLine line = reply_queue.take(); 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) { - timeout = 300; - System.out.printf("Doing remote timout\n"); + if (remote && can_cancel) { + timeout = 500; } abort = false; timeout_started = false; @@ -225,10 +236,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 || check_timeout()) + if (!remote || !can_cancel || check_timeout()) { + --in_reply; return null; + } } } @@ -244,6 +258,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); } @@ -288,7 +305,7 @@ public class AltosSerial implements Runnable { throw new AltosSerialInUseException(device); devices_opened.add(device.getPath()); } - altos = libaltos.altos_open(device); + altos = device.open(); if (altos == null) { close(); throw new FileNotFoundException(device.toShortString()); @@ -309,11 +326,16 @@ public class AltosSerial implements Runnable { set_callsign(AltosPreferences.callsign()); } + private int telemetry_len() { + return Altos.telemetry_len(telemetry); + } + public void set_channel(int in_channel) { channel = in_channel; if (altos != null) { if (monitor_mode) - printf("m 0\nc r %d\nm %d\n", channel, telemetry); + printf("m 0\nc r %d\nm %x\n", + channel, telemetry_len()); else printf("c r %d\n", channel); flush_output(); @@ -324,7 +346,7 @@ public class AltosSerial implements Runnable { telemetry = in_telemetry; if (altos != null) { if (monitor_mode) - printf("m 0\nm %d\n", telemetry); + printf("m 0\nm %x\n", telemetry_len()); flush_output(); } } @@ -333,7 +355,7 @@ public class AltosSerial implements Runnable { monitor_mode = monitor; if (altos != null) { if (monitor) - printf("m %d\n", telemetry); + printf("m %x\n", telemetry_len()); else printf("m 0\n"); flush_output(); @@ -362,7 +384,6 @@ public class AltosSerial implements Runnable { try { flush_input(); } finally { - System.out.printf("Sending tilde\n"); printf ("~\n"); flush_output(); } @@ -378,7 +399,7 @@ public class AltosSerial implements Runnable { line = ""; monitor_mode = false; frame = null; - telemetry = Altos.ao_telemetry_full; + telemetry = Altos.ao_telemetry_standard; monitors = new LinkedList> (); reply_queue = new LinkedBlockingQueue (); open();