X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=altosui%2FAltosSerial.java;h=8b60dd547e3f0f4bc3a3c4d267a5e86df84fbbff;hb=7be98836e69a222b2f9f4baacddcf12d168e2207;hp=88b38bb176f01ad00db321de36fb698d2c14019c;hpb=97517ee585462c2d355f23f999fb8d9ebd908ec1;p=fw%2Faltos diff --git a/altosui/AltosSerial.java b/altosui/AltosSerial.java index 88b38bb1..8b60dd54 100644 --- a/altosui/AltosSerial.java +++ b/altosui/AltosSerial.java @@ -25,11 +25,13 @@ 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 org.altusmetrum.AltosLib.*; import libaltosJNI.*; @@ -39,32 +41,22 @@ import libaltosJNI.*; * threads. */ -public class AltosSerial implements Runnable { +public class AltosSerial extends AltosLink implements Runnable { static java.util.List devices_opened = Collections.synchronizedList(new LinkedList()); AltosDevice device; SWIGTYPE_p_altos_file altos; - LinkedList> monitors; - LinkedBlockingQueue reply_queue; Thread input_thread; String line; byte[] line_bytes; int line_count; - boolean monitor_mode; - int telemetry; - int channel; - static boolean debug; - boolean remote; - LinkedList pending_output = new LinkedList(); Frame frame; - static void set_debug(boolean new_debug) { - debug = new_debug; - } - public void run () { int c; + byte[] line_bytes = null; + int line_count = 0; try { for (;;) { @@ -72,11 +64,8 @@ public class AltosSerial implements Runnable { if (Thread.interrupted()) break; if (c == libaltosConstants.LIBALTOS_ERROR) { - for (int e = 0; e < monitors.size(); e++) { - LinkedBlockingQueue q = monitors.get(e); - q.put(new AltosLine()); - } - reply_queue.put (new AltosLine()); + add_telem (new AltosLine()); + add_reply (new AltosLine()); break; } if (c == libaltosConstants.LIBALTOS_TIMEOUT) @@ -86,25 +75,8 @@ public class AltosSerial implements Runnable { synchronized(this) { if (c == '\n') { if (line_count != 0) { - try { - line = new String(line_bytes, 0, line_count, "UTF-8"); - } catch (UnsupportedEncodingException ue) { - line = ""; - 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 q = monitors.get(e); - q.put(new AltosLine (line)); - } - } else { - reply_queue.put(new AltosLine (line)); - } + add_bytes(line_bytes, line_count); line_count = 0; - line = ""; } } else { if (line_bytes == null) { @@ -124,10 +96,8 @@ public class AltosSerial implements Runnable { } public void flush_output() { + super.flush_output(); if (altos != null) { - for (String s : pending_output) - System.out.print(s); - pending_output.clear(); libaltos.altos_flush(altos); } } @@ -137,22 +107,23 @@ 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(); - pane.setMessage(String.format("Connecting to %s", device.getPath())); + pane.setMessage(String.format("Connecting to %s, %7.3f MHz", device.toShortString(), frequency)); pane.setOptions(options); pane.setInitialValue(null); @@ -165,15 +136,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(); @@ -185,65 +155,61 @@ public class AltosSerial implements Runnable { return abort; } - public void flush_input() { - flush_output(); - boolean got_some; - - int timeout = 100; + public void flush_input() throws InterruptedException { if (remote) - timeout = 300; - do { - try { - Thread.sleep(timeout); - } catch (InterruptedException ie) { - } - got_some = !reply_queue.isEmpty(); - synchronized(this) { - if (!"VERSION".startsWith(line) && - !line.startsWith("VERSION")) - line = ""; - reply_queue.clear(); - } - } while (got_some); + flush_input(500); + else + flush_input(100); } - public String get_reply() throws InterruptedException { - flush_output(); - AltosLine line = reply_queue.take(); - return line.line; - } + int in_reply; public String get_reply(int timeout) throws InterruptedException { - flush_output(); - if (remote) { - timeout = 300; - System.out.printf("Doing remote timout\n"); - } - abort = false; - timeout_started = false; - for (;;) { - AltosLine line = reply_queue.poll(timeout, TimeUnit.MILLISECONDS); - if (line != null) { - stop_timeout_dialog(); - return line.line; - } - if (!remote || check_timeout()) - return null; - } - } + boolean can_cancel = true; + String reply = null; - public void add_monitor(LinkedBlockingQueue q) { - set_monitor(true); - monitors.add(q); - } + try { + ++in_reply; - public void remove_monitor(LinkedBlockingQueue q) { - monitors.remove(q); - if (monitors.isEmpty()) - set_monitor(false); + if (SwingUtilities.isEventDispatchThread()) { + can_cancel = false; + if (remote) + System.out.printf("Uh-oh, reading remote serial device from swing thread\n"); + } + flush_output(); + if (remote && can_cancel) { + timeout = 500; + } + abort = false; + timeout_started = false; + for (;;) { + AltosLine line = reply_queue.poll(timeout, TimeUnit.MILLISECONDS); + if (line != null) { + stop_timeout_dialog(); + reply = line.line; + break; + } + if (!remote || !can_cancel || check_timeout()) { + reply = null; + break; + } + } + } finally { + --in_reply; + } + return reply; } public void close() { + if (remote) { + try { + stop_remote(); + } catch (InterruptedException ie) { + } + } + if (in_reply != 0) + System.out.printf("Uh-oh. Closing active serial device\n"); + if (altos != null) { libaltos.altos_close(altos); } @@ -272,26 +238,22 @@ public class AltosSerial implements Runnable { } public void print(String data) { - if (debug) - pending_output.add(data); for (int i = 0; i < data.length(); i++) putc(data.charAt(i)); } - public void printf(String format, Object ... arguments) { - print(String.format(format, arguments)); - } - private void open() throws FileNotFoundException, AltosSerialInUseException { synchronized (devices_opened) { if (devices_opened.contains(device.getPath())) throw new AltosSerialInUseException(device); devices_opened.add(device.getPath()); } - altos = libaltos.altos_open(device); + altos = device.open(); if (altos == null) { + final String message = device.getErrorString(); close(); - throw new FileNotFoundException(device.toShortString()); + throw new FileNotFoundException(String.format("%s (%s)", + device.toShortString(), message)); } if (debug) System.out.printf("Open %s\n", device.getPath()); @@ -302,85 +264,15 @@ public class AltosSerial implements Runnable { flush_output(); } - public void set_radio() { - telemetry = AltosPreferences.telemetry(device.getSerial()); - channel = AltosPreferences.channel(device.getSerial()); - set_channel(channel); - set_callsign(AltosPreferences.callsign()); - } - - 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); - else - printf("c r %d\n", channel); - flush_output(); - } - } - - public void set_telemetry(int in_telemetry) { - telemetry = in_telemetry; - if (altos != null) { - if (monitor_mode) - printf("m 0\nm %d\n", telemetry); - flush_output(); - } - } - - void set_monitor(boolean monitor) { - monitor_mode = monitor; - if (altos != null) { - if (monitor) - printf("m %d\n", telemetry); - else - printf("m 0\n"); - flush_output(); - } - } - - public void set_callsign(String callsign) { - if (altos != null) { - printf ("c c %s\n", callsign); - flush_output(); - } - } - - 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"); - try { - flush_input(); - } finally { - System.out.printf("Sending tilde\n"); - 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; frame = null; - telemetry = Altos.ao_telemetry_full; - monitors = new LinkedList> (); - reply_queue = new LinkedBlockingQueue (); + serial = device.getSerial(); + name = device.toShortString(); open(); } }