diff options
| author | Keith Packard <keithp@keithp.com> | 2012-01-02 22:05:47 -0800 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2012-06-02 19:33:35 -0700 | 
| commit | a5ac5c37ea385e3a2b2703c6f125b4e3b55e867a (patch) | |
| tree | 93683378e2aa77b800cdabb1efe9e0bc3dd5a112 | |
| parent | 18914b9a84bbd8c4364a1568bb07dcc2b04ad7ba (diff) | |
altosui: Pull most of AltosSerial into AltosLink
Share basic command processing across java users
Signed-off-by: Keith Packard <keithp@keithp.com>
| -rw-r--r-- | altosui/AltosFontListener.java | 2 | ||||
| -rw-r--r-- | altosui/AltosSerial.java | 103 | ||||
| -rw-r--r-- | altosui/AltosUIPreferences.java | 4 | ||||
| -rw-r--r-- | altosui/Makefile.am | 4 | ||||
| -rw-r--r-- | altosui/altoslib/src/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<String> devices_opened = Collections.synchronizedList(new LinkedList<String>());  	AltosDevice device;  	SWIGTYPE_p_altos_file altos; -	LinkedList<LinkedBlockingQueue<AltosLine>> monitors; -	LinkedBlockingQueue<AltosLine> 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<String> pending_output = new LinkedList<String>();  	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<AltosLine> 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<AltosLine> 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<AltosLine> q) { -		set_monitor(true); -		monitors.add(q); -	} - -	public void remove_monitor(LinkedBlockingQueue<AltosLine> 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<LinkedBlockingQueue<AltosLine>> (); -		reply_queue = new LinkedBlockingQueue<AltosLine> (); +		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<AltosUIListener>();  		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<String> pending_output = new LinkedList<String>(); -	public void flush_input() throws InterruptedException; +	public LinkedList<LinkedBlockingQueue<AltosLine>> monitors = new LinkedList<LinkedBlockingQueue<AltosLine>> ();; +	public LinkedBlockingQueue<AltosLine> reply_queue = new LinkedBlockingQueue<AltosLine>(); + +	public void add_monitor(LinkedBlockingQueue<AltosLine> q) { +		set_monitor(true); +		monitors.add(q); +	} + +	public void remove_monitor(LinkedBlockingQueue<AltosLine> 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<AltosLine> 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() { +	}  } | 
