diff options
| author | Keith Packard <keithp@keithp.com> | 2011-04-14 10:12:29 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2011-04-14 10:12:29 -0700 | 
| commit | 9cdef76c1275b343099d0d01af82d7eadd36a410 (patch) | |
| tree | a5500996924c35b365013bbae61128ee1328c64b | |
| parent | 5b3f18b38d80aa041b971204bf7a94278bd9584a (diff) | |
altosui: Create abstract AltosDevice class
This will wrap either USB or BT devices. The USB device constants have
been moved to Altos.java
Signed-off-by: Keith Packard <keithp@keithp.com>
| -rw-r--r-- | altosui/Altos.java | 79 | ||||
| -rw-r--r-- | altosui/AltosConfig.java | 4 | ||||
| -rw-r--r-- | altosui/AltosDevice.java | 166 | ||||
| -rw-r--r-- | altosui/AltosDeviceDialog.java | 2 | ||||
| -rw-r--r-- | altosui/AltosEepromManage.java | 4 | ||||
| -rw-r--r-- | altosui/AltosFlashUI.java | 2 | ||||
| -rw-r--r-- | altosui/AltosIgnite.java | 2 | ||||
| -rw-r--r-- | altosui/AltosIgniteUI.java | 2 | ||||
| -rw-r--r-- | altosui/AltosSerial.java | 2 | ||||
| -rw-r--r-- | altosui/AltosSerialInUseException.java | 6 | ||||
| -rw-r--r-- | altosui/AltosUI.java | 6 | ||||
| -rw-r--r-- | altosui/AltosUSBDevice.java | 103 | ||||
| -rw-r--r-- | altosui/Makefile.am | 1 | 
13 files changed, 206 insertions, 173 deletions
| diff --git a/altosui/Altos.java b/altosui/Altos.java index 1f791da5..5df004c5 100644 --- a/altosui/Altos.java +++ b/altosui/Altos.java @@ -21,6 +21,8 @@ import java.awt.*;  import java.util.*;  import java.text.*; +import libaltosJNI.*; +  public class Altos {  	/* EEProm command letters */  	static final int AO_LOG_FLIGHT = 'F'; @@ -222,4 +224,81 @@ public class Altos {  			input = input.substring(0,dot);  		return input.concat(extension);  	} + +	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; +		} +		return loaded_library; +	} + +	static int usb_vendor_altusmetrum() { +		if (load_library()) +			return libaltosConstants.USB_VENDOR_ALTUSMETRUM; +		return 0x000a; +	} + +	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_TELEDONGLE; +		return 0x000c; +	} + +	static int usb_product_teleterra() { +		if (load_library()) +			return libaltosConstants.USB_PRODUCT_TELETERRA; +		return 0x000d; +	} + +	static int usb_product_telebt() { +		if (load_library()) +			return libaltosConstants.USB_PRODUCT_TELEBT; +		return 0x000e; +	} + +	public final static int vendor_altusmetrum = usb_vendor_altusmetrum(); +	public final static int product_altusmetrum = usb_product_altusmetrum(); +	public final static int product_telemetrum = usb_product_telemetrum(); +	public final static int product_teledongle = usb_product_teledongle(); +	public final static int product_teleterra = usb_product_teleterra(); +	public final static int product_telebt = usb_product_telebt(); +	public final static int product_altusmetrum_min = usb_product_altusmetrum_min(); +	public final static int product_altusmetrum_max = usb_product_altusmetrum_max(); + +	public final static int product_any = 0x10000; +	public final static int product_basestation = 0x10000 + 1;  } diff --git a/altosui/AltosConfig.java b/altosui/AltosConfig.java index f45e2040..c5de83f2 100644 --- a/altosui/AltosConfig.java +++ b/altosui/AltosConfig.java @@ -344,11 +344,11 @@ public class AltosConfig implements ActionListener {  		version = new string_ref("unknown");  		product = new string_ref("unknown"); -		device = AltosDeviceDialog.show(owner, AltosDevice.product_any); +		device = AltosDeviceDialog.show(owner, Altos.product_any);  		if (device != null) {  			try {  				serial_line = new AltosSerial(device); -				if (!device.matchProduct(AltosDevice.product_telemetrum)) +				if (!device.matchProduct(Altos.product_telemetrum))  					remote = true;  				try {  					init_ui(); diff --git a/altosui/AltosDevice.java b/altosui/AltosDevice.java index b7aa38f6..3357c550 100644 --- a/altosui/AltosDevice.java +++ b/altosui/AltosDevice.java @@ -1,5 +1,5 @@  /* - * Copyright © 2010 Keith Packard <keithp@keithp.com> + * Copyright © 2011 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 @@ -20,159 +20,11 @@ import java.lang.*;  import java.util.*;  import libaltosJNI.*; -public class AltosDevice extends altos_device { - -	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; -		} -		return loaded_library; -	} - -	static int usb_vendor_altusmetrum() { -		if (load_library()) -			return libaltosConstants.USB_VENDOR_ALTUSMETRUM; -		return 0x000a; -	} - -	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_TELEDONGLE; -		return 0x000c; -	} - -	static int usb_product_teleterra() { -		if (load_library()) -			return libaltosConstants.USB_PRODUCT_TELETERRA; -		return 0x000d; -	} - -	static int usb_product_telebt() { -		if (load_library()) -			return libaltosConstants.USB_PRODUCT_TELEBT; -		return 0x000e; -	} - -	public final static int vendor_altusmetrum = usb_vendor_altusmetrum(); -	public final static int product_altusmetrum = usb_product_altusmetrum(); -	public final static int product_telemetrum = usb_product_telemetrum(); -	public final static int product_teledongle = usb_product_teledongle(); -	public final static int product_teleterra = usb_product_teleterra(); -	public final static int product_telebt = usb_product_telebt(); -	public final static int product_altusmetrum_min = usb_product_altusmetrum_min(); -	public final static int product_altusmetrum_max = usb_product_altusmetrum_max(); - -	public final static int product_any = 0x10000; -	public final static int product_basestation = 0x10000 + 1; - -	public String toString() { -		String	name = getName(); -		if (name == null) -			name = "Altus Metrum"; -		return String.format("%-20.20s %4d %s", -				     name, getSerial(), getPath()); -	} - -	public String toShortString() { -		String	name = getName(); -		if (name == null) -			name = "Altus Metrum"; -		return String.format("%s %d %s", -				     name, getSerial(), getPath()); - -	} - -	public boolean isAltusMetrum() { -		if (getVendor() != vendor_altusmetrum) -			return false; -		if (getProduct() < product_altusmetrum_min) -			return false; -		if (getProduct() > product_altusmetrum_max) -			return false; -		return true; -	} - -	public boolean matchProduct(int want_product) { - -		if (!isAltusMetrum()) -			return false; - -		if (want_product == product_any) -			return true; - -		if (want_product == product_basestation) -			return matchProduct(product_teledongle) || -				matchProduct(product_teleterra) || -				matchProduct(product_telebt); - -		int have_product = getProduct(); - -		if (have_product == product_altusmetrum)	/* old devices match any request */ -			return true; - -		if (want_product == have_product) -			return true; - -		return false; -	} - -	static AltosDevice[] list(int product) { -		if (!load_library()) -			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 +public interface AltosDevice { +	public abstract String toString(); +	public abstract String toShortString(); +	public abstract int getSerial(); +	public abstract String getPath(); +	public abstract boolean matchProduct(int product); +	public SWIGTYPE_p_altos_file open(); +} diff --git a/altosui/AltosDeviceDialog.java b/altosui/AltosDeviceDialog.java index 2966ad1e..154bf20b 100644 --- a/altosui/AltosDeviceDialog.java +++ b/altosui/AltosDeviceDialog.java @@ -37,7 +37,7 @@ public class AltosDeviceDialog extends JDialog implements ActionListener {  		Frame frame = JOptionPane.getFrameForComponent(frameComp);  		AltosDevice[]	devices; -		devices = AltosDevice.list(product); +		devices = AltosUSBDevice.list(product);  		if (devices != null && devices.length > 0) {  			value = null; diff --git a/altosui/AltosEepromManage.java b/altosui/AltosEepromManage.java index b46364db..cd2b74fe 100644 --- a/altosui/AltosEepromManage.java +++ b/altosui/AltosEepromManage.java @@ -197,7 +197,7 @@ public class AltosEepromManage implements ActionListener {  		boolean	running = false;  		frame = given_frame; -		device = AltosDeviceDialog.show(frame, AltosDevice.product_any); +		device = AltosDeviceDialog.show(frame, Altos.product_any);  		remote = false;  		any_download = false; @@ -206,7 +206,7 @@ public class AltosEepromManage implements ActionListener {  		if (device != null) {  			try {  				serial_line = new AltosSerial(device); -				if (!device.matchProduct(AltosDevice.product_telemetrum)) +				if (!device.matchProduct(Altos.product_telemetrum))  					remote = true;  				serial_line.set_frame(frame); diff --git a/altosui/AltosFlashUI.java b/altosui/AltosFlashUI.java index 0302ccd3..ad7aeac8 100644 --- a/altosui/AltosFlashUI.java +++ b/altosui/AltosFlashUI.java @@ -151,7 +151,7 @@ public class AltosFlashUI  		build_dialog(); -		debug_dongle = AltosDeviceDialog.show(frame, AltosDevice.product_any); +		debug_dongle = AltosDeviceDialog.show(frame, Altos.product_any);  		if (debug_dongle == null)  			return; diff --git a/altosui/AltosIgnite.java b/altosui/AltosIgnite.java index 1171d2ed..7a06c63d 100644 --- a/altosui/AltosIgnite.java +++ b/altosui/AltosIgnite.java @@ -172,7 +172,7 @@ public class AltosIgnite {  		serial = new AltosSerial(device);  		remote = false; -		if (!device.matchProduct(AltosDevice.product_telemetrum)) +		if (!device.matchProduct(Altos.product_telemetrum))  			remote = true;  	}  }
\ No newline at end of file diff --git a/altosui/AltosIgniteUI.java b/altosui/AltosIgniteUI.java index 000adc98..ad5b7cfb 100644 --- a/altosui/AltosIgniteUI.java +++ b/altosui/AltosIgniteUI.java @@ -275,7 +275,7 @@ public class AltosIgniteUI  	private boolean open() {  		command_queue = new LinkedBlockingQueue<String>(); -		device = AltosDeviceDialog.show(owner, AltosDevice.product_any); +		device = AltosDeviceDialog.show(owner, Altos.product_any);  		if (device != null) {  			try {  				AltosIgnite 	ignite = new AltosIgnite(device); diff --git a/altosui/AltosSerial.java b/altosui/AltosSerial.java index 111bd771..6c80b66f 100644 --- a/altosui/AltosSerial.java +++ b/altosui/AltosSerial.java @@ -304,7 +304,7 @@ public class AltosSerial implements Runnable {  				throw new AltosSerialInUseException(device);  			devices_opened.add(device.getPath());  		} -		altos = libaltos.altos_open(device); +		altos = device.open();  		if (altos == null) {  			close();  			throw new FileNotFoundException(device.toShortString()); diff --git a/altosui/AltosSerialInUseException.java b/altosui/AltosSerialInUseException.java index 4b108c7c..7380f331 100644 --- a/altosui/AltosSerialInUseException.java +++ b/altosui/AltosSerialInUseException.java @@ -17,12 +17,10 @@  package altosui; -import libaltosJNI.*; -  public class AltosSerialInUseException extends Exception { -	public altos_device	device; +	public AltosDevice	device; -	public AltosSerialInUseException (altos_device in_device) { +	public AltosSerialInUseException (AltosDevice in_device) {  		device = in_device;  	}  } diff --git a/altosui/AltosUI.java b/altosui/AltosUI.java index 73ddf979..0fc6583c 100644 --- a/altosui/AltosUI.java +++ b/altosui/AltosUI.java @@ -34,7 +34,7 @@ public class AltosUI extends JFrame {  	public AltosVoice voice = new AltosVoice();  	public static boolean load_library(Frame frame) { -		if (!AltosDevice.load_library()) { +		if (!Altos.load_library()) {  			JOptionPane.showMessageDialog(frame,  						      String.format("No AltOS library in \"%s\"",  								    System.getProperty("java.library.path","<undefined>")), @@ -203,7 +203,7 @@ public class AltosUI extends JFrame {  		bt_manage = new AltosBTManage(AltosBTDevice.bt_product_any, this);  		bt_manage.list();  		AltosDevice	device = AltosDeviceDialog.show(AltosUI.this, -								AltosDevice.product_basestation); +								Altos.product_basestation);  		if (device != null)  			telemetry_window(device); @@ -401,7 +401,7 @@ public class AltosUI extends JFrame {  			AltosUI altosui = new AltosUI();  			altosui.setVisible(true); -			AltosDevice[] devices = AltosDevice.list(AltosDevice.product_basestation); +			AltosDevice[] devices = AltosUSBDevice.list(Altos.product_basestation);  			for (int i = 0; i < devices.length; i++)  				altosui.telemetry_window(devices[i]);  		} diff --git a/altosui/AltosUSBDevice.java b/altosui/AltosUSBDevice.java new file mode 100644 index 00000000..03ddf5a8 --- /dev/null +++ b/altosui/AltosUSBDevice.java @@ -0,0 +1,103 @@ +/* + * 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 AltosUSBDevice  extends altos_device implements AltosDevice { + +	public String toString() { +		String	name = getName(); +		if (name == null) +			name = "Altus Metrum"; +		return String.format("%-20.20s %4d %s", +				     name, getSerial(), getPath()); +	} + +	public String toShortString() { +		String	name = getName(); +		if (name == null) +			name = "Altus Metrum"; +		return String.format("%s %d %s", +				     name, getSerial(), getPath()); + +	} + +	public SWIGTYPE_p_altos_file open() { +		return libaltos.altos_open(this); +	} + +	public boolean isAltusMetrum() { +		if (getVendor() != Altos.vendor_altusmetrum) +			return false; +		if (getProduct() < Altos.product_altusmetrum_min) +			return false; +		if (getProduct() > Altos.product_altusmetrum_max) +			return false; +		return true; +	} + +	public boolean matchProduct(int want_product) { + +		if (!isAltusMetrum()) +			return false; + +		if (want_product == Altos.product_any) +			return true; + +		if (want_product == Altos.product_basestation) +			return matchProduct(Altos.product_teledongle) || +				matchProduct(Altos.product_teleterra) || +				matchProduct(Altos.product_telebt); + +		int have_product = getProduct(); + +		if (have_product == Altos.product_altusmetrum)	/* old devices match any request */ +			return true; + +		if (want_product == have_product) +			return true; + +		return false; +	} + +	static AltosUSBDevice[] list(int product) { +		if (!Altos.load_library()) +			return null; + +		SWIGTYPE_p_altos_list list = libaltos.altos_list_start(); + +		ArrayList<AltosUSBDevice> device_list = new ArrayList<AltosUSBDevice>(); +		if (list != null) { +			for (;;) { +				AltosUSBDevice device = new AltosUSBDevice(); +				if (libaltos.altos_list_next(list, device) == 0) +					break; +				if (device.matchProduct(product)) +					device_list.add(device); +			} +			libaltos.altos_list_finish(list); +		} + +		AltosUSBDevice[] devices = new AltosUSBDevice[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 diff --git a/altosui/Makefile.am b/altosui/Makefile.am index 37a40eaa..f2de4a3a 100644 --- a/altosui/Makefile.am +++ b/altosui/Makefile.am @@ -26,6 +26,7 @@ altosui_JAVA = \  	AltosDescent.java \  	AltosDeviceDialog.java \  	AltosDevice.java \ +	AltosUSBDevice.java \  	AltosBTDevice.java \  	AltosBTDeviceIterator.java \  	AltosBTManage.java \ | 
