altosui: Display error dialog when AltOS JNI library can't be loaded
authorKeith Packard <keithp@keithp.com>
Fri, 10 Sep 2010 00:54:41 +0000 (17:54 -0700)
committerKeith Packard <keithp@keithp.com>
Fri, 10 Sep 2010 00:57:13 +0000 (17:57 -0700)
Having an error dialog appear at application startup seems better than
simply failing to present the device dialog later on.

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

index e62a0a7..9ae522c 100644 (file)
@@ -22,20 +22,67 @@ import libaltosJNI.*;
 
 public class AltosDevice extends altos_device {
 
-       static boolean initialized = false;
-       static {
-               try {
-                       System.loadLibrary("altos");
-                       libaltos.altos_init();
+       static public boolean initialized = false;
+       static public boolean loaded_library = false;
+
+       public static boolean load_library() {
+               if (!initialized) {
+                       try {
+                               System.loadLibrary("altos");
+                               libaltos.altos_init();
+                               loaded_library = true;
+                       } catch (UnsatisfiedLinkError e) {
+                               loaded_library = false;
+                       }
                        initialized = true;
-               } catch (UnsatisfiedLinkError e) {
-                       System.err.println("Native library failed to load.\n" + e);
                }
+               return loaded_library;
+       }
+
+       static int usb_product_altusmetrum() {
+               if (load_library())
+                       return libaltosConstants.USB_PRODUCT_ALTUSMETRUM;
+               return 0x000a;
+       }
+
+       static int usb_product_altusmetrum_min() {
+               if (load_library())
+                       return libaltosConstants.USB_PRODUCT_ALTUSMETRUM_MIN;
+               return 0x000a;
+       }
+
+       static int usb_product_altusmetrum_max() {
+               if (load_library())
+                       return libaltosConstants.USB_PRODUCT_ALTUSMETRUM_MAX;
+               return 0x000d;
+       }
+
+       static int usb_product_telemetrum() {
+               if (load_library())
+                       return libaltosConstants.USB_PRODUCT_TELEMETRUM;
+               return 0x000b;
+       }
+
+       static int usb_product_teledongle() {
+               if (load_library())
+                       return libaltosConstants.USB_PRODUCT_ALTUSMETRUM;
+               return 0x000c;
+       }
+
+       static int usb_product_teleterra() {
+               if (load_library())
+                       return libaltosConstants.USB_PRODUCT_ALTUSMETRUM;
+               return 0x000d;
        }
-       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 AltusMetrum = usb_product_altusmetrum();
+       public final static int TeleMetrum = usb_product_telemetrum();
+       public final static int TeleDongle = usb_product_teledongle();
+       public final static int TeleTerra = usb_product_teleterra();
+       public final static int AltusMetrumMin = usb_product_altusmetrum_min();
+       public final static int AltusMetrumMax = usb_product_altusmetrum_max();
+
+
        public final static int Any = 0x10000;
        public final static int BaseStation = 0x10000 + 1;
 
@@ -48,11 +95,11 @@ public class AltosDevice extends altos_device {
        }
 
        public boolean isAltusMetrum() {
-               if (getVendor() != libaltosConstants.USB_VENDOR_ALTUSMETRUM)
+               if (getVendor() != AltusMetrum)
                        return false;
-               if (getProduct() < libaltosConstants.USB_PRODUCT_ALTUSMETRUM_MIN)
+               if (getProduct() < AltusMetrumMin)
                        return false;
-               if (getProduct() > libaltosConstants.USB_PRODUCT_ALTUSMETRUM_MAX)
+               if (getProduct() > AltusMetrumMax)
                        return false;
                return true;
        }
@@ -80,7 +127,7 @@ public class AltosDevice extends altos_device {
        }
 
        static AltosDevice[] list(int product) {
-               if (!initialized)
+               if (!load_library())
                        return null;
 
                SWIGTYPE_p_altos_list list = libaltos.altos_list_start();
index 3df4c6e..ec78e28 100644 (file)
@@ -49,10 +49,15 @@ public class AltosDeviceDialog extends JDialog implements ActionListener {
                        dialog.setVisible(true);
                        return value;
                } else {
-                       JOptionPane.showMessageDialog(frame,
-                                                     "No AltOS devices available",
-                                                     "No AltOS devices",
-                                                     JOptionPane.ERROR_MESSAGE);
+                       /* check for missing altos JNI library, which
+                        * will put up its own error dialog
+                        */
+                       if (AltosUI.load_library(frame)) {
+                               JOptionPane.showMessageDialog(frame,
+                                                             "No AltOS devices available",
+                                                             "No AltOS devices",
+                                                             JOptionPane.ERROR_MESSAGE);
+                       }
                        return null;
                }
        }
index 3aaeb88..ca587b2 100644 (file)
@@ -70,8 +70,22 @@ public class AltosUI extends JFrame {
 
        public AltosVoice voice = new AltosVoice();
 
+       public static boolean load_library(Frame frame) {
+               if (!AltosDevice.load_library()) {
+                       JOptionPane.showMessageDialog(frame,
+                                                     String.format("No AltOS library in \"%s\"",
+                                                                   System.getProperty("java.library.path","<undefined>")),
+                                                     "Cannot load device access library",
+                                                     JOptionPane.ERROR_MESSAGE);
+                       return false;
+               }
+               return true;
+       }
+
        public AltosUI() {
 
+               load_library(null);
+
                String[] statusNames = { "Height (m)", "State", "RSSI (dBm)", "Speed (m/s)" };
                Object[][] statusData = { { "0", "pad", "-50", "0" } };