altosui: Select devices by USB vendor/product ID.
[fw/altos] / ao-tools / altosui / AltosDevice.java
index 66800c5c66da39e45964f1593ee06a99614ee943..3daf0742311b254ccfc35360391847c466c3b807 100644 (file)
 package altosui;
 import java.lang.*;
 import java.util.*;
 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;
+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() {
+               String  name = getName();
+               if (name == null)
+                       name = "Altus Metrum";
+               return String.format("%-20.20s %4d %s",
+                                    getName(), getSerial(), getPath());
+       }
+
+       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;
+       }
+
+       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>();
+               if (list != null) {
+                       SWIGTYPE_p_altos_file file;
+
+                       for (;;) {
+                               AltosDevice device = new AltosDevice();
+                               if (libaltos.altos_list_next(list, device) == 0)
+                                       break;
+                               if (device.matchProduct(product))
+                                       device_list.add(device);
+                       }
+                       libaltos.altos_list_finish(list);
+               }
+
+               AltosDevice[] devices = new AltosDevice[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
 }
\ No newline at end of file