From 005e2d6a7bb3b0546b0c1273296875621632ec6d Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 26 Jul 2010 15:42:48 -0700 Subject: [PATCH] Switch AltosUI to libaltos for device access Signed-off-by: Keith Packard --- ao-tools/altosui/AltosDevice.java | 35 ++++- ao-tools/altosui/AltosDeviceDialog.java | 14 +- ao-tools/altosui/AltosDeviceLinux.java | 172 ------------------------ ao-tools/altosui/AltosGPS.java | 4 + ao-tools/altosui/AltosSerial.java | 72 +++------- ao-tools/altosui/AltosUI.java | 21 +-- ao-tools/altosui/AltosVoice.java | 20 +-- ao-tools/altosui/Makefile | 12 +- 8 files changed, 78 insertions(+), 272 deletions(-) delete mode 100644 ao-tools/altosui/AltosDeviceLinux.java 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 device_list = new ArrayList(); + 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 - * - * 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 devices = new LinkedList(); - - 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 subset = new LinkedList(); - 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> monitors; LinkedBlockingQueue 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> (); reply_queue = new LinkedBlockingQueue (); } - } 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 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 (); 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 -- 2.30.2