From a5ac5c37ea385e3a2b2703c6f125b4e3b55e867a Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 2 Jan 2012 22:05:47 -0800 Subject: [PATCH] altosui: Pull most of AltosSerial into AltosLink Share basic command processing across java users Signed-off-by: Keith Packard --- altosui/AltosFontListener.java | 2 +- altosui/AltosSerial.java | 103 ++------ altosui/AltosUIPreferences.java | 4 +- altosui/Makefile.am | 4 +- .../org/altusmetrum/AltosLib/AltosLink.java | 219 +++++++++++++++++- 5 files changed, 233 insertions(+), 99 deletions(-) diff --git a/altosui/AltosFontListener.java b/altosui/AltosFontListener.java index 6fc214bc..0dda0f29 100644 --- a/altosui/AltosFontListener.java +++ b/altosui/AltosFontListener.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.AltosLib; +package altosui; public interface AltosFontListener { void font_size_changed(int font_size); diff --git a/altosui/AltosSerial.java b/altosui/AltosSerial.java index 161f0e90..cc384586 100644 --- a/altosui/AltosSerial.java +++ b/altosui/AltosSerial.java @@ -41,33 +41,22 @@ import libaltosJNI.*; * threads. */ -public class AltosSerial implements Runnable, AltosLink { +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; - double frequency; - public static boolean debug; - boolean remote; - LinkedList pending_output = new LinkedList(); Frame frame; - AltosConfigData config_data; - - 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 (;;) { @@ -75,11 +64,8 @@ public class AltosSerial implements Runnable, AltosLink { 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) @@ -89,25 +75,8 @@ public class AltosSerial implements Runnable, AltosLink { 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("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)); - } - } else { - reply_queue.put(new AltosLine (line)); - } + add_bytes(line_bytes, line_count); line_count = 0; - line = ""; } } else { if (line_bytes == null) { @@ -127,10 +96,8 @@ public class AltosSerial implements Runnable, AltosLink { } 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); } } @@ -189,22 +156,10 @@ public class AltosSerial implements Runnable, AltosLink { } public void flush_input() throws InterruptedException { - flush_output(); - boolean got_some; - - int timeout = 100; if (remote) - timeout = 500; - do { - Thread.sleep(timeout); - 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); } int in_reply; @@ -245,29 +200,6 @@ public class AltosSerial implements Runnable, AltosLink { return reply; } - public String get_reply() throws InterruptedException { - return get_reply(5000); - } - - 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 line.line; - return null; - } - - public void add_monitor(LinkedBlockingQueue q) { - set_monitor(true); - monitors.add(q); - } - - public void remove_monitor(LinkedBlockingQueue q) { - monitors.remove(q); - if (monitors.isEmpty()) - set_monitor(false); - } - public void close() { if (remote) { try { @@ -306,16 +238,10 @@ public class AltosSerial implements Runnable, AltosLink { } 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())) @@ -338,6 +264,7 @@ public class AltosSerial implements Runnable, AltosLink { flush_output(); } +<<<<<<< HEAD private int telemetry_len() { return Altos.telemetry_len(telemetry); } @@ -459,18 +386,16 @@ public class AltosSerial implements Runnable, AltosLink { remote = false; } +======= +>>>>>>> bc5e669... altosui: Pull most of AltosSerial into AltosLink 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_standard; - monitors = new LinkedList> (); - reply_queue = new LinkedBlockingQueue (); + serial = device.getSerial(); open(); } } diff --git a/altosui/AltosUIPreferences.java b/altosui/AltosUIPreferences.java index 38af734e..10ab26c3 100644 --- a/altosui/AltosUIPreferences.java +++ b/altosui/AltosUIPreferences.java @@ -58,7 +58,7 @@ public class AltosUIPreferences extends AltosPreferences { ui_listeners = new LinkedList(); serial_debug = preferences.getBoolean(serialDebugPreference, false); - AltosSerial.set_debug(serial_debug); + AltosLink.set_debug(serial_debug); } static { init(); } @@ -162,7 +162,7 @@ public class AltosUIPreferences extends AltosPreferences { } public static void set_serial_debug(boolean new_serial_debug) { serial_debug = new_serial_debug; - AltosSerial.set_debug(serial_debug); + AltosLink.set_debug(serial_debug); synchronized (preferences) { preferences.putBoolean(serialDebugPreference, serial_debug); flush_preferences(); diff --git a/altosui/Makefile.am b/altosui/Makefile.am index f8a886ba..913a8df1 100644 --- a/altosui/Makefile.am +++ b/altosui/Makefile.am @@ -247,11 +247,11 @@ $(FATJAR): classaltosui.stamp Manifest-fat.txt $(ALTOSLIB_CLASS) $(FREETTS_CLASS Manifest.txt: Makefile echo 'Main-Class: altosui.AltosUI' > $@ - echo "Class-Path: altoslib.jar $(FREETTS)/freetts.jar $(JFREECHART)/jfreechart.jar $(JCOMMON)/jcommon.jar" >> $@ + echo "Class-Path: AltosLib.jar $(FREETTS)/freetts.jar $(JFREECHART)/jfreechart.jar $(JCOMMON)/jcommon.jar" >> $@ Manifest-fat.txt: echo 'Main-Class: altosui.AltosUI' > $@ - echo "Class-Path: altoslib.jar freetts.jar jfreechart.jar jcommon.jar" >> $@ + echo "Class-Path: AltosLib.jar freetts.jar jfreechart.jar jcommon.jar" >> $@ altosui: Makefile echo "#!/bin/sh" > $@ diff --git a/altosui/altoslib/src/org/altusmetrum/AltosLib/AltosLink.java b/altosui/altoslib/src/org/altusmetrum/AltosLib/AltosLink.java index 9a23b306..49585975 100644 --- a/altosui/altoslib/src/org/altusmetrum/AltosLib/AltosLink.java +++ b/altosui/altoslib/src/org/altusmetrum/AltosLib/AltosLink.java @@ -17,12 +17,221 @@ package org.altusmetrum.AltosLib; -public interface AltosLink { - public void printf(String format, Object ... arguments) throws InterruptedException; +import java.lang.*; +import java.io.*; +import java.util.concurrent.*; +import java.util.*; +import java.text.*; - public String get_reply() throws InterruptedException; +public abstract class AltosLink { - public String get_reply(int timeout) throws InterruptedException; + public static boolean debug = false; + public static void set_debug(boolean in_debug) { debug = in_debug; } + LinkedList pending_output = new LinkedList(); - public void flush_input() throws InterruptedException; + public LinkedList> monitors = new LinkedList> ();; + public LinkedBlockingQueue reply_queue = new LinkedBlockingQueue(); + + public void add_monitor(LinkedBlockingQueue q) { + set_monitor(true); + monitors.add(q); + } + + public void remove_monitor(LinkedBlockingQueue q) { + monitors.remove(q); + if (monitors.isEmpty()) + set_monitor(false); + } + + public abstract void print(String data); + + public void printf(String format, Object ... arguments) { + String line = String.format(format, arguments); + if (debug) + pending_output.add(line); + print(line); + } + + 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 line.line; + return null; + } + + public String get_reply(int timeout) throws InterruptedException { + try { + return get_reply_no_dialog(timeout); + } catch (TimeoutException te) { + return null; + } + } + + public String get_reply() throws InterruptedException { + return get_reply(5000); + } + + public void add_telem(AltosLine line) throws InterruptedException { + for (int e = 0; e < monitors.size(); e++) { + LinkedBlockingQueue q = monitors.get(e); + q.put(line); + } + } + + public void add_reply(AltosLine line) throws InterruptedException { + reply_queue.put (line); + } + + public void add_string(String line) throws InterruptedException { + if (line.startsWith("TELEM") || line.startsWith("VERSION") || line.startsWith("CRC")) { + add_telem(new AltosLine(line)); + } else { + add_reply(new AltosLine(line)); + } + } + + public void add_bytes(byte[] bytes, int len) throws InterruptedException { + String line; + try { + line = new String(bytes, 0, len, "UTF-8"); + } catch (UnsupportedEncodingException ue) { + line = ""; + for (int i = 0; i < len; i++) + line = line + bytes[i]; + } + if (debug) + System.out.printf("\t\t\t\t\t%s\n", line); + add_string(line); + } + + public void flush_output() { + for (String s : pending_output) + System.out.print(s); + pending_output.clear(); + } + + public void flush_input(int timeout) throws InterruptedException { + flush_output(); + boolean got_some; + + do { + Thread.sleep(timeout); + got_some = !reply_queue.isEmpty(); + reply_queue.clear(); + } while (got_some); + } + + + public void flush_input() throws InterruptedException { + flush_input(100); + } + + + /* + * Various command-level operations on + * the link + */ + public boolean monitor_mode = false; + public int telemetry = AltosLib.ao_telemetry_standard; + public double frequency; + AltosConfigData config_data; + + private int telemetry_len() { + return AltosLib.telemetry_len(telemetry); + } + + public void set_telemetry(int in_telemetry) { + telemetry = in_telemetry; + if (monitor_mode) + printf("m 0\nm %x\n", telemetry_len()); + flush_output(); + } + + public void set_monitor(boolean monitor) { + monitor_mode = monitor; + if (monitor) + printf("m %x\n", telemetry_len()); + else + printf("m 0\n"); + flush_output(); + } + + private void set_channel(int channel) { + if (monitor_mode) + printf("m 0\nc r %d\nm %x\n", + channel, telemetry_len()); + else + printf("c r %d\n", channel); + flush_output(); + } + + private void set_radio_setting(int setting) { + if (monitor_mode) + printf("m 0\nc R %d\nm %x\n", + setting, telemetry_len()); + else + printf("c R %d\n", setting); + flush_output(); + } + + public void set_radio_frequency(double frequency, + boolean has_setting, + int cal) { + if (debug) + System.out.printf("set_radio_frequency %7.3f %b %d\n", frequency, has_setting, cal); + if (has_setting) + set_radio_setting(AltosConvert.radio_frequency_to_setting(frequency, cal)); + else + set_channel(AltosConvert.radio_frequency_to_channel(frequency)); + } + + public AltosConfigData config_data() throws InterruptedException, TimeoutException { + if (config_data == null) + config_data = new AltosConfigData(this); + return config_data; + } + + public void set_radio_frequency(double in_frequency) throws InterruptedException, TimeoutException { + frequency = in_frequency; + config_data(); + set_radio_frequency(frequency, + config_data.radio_setting != 0, + config_data.radio_calibration); + } + + public void set_callsign(String callsign) { + printf ("c c %s\n", callsign); + flush_output(); + } + + public boolean remote; + public int serial; + + public void start_remote() throws TimeoutException, InterruptedException { + if (debug) + System.out.printf("start remote %7.3f\n", frequency); + if (frequency == 0.0) + frequency = AltosPreferences.frequency(serial); + set_radio_frequency(frequency); + set_callsign(AltosPreferences.callsign()); + printf("p\nE 0\n"); + flush_input(); + remote = true; + } + + public void stop_remote() throws InterruptedException { + if (debug) + System.out.printf("stop remote\n"); + try { + flush_input(); + } finally { + printf ("~\n"); + flush_output(); + } + remote = false; + } + + public AltosLink() { + } } -- 2.30.2