diff options
| author | Keith Packard <keithp@keithp.com> | 2010-07-26 15:42:48 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2010-07-26 15:42:48 -0700 | 
| commit | 005e2d6a7bb3b0546b0c1273296875621632ec6d (patch) | |
| tree | 9dc5c2a19f4ac216ce1fb1d6a2bd1053b98a969d | |
| parent | c726d8f6eb861801d7543552beab6ee2c920c96f (diff) | |
Switch AltosUI to libaltos for device access
Signed-off-by: Keith Packard <keithp@keithp.com>
| -rw-r--r-- | ao-tools/altosui/AltosDevice.java | 35 | ||||
| -rw-r--r-- | ao-tools/altosui/AltosDeviceDialog.java | 14 | ||||
| -rw-r--r-- | ao-tools/altosui/AltosDeviceLinux.java | 172 | ||||
| -rw-r--r-- | ao-tools/altosui/AltosGPS.java | 4 | ||||
| -rw-r--r-- | ao-tools/altosui/AltosSerial.java | 72 | ||||
| -rw-r--r-- | ao-tools/altosui/AltosUI.java | 21 | ||||
| -rw-r--r-- | ao-tools/altosui/AltosVoice.java | 20 | ||||
| -rw-r--r-- | ao-tools/altosui/Makefile | 12 | 
8 files changed, 78 insertions, 272 deletions
| diff --git a/ao-tools/altosui/AltosDevice.java b/ao-tools/altosui/AltosDevice.java index 66800c5c..8ebd3b99 100644 --- a/ao-tools/altosui/AltosDevice.java +++ b/ao-tools/altosui/AltosDevice.java @@ -18,13 +18,36 @@  package altosui;  import java.lang.*;  import java.util.*; +import libaltosJNI.*;  public class AltosDevice { -	String	tty;	/* suitable to be passed to AltosSerial.connect */ -	String	manufacturer; -	String	product; -	int	serial; -	int	idProduct; -	int	idVendor; +	static { +		System.loadLibrary("altos"); +		libaltos.altos_init(); +	} +	static altos_device[] list(String product) { +		SWIGTYPE_p_altos_list list = libaltos.altos_list_start(); + +		ArrayList<altos_device> device_list = new ArrayList<altos_device>(); +		if (list != null) { +			SWIGTYPE_p_altos_file file; + +			for (;;) { +				altos_device device = new altos_device(); +				if (libaltos.altos_list_next(list, device) == 0) +					break; +				System.out.printf("Found device %s %d %s\n", +						  device.getProduct(), device.getSerial(), device.getPath()); + +				device_list.add(device); +			} +			libaltos.altos_list_finish(list); +		} + +		altos_device[] devices = new altos_device[device_list.size()]; +		for (int i = 0; i < device_list.size(); i++) +			devices[i] = device_list.get(i); +		return devices; +	}  }
\ No newline at end of file diff --git a/ao-tools/altosui/AltosDeviceDialog.java b/ao-tools/altosui/AltosDeviceDialog.java index cb1eef8b..b3a0f9be 100644 --- a/ao-tools/altosui/AltosDeviceDialog.java +++ b/ao-tools/altosui/AltosDeviceDialog.java @@ -20,15 +20,17 @@ package altosui;  import java.lang.*;  import java.util.*;  import javax.swing.*; +import libaltosJNI.libaltos; +import libaltosJNI.altos_device; +import libaltosJNI.SWIGTYPE_p_altos_file; +import libaltosJNI.SWIGTYPE_p_altos_list;  import altosui.AltosDevice; -import altosui.AltosDeviceLinux;  public class AltosDeviceDialog { -	static AltosDevice show (JFrame frame, String product) { -		AltosDevice[]	devices = null; -		if (System.getProperty("os.name").startsWith("Linux")) -			devices = AltosDeviceLinux.list(product); +	static altos_device show (JFrame frame, String product) { +		altos_device[]	devices = null; +		devices = AltosDevice.list(product);  		if (devices != null & devices.length > 0) {  			Object o = JOptionPane.showInputDialog(frame,  							       "Select a device", @@ -37,7 +39,7 @@ public class AltosDeviceDialog {  							       null,  							       devices,  							       devices[0]); -			return (AltosDevice) o; +			return (altos_device) o;  		} else {  			return null;  		} diff --git a/ao-tools/altosui/AltosDeviceLinux.java b/ao-tools/altosui/AltosDeviceLinux.java deleted file mode 100644 index ffc70aff..00000000 --- a/ao-tools/altosui/AltosDeviceLinux.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * 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. - */ - -package altosui; -import java.lang.*; -import java.io.*; -import java.util.*; -import altosui.AltosDevice; - -public class AltosDeviceLinux extends AltosDevice { - -	String load_string(File file) { -		try { -			FileInputStream	in = new FileInputStream(file); -			String result = ""; -			int c; -			try { -				while ((c = in.read()) != -1) { -					if (c == '\n') -						break; -					result = result + (char) c; -				} -				return result; -			} catch (IOException ee) { -				return ""; -			} -		} catch (FileNotFoundException ee) { -			return ""; -		} -	} -	String load_string(File dir, String name) { -		return load_string(new File(dir, name)); -	} - -	int load_hex(File file) { -		try { -			return Integer.parseInt(load_string(file).trim(), 16); -		} catch (NumberFormatException ee) { -			return -1; -		} -	} - -	int load_hex(File dir, String name) { -		return load_hex(new File(dir, name)); -	} - -	int load_dec(File file) { -		try { -			return Integer.parseInt(load_string(file).trim()); -		} catch (NumberFormatException ee) { -			return -1; -		} -	} - -	int load_dec(File dir, String name) { -		return load_dec(new File(dir, name)); -	} - -	String usb_tty(File sys_dir) { -		String base = sys_dir.getName(); -		int num_configs = load_hex(sys_dir, "bNumConfigurations"); -		int num_inters = load_hex(sys_dir, "bNumInterfaces"); -		for (int config = 1; config <= num_configs; config++) { -			for (int inter = 0; inter < num_inters; inter++) { -				String endpoint_base = String.format("%s:%d.%d", -								     base, config, inter); -				File endpoint_full = new File(sys_dir, endpoint_base); - -				File[] namelist; - -				/* Check for tty:ttyACMx style names */ -				class tty_colon_filter implements FilenameFilter { -					public boolean accept(File dir, String name) { -						return name.startsWith("tty:"); -					} -				} -				namelist = endpoint_full.listFiles(new tty_colon_filter()); -				if (namelist != null && namelist.length > 0) -					return new File ("/dev", namelist[0].getName().substring(4)).getPath(); - -				/* Check for tty/ttyACMx style names */ -				class tty_filter implements FilenameFilter { -					public boolean accept(File dir, String name) { -						return name.startsWith("tty"); -					} -				} -				File tty_dir = new File(endpoint_full, "tty"); -				namelist = tty_dir.listFiles(new tty_filter()); -				if (namelist != null && namelist.length > 0) -					return new File ("/dev", namelist[0].getName()).getPath(); -			} -		} -		return null; -	} - -	public AltosDeviceLinux (File sys) { -		sys = sys; -		manufacturer = load_string(sys, "manufacturer"); -		product = load_string(sys, "product"); -		serial = load_dec(sys, "serial"); -		idProduct = load_hex(sys, "idProduct"); -		idVendor = load_hex(sys, "idVendor"); -		tty = usb_tty(sys); -	} - -	public String toString() { -		return String.format("%-20s %6d %-15s", product, serial, tty == null ? "" : tty); -	} -	static public AltosDeviceLinux[] list() { -		LinkedList<AltosDeviceLinux> devices = new LinkedList<AltosDeviceLinux>(); - -		class dev_filter implements FilenameFilter{ -			public boolean accept(File dir, String name) { -				for (int i = 0; i < name.length(); i++) { -					char c = name.charAt(i); -					if (Character.isDigit(c)) -						continue; -					if (c == '-') -						continue; -					if (c == '.' && i != 1) -						continue; -					return false; -				} -				return true; -			} -		} - -		File usb_devices = new File("/sys/bus/usb/devices"); -		File[] devs = usb_devices.listFiles(new dev_filter()); -		if (devs != null) { -			for (int e = 0; e < devs.length; e++) { -				AltosDeviceLinux	dev = new AltosDeviceLinux(devs[e]); -				if (dev.idVendor == 0xfffe && dev.tty != null) { -					devices.add(dev); -				} -			} -		} -		AltosDeviceLinux[] foo = new AltosDeviceLinux[devices.size()]; -		for (int e = 0; e < devices.size(); e++) -			foo[e] = devices.get(e); -		return foo; -	} - -	static public AltosDeviceLinux[] list(String model) { -		AltosDeviceLinux[] devices = list(); -		if (model != null) { -			LinkedList<AltosDeviceLinux> subset = new LinkedList<AltosDeviceLinux>(); -			for (int i = 0; i < devices.length; i++) { -				if (devices[i].product.startsWith(model)) -					subset.add(devices[i]); -			} -			devices = new AltosDeviceLinux[subset.size()]; -			for (int e = 0; e < subset.size(); e++) -				devices[e] = subset.get(e); -		} -		return devices; -	} -} diff --git a/ao-tools/altosui/AltosGPS.java b/ao-tools/altosui/AltosGPS.java index c3b368e2..f8eb5f48 100644 --- a/ao-tools/altosui/AltosGPS.java +++ b/ao-tools/altosui/AltosGPS.java @@ -90,6 +90,9 @@ public class AltosGPS {  			gps_connected = true;  			gps_time = new AltosGPSTime();  			i++; +		} else if ((words[i]).equals("not-connected")) { +			gps_time = new AltosGPSTime(); +			i++;  		} else if (words.length >= 40) {  			gps_locked = true;  			gps_connected = true; @@ -106,6 +109,7 @@ public class AltosGPS {  			v_error = AltosParse.parse_int(AltosParse.strip_suffix(words[i++], "(verr)"));  		} else {  			gps_time = new AltosGPSTime(); +			i++;  		}  		AltosParse.word(words[i++], "SAT");  		int tracking_channels = 0; diff --git a/ao-tools/altosui/AltosSerial.java b/ao-tools/altosui/AltosSerial.java index 03ab28c5..073bfb78 100644 --- a/ao-tools/altosui/AltosSerial.java +++ b/ao-tools/altosui/AltosSerial.java @@ -26,8 +26,11 @@ import java.io.*;  import java.util.concurrent.LinkedBlockingQueue;  import java.util.LinkedList;  import java.util.Iterator; -import gnu.io.*;  import altosui.AltosSerialMonitor; +import libaltosJNI.libaltos; +import libaltosJNI.altos_device; +import libaltosJNI.SWIGTYPE_p_altos_file; +import libaltosJNI.SWIGTYPE_p_altos_list;  /*   * This class reads from the serial port and places each received @@ -35,7 +38,7 @@ import altosui.AltosSerialMonitor;   * threads.   */  class AltosSerialReader implements Runnable { -	InputStream	serial_in; +	SWIGTYPE_p_altos_file altos;  	LinkedList<LinkedBlockingQueue<String>> monitors;  	LinkedBlockingQueue<String> reply_queue;  	Thread input_thread; @@ -46,7 +49,7 @@ class AltosSerialReader implements Runnable {  		try {  			for (;;) { -				c = serial_in.read(); +				c = libaltos.altos_getchar(altos, 0);  				if (Thread.interrupted())  					break;  				if (c == -1) @@ -70,7 +73,6 @@ class AltosSerialReader implements Runnable {  					}  				}  			} -		} catch (IOException e) {  		} catch (InterruptedException e) {  		}  	} @@ -96,16 +98,13 @@ class AltosSerialReader implements Runnable {  	}  	public boolean opened() { -		return serial_in != null; +		return altos != null;  	}  	public void close() { -		if (serial_in != null) { -			try { -				serial_in.close(); -			} catch (IOException e) { -			} -			serial_in = null; +		if (altos != null) { +			libaltos.altos_close(altos); +			altos = null;  		}  		if (input_thread != null) {  			try { @@ -117,62 +116,30 @@ class AltosSerialReader implements Runnable {  		}  	} -	public void open(File name) throws FileNotFoundException { -		close(); -		serial_in = new FileInputStream(name); -		input_thread = new Thread(this); -		input_thread.start(); -	} -	public void open(CommPort c) throws IOException { +	public void open(altos_device device) throws FileNotFoundException {  		close(); -		try { -		c.enableReceiveTimeout(1000);	/* icky. the read method cannot be interrupted */ -		} catch (UnsupportedCommOperationException ee) { -		} -		serial_in = c.getInputStream(); +		altos = libaltos.altos_open(device);  		input_thread = new Thread(this);  		input_thread.start();  	}  	public AltosSerialReader () { -		serial_in = null; +		altos = null;  		input_thread = null;  		line = "";  		monitors = new LinkedList<LinkedBlockingQueue<String>> ();  		reply_queue = new LinkedBlockingQueue<String> ();  	} -  }  public class AltosSerial { -	OutputStream serial_out = null;  	AltosSerialReader reader = null; -	CommPort comm_port = null; -  	public void close() { -		try { -			serial_out.close(); -		} catch (IOException ee) { -		}  		reader.close(); -		if (comm_port != null) { -			comm_port.close(); -		} -	} - -	public void open(File serial_name) throws FileNotFoundException { -		reader.open(serial_name); -		serial_out = new FileOutputStream(serial_name);  	} -	public void open(CommPort c) throws IOException { -		reader.open(c); -		serial_out = c.getOutputStream(); -	} - -	public void connect(String port_name) throws IOException, NoSuchPortException, PortInUseException { -		comm_port = new RXTXPort(port_name); -		open(comm_port); +	public void open(altos_device device) throws FileNotFoundException { +		reader.open(device);  	}  	void init() { @@ -191,13 +158,8 @@ public class AltosSerial {  		init();  	} -	public AltosSerial(File serial_name) throws FileNotFoundException { -		init(); -		open(serial_name); -	} - -	public AltosSerial(CommPort comm_port) throws IOException { +	public AltosSerial(altos_device device) throws FileNotFoundException {  		init(); -		open(comm_port); +		open(device);  	}  } diff --git a/ao-tools/altosui/AltosUI.java b/ao-tools/altosui/AltosUI.java index 43c40799..33ed2c90 100644 --- a/ao-tools/altosui/AltosUI.java +++ b/ao-tools/altosui/AltosUI.java @@ -27,7 +27,6 @@ import java.util.*;  import java.text.*;  import java.util.prefs.*;  import java.util.concurrent.LinkedBlockingQueue; -import gnu.io.*;  import altosui.AltosSerial;  import altosui.AltosSerialMonitor; @@ -38,6 +37,8 @@ import altosui.AltosPreferences;  import altosui.AltosLog;  import altosui.AltosVoice; +import libaltosJNI.*; +  class AltosFlightStatusTableModel extends AbstractTableModel {  	private String[] columnNames = {"Height (m)", "State", "RSSI (dBm)", "Speed (m/s)" };  	private Object[] data = { 0, "idle", 0, 0 }; @@ -475,31 +476,21 @@ public class AltosUI extends JFrame {  	}  	private void ConnectToDevice() { -		AltosDevice	device = AltosDeviceDialog.show(AltosUI.this, "TeleDongle"); +		altos_device	device = AltosDeviceDialog.show(AltosUI.this, "TeleDongle");  		if (device != null) {  			try { -				serial_line.connect(device.tty); +				serial_line.open(device);  				DeviceThread thread = new DeviceThread(serial_line);  				run_display(thread);  			} catch (FileNotFoundException ee) {  				JOptionPane.showMessageDialog(AltosUI.this, -							      device.tty, +							      device.getPath(),  							      "Cannot open serial port",  							      JOptionPane.ERROR_MESSAGE); -			} catch (NoSuchPortException ee) { -				JOptionPane.showMessageDialog(AltosUI.this, -							      device.tty, -							      "No such serial port", -							      JOptionPane.ERROR_MESSAGE); -			} catch (PortInUseException ee) { -				JOptionPane.showMessageDialog(AltosUI.this, -							      device.tty, -							      "Port in use", -							      JOptionPane.ERROR_MESSAGE);  			} catch (IOException ee) {  				JOptionPane.showMessageDialog(AltosUI.this, -							      device.tty, +							      device.getPath(),  							      "Unkonwn I/O error",  							      JOptionPane.ERROR_MESSAGE);  			} diff --git a/ao-tools/altosui/AltosVoice.java b/ao-tools/altosui/AltosVoice.java index e4ea99a2..0c34795c 100644 --- a/ao-tools/altosui/AltosVoice.java +++ b/ao-tools/altosui/AltosVoice.java @@ -17,14 +17,16 @@  package altosui; -import com.sun.speech.freetts.Voice; +/*import com.sun.speech.freetts.Voice;  import com.sun.speech.freetts.VoiceManager; -import com.sun.speech.freetts.audio.JavaClipAudioPlayer; +import com.sun.speech.freetts.audio.JavaClipAudioPlayer; */  import java.util.concurrent.LinkedBlockingQueue;  public class AltosVoice implements Runnable { +/*  	VoiceManager			voice_manager;  	Voice				voice; +*/  	LinkedBlockingQueue<String>	phrases;  	Thread				thread; @@ -34,29 +36,29 @@ public class AltosVoice implements Runnable {  		try {  			for (;;) {  				String s = phrases.take(); -				voice.speak(s); +/*				voice.speak(s); */  			}  		} catch (InterruptedException e) {  		}  	}  	public void speak(String s) {  		try { -			if (voice != null) +/*			if (voice != null) */  				phrases.put(s);  		} catch (InterruptedException e) {  		}  	}  	public AltosVoice () { -		voice_manager = VoiceManager.getInstance(); +/*		voice_manager = VoiceManager.getInstance();  		voice = voice_manager.getVoice(voice_name); -		if (voice != null) { -			voice.allocate(); +		if (voice != null)  */ { +/*			voice.allocate(); */  			phrases = new LinkedBlockingQueue<String> ();  			thread = new Thread(this);  			thread.start();  			speak("Rocket Flight Monitor Ready"); -		} else { +		} /* else {  			System.out.printf("Voice manager failed to open %s\n", voice_name);  			Voice[] voices = voice_manager.getVoices();  			System.out.printf("Available voices:\n"); @@ -64,6 +66,6 @@ public class AltosVoice implements Runnable {  				System.out.println("    " + voices[i].getName()  						   + " (" + voices[i].getDomain() + " domain)");  			} -		} +			} */  	}  } diff --git a/ao-tools/altosui/Makefile b/ao-tools/altosui/Makefile index 57c889b8..1c49ba11 100644 --- a/ao-tools/altosui/Makefile +++ b/ao-tools/altosui/Makefile @@ -1,6 +1,6 @@  .SUFFIXES: .java .class -CLASSPATH=..:/usr/share/java/*:/home/keithp/src/freetts/freetts-1.2.2 +CLASSPATH=..:../libaltos:/usr/share/java/*:/home/keithp/src/freetts/freetts-1.2.2  CLASSFILES=\  	AltosConvert.class \  	AltosFile.class \ @@ -15,24 +15,18 @@ CLASSFILES=\  	AltosTelemetry.class \  	AltosUI.class \  	AltosDevice.class \ -	AltosDeviceLinux.class \  	AltosDeviceDialog.class \  	AltosVoice.class  JAVAFLAGS=-Xlint:unchecked -all: $(CLASSFILES) altosui altosui.jar +all: $(CLASSFILES) altosui.jar  .java.class:  	javac -cp "$(CLASSPATH)" $(JAVAFLAGS) $*.java -altosui: Makefile -	(echo '#!/bin/sh'; \ -	echo exec java -cp '"$(CLASSPATH)"' altosui/AltosUI) > $@ -	chmod +x $@ -  altosui.jar: $(CLASSFILES) Manifest.txt -	cd .. && jar cfm altosui/$@ altosui/Manifest.txt altosui/*.class +	jar cfm $@ altosui/Manifest.txt altosui/*.class libaltosJNI/*.class  clean:  	rm -f *.class | 
