don't build all the "fat" jar deliverables by default
[fw/altos] / ao-tools / altosui / AltosDevice.java
index 8ebd3b991bb52486ea7faa46efc35307339bdbbb..e62a0a7aa31f6b9e610c2c2d06372aae8ce44af3 100644 (file)
@@ -20,32 +20,86 @@ import java.lang.*;
 import java.util.*;
 import libaltosJNI.*;
 
-public class AltosDevice {
+public class AltosDevice extends altos_device {
 
+       static boolean initialized = false;
        static {
-               System.loadLibrary("altos");
-               libaltos.altos_init();
+               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 AltusMetrum = libaltosConstants.USB_PRODUCT_ALTUSMETRUM;
+       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;
        }
-       static altos_device[] list(String product) {
+
+       public boolean matchProduct(int want_product) {
+
+               if (!isAltusMetrum())
+                       return false;
+
+               if (want_product == Any)
+                       return true;
+
+               if (want_product == BaseStation)
+                       return matchProduct(TeleDongle) || matchProduct(TeleTerra);
+
+               int have_product = getProduct();
+
+               if (have_product == AltusMetrum)        /* old devices match any request */
+                       return true;
+
+               if (want_product == have_product)
+                       return true;
+
+               return false;
+       }
+
+       static AltosDevice[] list(int product) {
+               if (!initialized)
+                       return null;
+
                SWIGTYPE_p_altos_list list = libaltos.altos_list_start();
 
-               ArrayList<altos_device> device_list = new ArrayList<altos_device>();
+               ArrayList<AltosDevice> device_list = new ArrayList<AltosDevice>();
                if (list != null) {
                        SWIGTYPE_p_altos_file file;
 
                        for (;;) {
-                               altos_device device = new altos_device();
+                               AltosDevice device = new AltosDevice();
                                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);
+                               if (device.matchProduct(product))
+                                       device_list.add(device);
                        }
                        libaltos.altos_list_finish(list);
                }
 
-               altos_device[] devices = new altos_device[device_list.size()];
+               AltosDevice[] devices = new AltosDevice[device_list.size()];
                for (int i = 0; i < device_list.size(); i++)
                        devices[i] = device_list.get(i);
                return devices;