summaryrefslogtreecommitdiff
path: root/ao-tools/altosui/AltosDevice.java
blob: 3daf0742311b254ccfc35360391847c466c3b807 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
 * Copyright © 2010 Keith Packard <keithp@keithp.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 */

package altosui;
import java.lang.*;
import java.util.*;
import libaltosJNI.*;

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;
	}
}