Switch AltosUI to libaltos for device access
authorKeith Packard <keithp@keithp.com>
Mon, 26 Jul 2010 22:42:48 +0000 (15:42 -0700)
committerKeith Packard <keithp@keithp.com>
Mon, 26 Jul 2010 22:42:48 +0000 (15:42 -0700)
Signed-off-by: Keith Packard <keithp@keithp.com>
ao-tools/altosui/AltosDevice.java
ao-tools/altosui/AltosDeviceDialog.java
ao-tools/altosui/AltosDeviceLinux.java [deleted file]
ao-tools/altosui/AltosGPS.java
ao-tools/altosui/AltosSerial.java
ao-tools/altosui/AltosUI.java
ao-tools/altosui/AltosVoice.java
ao-tools/altosui/Makefile

index 66800c5c66da39e45964f1593ee06a99614ee943..8ebd3b991bb52486ea7faa46efc35307339bdbbb 100644 (file)
 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
index cb1eef8bc8f8204db8ab414a5dbd7563be1ddb80..b3a0f9bebd5d308c0067f3aadf93f572a93da8ab 100644 (file)
@@ -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 (file)
index ffc70af..0000000
+++ /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;
-       }
-}
index c3b368e26b47ce022f5e34068bf227e49d3bb7e1..f8eb5f4844150024244f3ef08211db8f75c62d9d 100644 (file)
@@ -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;
index 03ab28c55376ff635c4c7b964304f0ab7cd1b269..073bfb783bff4d3ca7c87c5390af02058026850b 100644 (file)
@@ -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);
        }
 }
index 43c40799f193552ba66d2dbbd74b1b52c9d140ad..33ed2c90b19d791725b947dd343c1aab763d36a8 100644 (file)
@@ -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);
                        }
index e4ea99a2220d80a8abbe3a83a602486a7a45f236..0c34795c55083981df54cf56f9ff6dcdf74e6c8a 100644 (file)
 
 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)");
                        }
-               }
+                       } */
        }
 }
index 57c889b8d37c3d1c335221791289b65178d2bdc5..1c49ba1161d5b05c422cd6a47ae1bb81a7e0cc6e 100644 (file)
@@ -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