X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=altosui%2FAltosSerial.java;h=cb82a574ed4381d5c87862f2d9de23757dad5afb;hb=11a2bb8e28df7ed87542f2ee726f877971f5d52a;hp=a8ba66bde009acc49f7c1c03d71741e7e7110fd2;hpb=7f5b5848ad6ef5c808638a29c3dc0101b56ed11e;p=fw%2Faltos diff --git a/altosui/AltosSerial.java b/altosui/AltosSerial.java index a8ba66bd..cb82a574 100644 --- a/altosui/AltosSerial.java +++ b/altosui/AltosSerial.java @@ -25,6 +25,12 @@ 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.*; +import javax.swing.filechooser.FileNameExtensionFilter; +import javax.swing.table.*; import libaltosJNI.*; @@ -36,7 +42,7 @@ import libaltosJNI.*; public class AltosSerial implements Runnable { - static List devices_opened = Collections.synchronizedList(new LinkedList()); + static java.util.List devices_opened = Collections.synchronizedList(new LinkedList()); AltosDevice device; SWIGTYPE_p_altos_file altos; @@ -52,6 +58,7 @@ public class AltosSerial implements Runnable { static boolean debug; boolean remote; LinkedList pending_output = new LinkedList(); + Frame frame; static void set_debug(boolean new_debug) { debug = new_debug; @@ -89,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)); @@ -126,13 +133,66 @@ public class AltosSerial implements Runnable { } } + boolean abort; + JDialog timeout_dialog; + boolean timeout_started = false; + + private void stop_timeout_dialog() { + if (timeout_started) { + timeout_started = false; + Runnable r = new Runnable() { + public void run() { + timeout_dialog.setVisible(false); + } + }; + SwingUtilities.invokeLater(r); + } + } + + private void start_timeout_dialog_internal() { + + Object[] options = { "Cancel" }; + + JOptionPane pane = new JOptionPane(); + pane.setMessage(String.format("Connecting to %s", device.getPath())); + pane.setOptions(options); + pane.setInitialValue(null); + + timeout_dialog = pane.createDialog(frame, "Connecting..."); + + timeout_dialog.setVisible(true); + + Object o = pane.getValue(); + if (o == null) + return; + if (options[0].equals(o)) + abort = true; + timeout_dialog.dispose(); + timeout_dialog = null; + } + + private boolean check_timeout() { + if (!timeout_started && frame != null) { + if (!SwingUtilities.isEventDispatchThread()) { + timeout_started = true; + Runnable r = new Runnable() { + public void run() { + start_timeout_dialog_internal(); + } + }; + SwingUtilities.invokeLater(r); + } + } + return abort; + } + public void flush_input() { flush_output(); boolean got_some; int timeout = 100; if (remote) - timeout = 300; + timeout = 500; do { try { Thread.sleep(timeout); @@ -149,17 +209,51 @@ 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 && can_cancel) { + timeout = 500; + } + abort = false; + timeout_started = false; + for (;;) { + System.out.printf("timeout %d\n", timeout); + AltosLine line = reply_queue.poll(timeout, TimeUnit.MILLISECONDS); + if (line != null) { + stop_timeout_dialog(); + --in_reply; + return line.line; + } + System.out.printf("no line remote %b can_cancel %b\n", remote, can_cancel); + if (!remote || !can_cancel || check_timeout()) { + --in_reply; + return null; + } + } + } + + public String get_reply_no_dialog(int timeout) throws InterruptedException, TimeoutException { flush_output(); AltosLine line = reply_queue.poll(timeout, TimeUnit.MILLISECONDS); - if (line == null) - return null; - return line.line; + if (line != null) + return line.line; + return null; } public void add_monitor(LinkedBlockingQueue q) { @@ -174,6 +268,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); } @@ -218,7 +315,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()); @@ -239,11 +336,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(); @@ -254,7 +356,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(); } } @@ -263,7 +365,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(); @@ -289,17 +391,25 @@ public class AltosSerial implements Runnable { public void stop_remote() { if (debug) System.out.printf("stop remote\n"); - flush_input(); - printf ("~"); - flush_output(); + try { + flush_input(); + } finally { + printf ("~\n"); + flush_output(); + } remote = false; } + public void set_frame(Frame in_frame) { + frame = in_frame; + } + public AltosSerial(AltosDevice in_device) throws FileNotFoundException, AltosSerialInUseException { device = in_device; line = ""; monitor_mode = false; - telemetry = Altos.ao_telemetry_full; + frame = null; + telemetry = Altos.ao_telemetry_standard; monitors = new LinkedList> (); reply_queue = new LinkedBlockingQueue (); open();