altosui: Separate out log file choosing dialog to share with CSV generator
[fw/altos] / ao-tools / altosui / AltosDevice.java
1 /*
2  * Copyright © 2010 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; version 2 of the License.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License along
14  * with this program; if not, write to the Free Software Foundation, Inc.,
15  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
16  */
17
18 package altosui;
19 import java.lang.*;
20 import java.util.*;
21 import libaltosJNI.*;
22
23 public class AltosDevice extends altos_device {
24
25         static boolean initialized = false;
26         static {
27                 try {
28                         System.loadLibrary("altos");
29                         libaltos.altos_init();
30                         initialized = true;
31                 } catch (UnsatisfiedLinkError e) {
32                         System.err.println("Native library failed to load.\n" + e);
33                 }
34         }
35         public final static int TeleMetrum = libaltosConstants.USB_PRODUCT_TELEMETRUM;
36         public final static int TeleDongle = libaltosConstants.USB_PRODUCT_TELEDONGLE;
37         public final static int TeleTerra = libaltosConstants.USB_PRODUCT_TELETERRA;
38         public final static int Any = 0x10000;
39         public final static int BaseStation = 0x10000 + 1;
40
41         public String toString() {
42                 String  name = getName();
43                 if (name == null)
44                         name = "Altus Metrum";
45                 return String.format("%-20.20s %4d %s",
46                                      getName(), getSerial(), getPath());
47         }
48
49         public boolean isAltusMetrum() {
50                 if (getVendor() != libaltosConstants.USB_VENDOR_ALTUSMETRUM)
51                         return false;
52                 if (getProduct() < libaltosConstants.USB_PRODUCT_ALTUSMETRUM_MIN)
53                         return false;
54                 if (getProduct() > libaltosConstants.USB_PRODUCT_ALTUSMETRUM_MAX)
55                         return false;
56                 return true;
57         }
58
59         public boolean matchProduct(int want_product) {
60
61                 if (want_product == Any)
62                         return true;
63
64                 if (want_product == BaseStation)
65                         return matchProduct(TeleDongle) || matchProduct(TeleTerra);
66
67                 if (!isAltusMetrum())
68                         return false;
69
70                 int have_product = getProduct();
71
72                 if (want_product == have_product)
73                         return true;
74
75                 if (have_product != libaltosConstants.USB_PRODUCT_ALTUSMETRUM)
76                         return false;
77
78                 String name = getName();
79
80                 if (name == null)
81                         return false;
82                 if (want_product == libaltosConstants.USB_PRODUCT_TELEMETRUM)
83                         return name.startsWith("TeleMetrum");
84                 if (want_product == libaltosConstants.USB_PRODUCT_TELEDONGLE)
85                         return name.startsWith("TeleDongle");
86                 if (want_product == libaltosConstants.USB_PRODUCT_TELETERRA)
87                         return name.startsWith("TeleTerra");
88                 return false;
89         }
90
91         static AltosDevice[] list(int product) {
92                 if (!initialized)
93                         return null;
94
95                 SWIGTYPE_p_altos_list list = libaltos.altos_list_start();
96
97                 ArrayList<AltosDevice> device_list = new ArrayList<AltosDevice>();
98                 if (list != null) {
99                         SWIGTYPE_p_altos_file file;
100
101                         for (;;) {
102                                 AltosDevice device = new AltosDevice();
103                                 if (libaltos.altos_list_next(list, device) == 0)
104                                         break;
105                                 if (device.matchProduct(product))
106                                         device_list.add(device);
107                         }
108                         libaltos.altos_list_finish(list);
109                 }
110
111                 AltosDevice[] devices = new AltosDevice[device_list.size()];
112                 for (int i = 0; i < device_list.size(); i++)
113                         devices[i] = device_list.get(i);
114                 return devices;
115         }
116 }