altosui: Select devices by USB vendor/product ID.
authorKeith Packard <keithp@keithp.com>
Wed, 18 Aug 2010 01:22:28 +0000 (18:22 -0700)
committerKeith Packard <keithp@keithp.com>
Wed, 18 Aug 2010 01:22:28 +0000 (18:22 -0700)
Because Win7 doesn't expose the product name, we're swtiching to using
the USB idProduct/idVendor values. This patch adds support for
selecting devices by those new IDs.

Signed-off-by: Keith Packard <keithp@keithp.com>
ao-tools/altosui/AltosDevice.java
ao-tools/altosui/AltosDeviceDialog.java
ao-tools/altosui/AltosEepromDownload.java
ao-tools/altosui/AltosUI.java

index f488174cf7677e3dc345b1a6875b78d2f5e41d7a..3daf0742311b254ccfc35360391847c466c3b807 100644 (file)
@@ -22,16 +22,76 @@ import libaltosJNI.*;
 
 public class AltosDevice extends altos_device {
 
 
 public class AltosDevice extends altos_device {
 
+       static boolean initialized = false;
+       static {
+               try {
+                       System.loadLibrary("altos");
+                       libaltos.altos_init();
+                       initialized = true;
+               } catch (UnsatisfiedLinkError e) {
+                       System.err.println("Native library failed to load.\n" + e);
+               }
+       }
+       public final static int TeleMetrum = libaltosConstants.USB_PRODUCT_TELEMETRUM;
+       public final static int TeleDongle = libaltosConstants.USB_PRODUCT_TELEDONGLE;
+       public final static int TeleTerra = libaltosConstants.USB_PRODUCT_TELETERRA;
+       public final static int Any = 0x10000;
+       public final static int BaseStation = 0x10000 + 1;
+
        public String toString() {
        public String toString() {
+               String  name = getName();
+               if (name == null)
+                       name = "Altus Metrum";
                return String.format("%-20.20s %4d %s",
                return String.format("%-20.20s %4d %s",
-                                    getProduct(), getSerial(), getPath());
+                                    getName(), getSerial(), getPath());
        }
 
        }
 
-       static {
-               System.loadLibrary("altos");
-               libaltos.altos_init();
+       public boolean isAltusMetrum() {
+               if (getVendor() != libaltosConstants.USB_VENDOR_ALTUSMETRUM)
+                       return false;
+               if (getProduct() < libaltosConstants.USB_PRODUCT_ALTUSMETRUM_MIN)
+                       return false;
+               if (getProduct() > libaltosConstants.USB_PRODUCT_ALTUSMETRUM_MAX)
+                       return false;
+               return true;
        }
        }
-       static AltosDevice[] list(String product) {
+
+       public boolean matchProduct(int want_product) {
+
+               if (want_product == Any)
+                       return true;
+
+               if (want_product == BaseStation)
+                       return matchProduct(TeleDongle) || matchProduct(TeleTerra);
+
+               if (!isAltusMetrum())
+                       return false;
+
+               int have_product = getProduct();
+
+               if (want_product == have_product)
+                       return true;
+
+               if (have_product != libaltosConstants.USB_PRODUCT_ALTUSMETRUM)
+                       return false;
+
+               String name = getName();
+
+               if (name == null)
+                       return false;
+               if (want_product == libaltosConstants.USB_PRODUCT_TELEMETRUM)
+                       return name.startsWith("TeleMetrum");
+               if (want_product == libaltosConstants.USB_PRODUCT_TELEDONGLE)
+                       return name.startsWith("TeleDongle");
+               if (want_product == libaltosConstants.USB_PRODUCT_TELETERRA)
+                       return name.startsWith("TeleTerra");
+               return false;
+       }
+
+       static AltosDevice[] list(int product) {
+               if (!initialized)
+                       return null;
+
                SWIGTYPE_p_altos_list list = libaltos.altos_list_start();
 
                ArrayList<AltosDevice> device_list = new ArrayList<AltosDevice>();
                SWIGTYPE_p_altos_list list = libaltos.altos_list_start();
 
                ArrayList<AltosDevice> device_list = new ArrayList<AltosDevice>();
@@ -42,7 +102,7 @@ public class AltosDevice extends altos_device {
                                AltosDevice device = new AltosDevice();
                                if (libaltos.altos_list_next(list, device) == 0)
                                        break;
                                AltosDevice device = new AltosDevice();
                                if (libaltos.altos_list_next(list, device) == 0)
                                        break;
-                               if (product == null || device.getProduct().startsWith(product))
+                               if (device.matchProduct(product))
                                        device_list.add(device);
                        }
                        libaltos.altos_list_finish(list);
                                        device_list.add(device);
                        }
                        libaltos.altos_list_finish(list);
index c60bd7c3ee35a388f5733259e84d8e2d3e4946e4..3df4c6ebeb15c27e4176dc16ff1560bf5fdbe7b6 100644 (file)
@@ -31,16 +31,16 @@ import altosui.AltosDevice;
 public class AltosDeviceDialog extends JDialog implements ActionListener {
 
        private static AltosDeviceDialog        dialog;
 public class AltosDeviceDialog extends JDialog implements ActionListener {
 
        private static AltosDeviceDialog        dialog;
-       private static altos_device             value = null;
+       private static AltosDevice              value = null;
        private JList                           list;
 
        private JList                           list;
 
-       public static altos_device show (Component frameComp, String product) {
+       public static AltosDevice show (Component frameComp, int product) {
 
                Frame frame = JOptionPane.getFrameForComponent(frameComp);
                AltosDevice[]   devices;
                devices = AltosDevice.list(product);
 
 
                Frame frame = JOptionPane.getFrameForComponent(frameComp);
                AltosDevice[]   devices;
                devices = AltosDevice.list(product);
 
-               if (devices != null & devices.length > 0) {
+               if (devices != null && devices.length > 0) {
                        value = null;
                        dialog = new AltosDeviceDialog(frame, frameComp,
                                                       devices,
                        value = null;
                        dialog = new AltosDeviceDialog(frame, frameComp,
                                                       devices,
@@ -153,7 +153,7 @@ public class AltosDeviceDialog extends JDialog implements ActionListener {
        //Handle clicks on the Set and Cancel buttons.
        public void actionPerformed(ActionEvent e) {
                if ("select".equals(e.getActionCommand()))
        //Handle clicks on the Set and Cancel buttons.
        public void actionPerformed(ActionEvent e) {
                if ("select".equals(e.getActionCommand()))
-                       AltosDeviceDialog.value = (altos_device)(list.getSelectedValue());
+                       AltosDeviceDialog.value = (AltosDevice)(list.getSelectedValue());
                AltosDeviceDialog.dialog.setVisible(false);
        }
 
                AltosDeviceDialog.dialog.setVisible(false);
        }
 
index f2fcd09e687c3d3fb9e85b4eabb7e920b021b87c..c2a8d25e8b229d7c6d20d4aaac466001d0eaa7fb 100644 (file)
@@ -84,7 +84,7 @@ public class AltosEepromDownload implements Runnable {
        }
 
        JFrame                  frame;
        }
 
        JFrame                  frame;
-       altos_device            device;
+       AltosDevice             device;
        AltosSerial             serial_line;
        boolean                 remote;
        Thread                  eeprom_thread;
        AltosSerial             serial_line;
        boolean                 remote;
        Thread                  eeprom_thread;
@@ -251,7 +251,7 @@ public class AltosEepromDownload implements Runnable {
 
        public AltosEepromDownload(JFrame given_frame) {
                frame = given_frame;
 
        public AltosEepromDownload(JFrame given_frame) {
                frame = given_frame;
-               device = AltosDeviceDialog.show(frame, null);
+               device = AltosDeviceDialog.show(frame, AltosDevice.Any);
 
                serial_line = new AltosSerial();
                remote = false;
 
                serial_line = new AltosSerial();
                remote = false;
@@ -259,7 +259,8 @@ public class AltosEepromDownload implements Runnable {
                if (device != null) {
                        try {
                                serial_line.open(device);
                if (device != null) {
                        try {
                                serial_line.open(device);
-                               if (!device.getProduct().startsWith("TeleMetrum"))
+                               String name = device.getName();
+                               if (!device.matchProduct(AltosDevice.TeleMetrum))
                                        remote = true;
                                eeprom_thread = new Thread(this);
                                eeprom_thread.start();
                                        remote = true;
                                eeprom_thread = new Thread(this);
                                eeprom_thread.start();
index 7d5ac93ac32adb1497160c0867654d32fd90da9f..b96e16a612d0c05e2d39a7c273b1bb5ca7ac1a16 100644 (file)
@@ -413,7 +413,7 @@ public class AltosUI extends JFrame {
        }
 
        private void ConnectToDevice() {
        }
 
        private void ConnectToDevice() {
-               altos_device    device = AltosDeviceDialog.show(AltosUI.this, "TeleDongle");
+               AltosDevice     device = AltosDeviceDialog.show(AltosUI.this, AltosDevice.BaseStation);
 
                if (device != null) {
                        try {
 
                if (device != null) {
                        try {