diff options
Diffstat (limited to 'altosui/AltosSerial.java')
| -rw-r--r-- | altosui/AltosSerial.java | 209 | 
1 files changed, 209 insertions, 0 deletions
| diff --git a/altosui/AltosSerial.java b/altosui/AltosSerial.java new file mode 100644 index 00000000..6cee1609 --- /dev/null +++ b/altosui/AltosSerial.java @@ -0,0 +1,209 @@ +/* + * 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.*; +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.*; + +/* + * 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. + */ + +public class AltosSerial extends AltosLink  { + +	static java.util.List<String> devices_opened = Collections.synchronizedList(new LinkedList<String>()); + +	AltosDevice device; +	SWIGTYPE_p_altos_file altos; +	Thread input_thread; +	String line; +	byte[] line_bytes; +	int line_count; +	Frame frame; + +	public int getchar() { +		if (altos == null) +			return ERROR; +		return libaltos.altos_getchar(altos, 0); +	} + +	public void flush_output() { +		super.flush_output(); +		if (altos != null) { +			if (libaltos.altos_flush(altos) != 0) { +				libaltos.altos_close(altos); +				altos = null; +				abort_reply(); +			} +		} +	} + +	JDialog		timeout_dialog; + +	private void start_timeout_dialog_internal() { + +		Object[] options = { "Cancel" }; + +		JOptionPane	pane = new JOptionPane(); +		pane.setMessage(String.format("Connecting to %s, %7.3f MHz", device.toShortString(), frequency)); +		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)) +			reply_abort = true; +		timeout_dialog.dispose(); +		timeout_dialog = null; +	} + +	/* +	 * These are required by the AltosLink implementation +	 */ + +	public boolean can_cancel_reply() { +		/* +		 * Can cancel any replies not called from the dispatch thread +		 */ +		return !SwingUtilities.isEventDispatchThread(); +	} + +	public boolean show_reply_timeout() { +		if (!SwingUtilities.isEventDispatchThread() && frame != null) { +			Runnable r = new Runnable() { +					public void run() { +						start_timeout_dialog_internal(); +					} +				}; +			SwingUtilities.invokeLater(r); +			return true; +		} +		return false; +	} + +	public void hide_reply_timeout() { +		Runnable r = new Runnable() { +				public void run() { +					timeout_dialog.setVisible(false); +				} +			}; +		SwingUtilities.invokeLater(r); +	} + +	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); +		} +		if (input_thread != null) { +			try { +				input_thread.interrupt(); +				input_thread.join(); +			} catch (InterruptedException e) { +			} +			input_thread = null; +		} +		if (altos != null) { +			libaltos.altos_free(altos); +			altos = null; +		} +		synchronized (devices_opened) { +			devices_opened.remove(device.getPath()); +		} +		if (debug) +			System.out.printf("Closing %s\n", device.getPath()); +	} + +	private void putc(char c) { +		if (altos != null) +			if (libaltos.altos_putchar(altos, c) != 0) { +				libaltos.altos_close(altos); +				altos = null; +				abort_reply(); +			} +	} + +	public void print(String data) { +		for (int i = 0; i < data.length(); i++) +			putc(data.charAt(i)); +	} + +	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 = device.open(); +		if (altos == null) { +			final String	message = device.getErrorString(); +			close(); +			throw new FileNotFoundException(String.format("%s (%s)", +								      device.toShortString(), message)); +		} +		if (debug) +			System.out.printf("Open %s\n", device.getPath()); +		input_thread = new Thread(this); +		input_thread.start(); +		print("~\nE 0\n"); +		set_monitor(false); +		flush_output(); +	} + +	public void set_frame(Frame in_frame) { +		frame = in_frame; +	} + +	public AltosSerial(AltosDevice in_device) throws FileNotFoundException, AltosSerialInUseException { +		device = in_device; +		frame = null; +		serial = device.getSerial(); +		name = device.toShortString(); +		open(); +	} +} | 
