diff options
Diffstat (limited to 'ao-tools/altosui/AltosSerial.java')
| -rw-r--r-- | ao-tools/altosui/AltosSerial.java | 149 | 
1 files changed, 149 insertions, 0 deletions
diff --git a/ao-tools/altosui/AltosSerial.java b/ao-tools/altosui/AltosSerial.java new file mode 100644 index 00000000..82663eab --- /dev/null +++ b/ao-tools/altosui/AltosSerial.java @@ -0,0 +1,149 @@ +/* + * Copyright © 2010 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +/* + * Deal with TeleDongle on a serial port + */ + +package altosui; + +import java.lang.String; +import java.lang.System; +import java.lang.Character; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.FileNotFoundException; +import java.util.concurrent.LinkedBlockingQueue; +import java.lang.InterruptedException; +import java.util.LinkedList; +import altosui.AltosSerialMonitor; +import java.util.Iterator; + +/* + * This class reads from the serial port and places each received + * line in a queue. Dealing with that queue is left up to other + * threads. + */ +class AltosSerialReader implements Runnable { +	FileInputStream	serial_in; +	LinkedBlockingQueue<String> monitor_queue; +	LinkedBlockingQueue<String> reply_queue; +	String line; + +	public void run () { +		int c; + +		try { +			while ((c = serial_in.read()) != -1) { +				if (c == '\r') +					continue; +				synchronized(this) { +					if (c == '\n') { +						if (line != "") { +							if (line.startsWith("VERSION")) +								monitor_queue.put(line); +							else +								reply_queue.put(line); +							line = ""; +						} +					} else { +						line = line + (char) c; +					} +				} +			} +		} catch (IOException e) { +		} catch (InterruptedException e) { +		} +	} + +	public String get_telem() { +		try { +			return monitor_queue.take(); +		} catch (InterruptedException e) { +			return ""; +		} +	} + +	public String get_reply() { +		try { +			return reply_queue.take(); +		} catch (InterruptedException e) { +			return ""; +		} +	} + +	public void flush () { +		synchronized(this) { +			if (!"VERSION".startsWith(line) && !line.startsWith("VERSION")) +				line = ""; +			reply_queue.clear(); +		} +	} +	public AltosSerialReader (FileInputStream in) { +		serial_in = in; +		monitor_queue = new LinkedBlockingQueue<String> (); +		reply_queue = new LinkedBlockingQueue<String> (); +		line = ""; +	} + +} + +public class AltosSerial implements Runnable { +	FileInputStream	serial_in = null; +	FileOutputStream serial_out = null; +	AltosSerialReader reader; +	LinkedList<AltosSerialMonitor> callbacks; + +	public void run() { +		for (;;) { +			String s = reader.get_reply(); +			synchronized(callbacks) { +				Iterator<AltosSerialMonitor> i = callbacks.iterator(); +				while (i.hasNext()) { +					i.next().data(s); +				} +			} +		} +	} + +	public void start () { +		try { +			serial_out.write('?'); +			serial_out.write('\r'); +		} catch (IOException e) { +		} +		(new Thread(reader)).start(); +		(new Thread(this)).start(); +	} + +	public void monitor(AltosSerialMonitor monitor) { +		synchronized(callbacks) { +			callbacks.add(monitor); +		} +	} + +	public AltosSerial(String serial_name) { +		try { +			serial_in = new FileInputStream(serial_name); +			serial_out = new FileOutputStream(serial_name); +			reader = new AltosSerialReader(serial_in); +			callbacks = new LinkedList<AltosSerialMonitor>(); +		} catch (FileNotFoundException e) { +		} +	} +}  | 
