diff options
296 files changed, 3093 insertions, 885 deletions
| diff --git a/Makefile.am b/Makefile.am index 0bb01619..4145946e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -6,6 +6,12 @@ MAINTAINERCLEANFILES = ChangeLog  .PHONY: ChangeLog +all: pdclib/Makefile +all-recursive: pdclib/Makefile + +pdclib/Makefile: +	git submodule update +  ChangeLog:  	(GIT_DIR=$(top_srcdir)/.git git log > .changelog.tmp && mv .changelog.tmp ChangeLog; rm -f .changelog.tmp) || \  	(touch ChangeLog; echo 'git directory not found: installing possibly empty changelog.' >&2) @@ -42,9 +48,25 @@ fat_android = \  	altosdroid/bin/AltosDroid-debug.apk \  	altosdroid/bin/AltosDroid-release.apk +fat_altos = \ +	src/easymega-v1.0/easymega-v1.0-$(VERSION).ihx \ +	src/easymini-v1.0/easymini-v1.0-$(VERSION).ihx \ +	src/telebt-v1.0/telebt-v1.0-$(VERSION).ihx \ +	src/telebt-v3.0/telebt-v3.0-$(VERSION).ihx \ +	src/teledongle-v0.2/teledongle-v0.2-$(VERSION).ihx \ +	src/teledongle-v3.0/teledongle-v3.0-$(VERSION).ihx \ +	src/telegps-v1.0/telegps-v1.0-$(VERSION).ihx \ +	src/telemega-v1.0/telemega-v1.0-$(VERSION).ihx \ +	src/telemega-v2.0/telemega-v2.0-$(VERSION).ihx \ +	src/telemetrum-v1.0/telemetrum-v1.0-$(VERSION).ihx \ +	src/telemetrum-v1.1/telemetrum-v1.1-$(VERSION).ihx \ +	src/telemetrum-v1.2/telemetrum-v1.2-$(VERSION).ihx \ +	src/telemetrum-v2.0/telemetrum-v2.0-$(VERSION).ihx \ +	src/telemini-v1.0/telemini-v1.0-$(VERSION).ihx +  keithp-fat: fat  	ssh keithp.com mkdir -p public_html/altos-$(VERSION) -	scp -p $(fat_linux) $(fat_mac) $(fat_windows) $(fat_android) keithp.com:public_html/altos-$(VERSION) +	scp -p $(fat_linux) $(fat_mac) $(fat_windows) $(fat_android) $(fat_altos) keithp.com:public_html/altos-$(VERSION)  set-java-versions:  	$(top_srcdir)/fix-java-versions org.altusmetrum.altoslib=$(ALTOSLIB_VERSION) org.altusmetrum.altosuilib=$(ALTOSUILIB_VERSION) @@ -21,10 +21,10 @@ These are Bdale's notes on how to do a release.  		git checkout branch-<version>		# the x.y parts only  		- cherry-pick or merge appropriate content from master -	- make sure there is a doc/release-notes-<version>.xsl -	- make sure that doc/altusmetrum.xsl has the right copyright year, -	  and add release to the revision history at the front (release notes -	  will be pulled in automatically) +	- make sure there is a doc/release-notes-<version>.inc +	- make sure that doc/altusmetrum-docinfo.xml has the right copyright  +	  year, and add release to the revision history at the front (release  +	  notes will be pulled in automatically)  	- make absolutely sure checked-out tree is "clean"   	- make absolutely sure the pdclib/ submodule is on the master branch,  	  up to date, and "clean" @@ -89,7 +89,7 @@ These are Bdale's notes on how to do a release.  	(cd ~/altusmetrumllc ; git add Binaries ; git commit -a)   	(cd ~/altusmetrumllc ; git push)  -	- copy the relevant release notes file from doc/ to  +	- copy the relevant release notes .html file from doc/ to   	    /home/bdale/web/altusmetrum/AltOS/releases/<rev>  	(cd ~/web/altusmetrum/AltOS/releases/<rev> ; rm *.tar.bz2) diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java index 15efc0e2..246fb0b0 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosBluetooth.java @@ -30,7 +30,7 @@ import android.bluetooth.BluetoothSocket;  import android.os.Handler;  //import android.os.Message; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosBluetooth extends AltosDroidLink { @@ -199,6 +199,8 @@ public class AltosBluetooth extends AltosDroidLink {  	}  	int write(byte[] buffer, int len) { +		if (output == null) +			return -1;  		try {  			output.write(buffer, 0, len);  		} catch (IOException ie) { @@ -208,6 +210,8 @@ public class AltosBluetooth extends AltosDroidLink {  	}  	int read(byte[] buffer, int len) { +		if (input == null) +			return -1;  		try {  			return input.read(buffer, 0, len);  		} catch (IOException ie) { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java index 64980dc7..eddc83b9 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDebug.java @@ -20,7 +20,7 @@ import java.util.Arrays;  import java.io.*;  import java.lang.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import android.app.Activity;  import android.graphics.*; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java index 026e836d..a62bf7fe 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java @@ -51,7 +51,7 @@ import android.hardware.usb.*;  import android.graphics.*;  import android.graphics.drawable.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosDroid extends FragmentActivity implements AltosUnitsListener, LocationListener { @@ -825,9 +825,9 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener,  		}  	} -	private void disconnectDevice() { +	private void disconnectDevice(boolean remember) {  		try { -			mService.send(Message.obtain(null, TelemetryService.MSG_DISCONNECT, null)); +			mService.send(Message.obtain(null, TelemetryService.MSG_DISCONNECT, (Boolean) remember));  		} catch (RemoteException e) {  		}  	} @@ -978,11 +978,11 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener,  		case R.id.disconnect:  			/* Disconnect the device  			 */ -			disconnectDevice(); +			disconnectDevice(false);  			return true;  		case R.id.quit:  			AltosDebug.debug("R.id.quit"); -			disconnectDevice(); +			disconnectDevice(true);  			finish();  			return true;  		case R.id.setup: diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java index 0fd9af75..bca70d69 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidLink.java @@ -24,7 +24,7 @@ import java.util.UUID;  import android.os.Handler; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public abstract class AltosDroidLink extends AltosLink { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidMapInterface.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidMapInterface.java index 43abef0f..b9b4b50f 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidMapInterface.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidMapInterface.java @@ -20,7 +20,7 @@ package org.altusmetrum.AltosDroid;  import java.util.*;  import java.io.*;  import android.location.Location; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public interface AltosDroidMapInterface {  	public void onCreateView(AltosDroid altos_droid); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java index dd86c818..446bbf04 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java @@ -21,7 +21,7 @@ import java.util.*;  import java.text.*;  import android.content.Context; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosDroidPreferences extends AltosPreferences { @@ -57,8 +57,13 @@ public class AltosDroidPreferences extends AltosPreferences {  	public static void set_active_device(DeviceAddress address) {  		synchronized(backend) {  			active_device_address = address; -			backend.putString(activeDeviceAddressPreference, active_device_address.address); -			backend.putString(activeDeviceNamePreference, active_device_address.name); +			if (active_device_address != null) { +				backend.putString(activeDeviceAddressPreference, active_device_address.address); +				backend.putString(activeDeviceNamePreference, active_device_address.name); +			} else { +				backend.remove(activeDeviceAddressPreference); +				backend.remove(activeDeviceNamePreference); +			}  			flush_preferences();  		}  	} diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java index 5c7ec513..e48b7b2a 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferencesBackend.java @@ -24,7 +24,7 @@ import android.content.SharedPreferences;  import android.os.Environment;  import android.util.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosDroidPreferencesBackend extends AltosPreferencesBackend {  	public final static String        NAME    = "org.altusmetrum.AltosDroid"; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java index 77dbbcb1..3e10d3a4 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java @@ -17,7 +17,7 @@  package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import android.location.Location;  import android.app.Activity;  import android.graphics.Color; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java index ab142b17..0061eba1 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOffline.java @@ -20,7 +20,7 @@ package org.altusmetrum.AltosDroid;  import java.util.*;  import java.io.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import android.app.Activity;  import android.graphics.*; @@ -85,6 +85,8 @@ public class AltosMapOffline extends View implements ScaleGestureDetector.OnScal  	AltosMap		map;  	AltosDroid		altos_droid; +	static int scale = 2; +  	AltosLatLon	here;  	AltosLatLon	there;  	AltosLatLon	pad; @@ -181,14 +183,14 @@ public class AltosMapOffline extends View implements ScaleGestureDetector.OnScal  			}  		} -		public MapTile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size) { -			super(cache, upper_left, center, zoom, maptype, px_size, 2); +		public MapTile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size, int scale) { +			super(cache, upper_left, center, zoom, maptype, px_size, scale);  		}  	} -	public AltosMapTile new_tile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size) { -		return new MapTile(cache, upper_left, center, zoom, maptype, px_size); +	public AltosMapTile new_tile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size, int scale) { +		return new MapTile(cache, upper_left, center, zoom, maptype, px_size, scale);  	}  	public AltosMapPath new_path() { @@ -492,7 +494,7 @@ public class AltosMapOffline extends View implements ScaleGestureDetector.OnScal  	public void onCreateView(AltosDroid altos_droid) {  		this.altos_droid = altos_droid; -		map = new AltosMap(this); +		map = new AltosMap(this, scale);  		AltosPreferences.register_map_type_listener(this);  		map.set_maptype(AltosPreferences.map_type()); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java index fcdb930b..9a828df5 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosMapOnline.java @@ -19,7 +19,7 @@ package org.altusmetrum.AltosDroid;  import java.util.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import com.google.android.gms.maps.*;  import com.google.android.gms.maps.model.*; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java index 4660512a..4b007cb1 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosUsb.java @@ -28,7 +28,7 @@ import android.hardware.usb.*;  import android.app.*;  import android.os.Handler; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosUsb extends AltosDroidLink { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java index 542ba1f5..d7c0f623 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java @@ -22,7 +22,7 @@ import android.speech.tts.TextToSpeech;  import android.speech.tts.TextToSpeech.OnInitListener;  import android.location.Location; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosVoice { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/IdleModeActivity.java b/altosdroid/src/org/altusmetrum/AltosDroid/IdleModeActivity.java index ec12c192..c4e950b6 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/IdleModeActivity.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/IdleModeActivity.java @@ -34,7 +34,7 @@ import android.view.View.OnClickListener;  import android.widget.*;  import android.widget.AdapterView.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class IdleModeActivity extends Activity {  	private EditText callsign; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/IgniterActivity.java b/altosdroid/src/org/altusmetrum/AltosDroid/IgniterActivity.java index 931c3cfd..d9229ad6 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/IgniterActivity.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/IgniterActivity.java @@ -32,7 +32,7 @@ import android.view.View.*;  import android.widget.*;  import android.widget.AdapterView.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  class IgniterItem {  	public String name; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/ManageFrequenciesActivity.java b/altosdroid/src/org/altusmetrum/AltosDroid/ManageFrequenciesActivity.java index 401cdc9d..d8fd92df 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/ManageFrequenciesActivity.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/ManageFrequenciesActivity.java @@ -32,7 +32,7 @@ import android.view.inputmethod.*;  import android.widget.*;  import android.widget.AdapterView.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  class FrequencyItem {  	public AltosFrequency frequency; @@ -125,6 +125,8 @@ public class ManageFrequenciesActivity extends Activity {  	private void done() { +		set(); +  		if (changed) {  			AltosFrequency[] frequencies = new AltosFrequency[frequencies_adapter.count()];  			for (int i = 0; i < frequencies.length; i++) @@ -164,6 +166,16 @@ public class ManageFrequenciesActivity extends Activity {  		load_item();  	} +	private int find(AltosFrequency frequency) { +		for (int pos = 0; pos < frequencies_adapter.getCount(); pos++) { +			FrequencyItem	item = frequencies_adapter.getItem(pos); +			if (item.frequency.frequency == frequency.frequency && +			    item.frequency.description.equals(frequency.description)) +				return pos; +		} +		return -1; +	} +  	private int insert_item(AltosFrequency frequency) {  		FrequencyItem new_item = new FrequencyItem(frequency);  		int	pos; @@ -200,11 +212,16 @@ public class ManageFrequenciesActivity extends Activity {  		try {  			double	f = AltosParse.parse_double_locale(frequency_text); +			AltosFrequency frequency = new AltosFrequency(f, description_text); +			int pos; -			int pos = insert_item(new AltosFrequency(f, description_text)); +			pos = find(frequency); +			if (pos < 0) { +				pos = insert_item(frequency); +				changed = true; +			}  			frequencies_adapter.selected_item = -1;  			select_item(pos); -			changed = true;  		} catch (ParseException pe) {  		}  		hide_keyboard(); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/MapTypeActivity.java b/altosdroid/src/org/altusmetrum/AltosDroid/MapTypeActivity.java index cfbcdafc..d8bcad75 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/MapTypeActivity.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/MapTypeActivity.java @@ -34,7 +34,7 @@ import android.view.View.OnClickListener;  import android.widget.*;  import android.widget.AdapterView.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class MapTypeActivity extends Activity {  	private Button hybrid; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/PreloadMapActivity.java b/altosdroid/src/org/altusmetrum/AltosDroid/PreloadMapActivity.java index 13a44e1f..8e3e7b01 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/PreloadMapActivity.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/PreloadMapActivity.java @@ -41,7 +41,7 @@ import android.location.LocationManager;  import android.location.LocationListener;  import android.location.Criteria; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  /**   * This Activity appears as a dialog. It lists any paired devices and @@ -49,7 +49,7 @@ import org.altusmetrum.altoslib_10.*;   * by the user, the MAC address of the device is sent back to the parent   * Activity in the result Intent.   */ -public class PreloadMapActivity extends Activity implements AltosLaunchSiteListener, AltosMapInterface, AltosMapLoaderListener, LocationListener { +public class PreloadMapActivity extends Activity implements AltosLaunchSiteListener, AltosMapLoaderListener, LocationListener {  	private ArrayAdapter<AltosLaunchSite> known_sites_adapter; @@ -69,8 +69,14 @@ public class PreloadMapActivity extends Activity implements AltosLaunchSiteListe  	private ProgressBar	progress; +	private AltosMapLoader	loader; + +	long	loader_notify_time; +  	/* AltosMapLoaderListener interfaces */  	public void loader_start(final int max) { +		loader_notify_time = System.currentTimeMillis(); +  		this.runOnUiThread(new Runnable() {  				public void run() {  					progress.setMax(max); @@ -80,6 +86,13 @@ public class PreloadMapActivity extends Activity implements AltosLaunchSiteListe  	}  	public void loader_notify(final int cur, final int max, final String name) { +		long	now = System.currentTimeMillis(); + +		if (now - loader_notify_time < 100) +			return; + +		loader_notify_time = now; +  		this.runOnUiThread(new Runnable() {  				public void run() {  					progress.setProgress(cur); @@ -88,6 +101,7 @@ public class PreloadMapActivity extends Activity implements AltosLaunchSiteListe  	}  	public void loader_done(int max) { +		loader = null;  		this.runOnUiThread(new Runnable() {  				public void run() {  					progress.setProgress(0); @@ -96,7 +110,12 @@ public class PreloadMapActivity extends Activity implements AltosLaunchSiteListe  			});  	} +	public void debug(String format, Object ... arguments) { +		AltosDebug.debug(format, arguments); +	} +  	/* AltosLaunchSiteListener interface */ +  	public void notify_launch_sites(final List<AltosLaunchSite> sites) {  		this.runOnUiThread(new Runnable() {  				public void run() { @@ -106,70 +125,6 @@ public class PreloadMapActivity extends Activity implements AltosLaunchSiteListe  			});  	} -	AltosMap	map; - -	class PreloadMapImage implements AltosImage { -		public void flush() { -		} - -		public PreloadMapImage(File file) { -		} -	} - -	public AltosMapPath new_path() { -		return null; -	} - -	public AltosMapLine new_line() { -		return null; -	} - -	public AltosImage load_image(File file) throws Exception { -		return new PreloadMapImage(file); -	} - -	public AltosMapMark new_mark(double lat, double lon, int state) { -		return null; -	} - -	class PreloadMapTile extends AltosMapTile { -		public void paint(AltosMapTransform t) { -		} - -		public PreloadMapTile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size) { -			super(cache, upper_left, center, zoom, maptype, px_size, 2); -		} - -	} - -	public AltosMapTile new_tile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size) { -		return new PreloadMapTile(cache, upper_left, center, zoom, maptype, px_size); -	} - -	public int width() { -		return AltosMap.px_size; -	} - -	public int height() { -		return AltosMap.px_size; -	} - -	public void repaint() { -	} - -	public void repaint(AltosRectangle damage) { -	} - -	public void set_zoom_label(String label) { -	} - -	public void select_object(AltosLatLon latlon) { -	} - -	public void debug(String format, Object ... arguments) { -		AltosDebug.debug(format, arguments); -	} -  	/* LocationProvider interface */  	AltosLaunchSite	current_location_site; @@ -234,7 +189,7 @@ public class PreloadMapActivity extends Activity implements AltosLaunchSiteListe  	private double radius() {  		double r = value_distance(radius);  		if (AltosPreferences.imperial_units()) -			r = AltosConvert.distance.inverse(r); +			r = AltosConvert.miles_to_meters(r);  		else  			r = r * 1000;  		return r; @@ -254,6 +209,9 @@ public class PreloadMapActivity extends Activity implements AltosLaunchSiteListe  	}  	private void load() { +		if (loader != null) +			return; +  		try {  			double	lat = latitude();  			double	lon = longitude(); @@ -264,7 +222,7 @@ public class PreloadMapActivity extends Activity implements AltosLaunchSiteListe  			AltosDebug.debug("PreloadMap load %f %f %d %d %f %d\n",  					 lat, lon, min, max, r, t); -			new AltosMapLoader(map, this, lat, lon, min, max, r, t); +			loader = new AltosMapLoader(this, lat, lon, min, max, r, t, AltosMapOffline.scale);  		} catch (ParseException e) {  			AltosDebug.debug("PreloadMap load raised exception %s", e.toString());  		} @@ -395,8 +353,6 @@ public class PreloadMapActivity extends Activity implements AltosLaunchSiteListe  		known_sites_spinner.setAdapter(known_sites_adapter);  		known_sites_spinner.setOnItemSelectedListener(new SiteListListener()); -		map = new AltosMap(this); -  		// Listen for GPS and Network position updates  		LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); @@ -409,6 +365,9 @@ public class PreloadMapActivity extends Activity implements AltosLaunchSiteListe  	protected void onDestroy() {  		super.onDestroy(); +		if (loader != null) +			loader.abort(); +  		// Stop listening for location updates  		((LocationManager) getSystemService(Context.LOCATION_SERVICE)).removeUpdates(this);  	} diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/SetupActivity.java b/altosdroid/src/org/altusmetrum/AltosDroid/SetupActivity.java index fdffc2b0..06e74d9b 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/SetupActivity.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/SetupActivity.java @@ -30,7 +30,7 @@ import android.view.View.*;  import android.widget.*;  import android.widget.AdapterView.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class SetupActivity extends Activity {  	private Spinner select_rate; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java index 9bbdc060..dc8390e3 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabFlight.java @@ -17,7 +17,7 @@  package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import android.app.Activity;  import android.os.Bundle; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java index 19ce86c9..9e3cb530 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java @@ -20,7 +20,7 @@ package org.altusmetrum.AltosDroid;  import java.util.*;  import java.io.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import android.app.Activity;  import android.graphics.*; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java index 1194eb00..fffc426a 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java @@ -17,7 +17,7 @@  package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import android.app.Activity;  import android.os.Bundle; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java index 8742227b..b0fe9e5f 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java @@ -17,7 +17,7 @@  package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import android.app.Activity;  import android.os.Bundle; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java index bdea0986..c379d3d8 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryLogger.java @@ -1,6 +1,6 @@  package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import android.content.BroadcastReceiver;  import android.content.Context; diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java index 0ac6bb5c..21ac0fbf 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java @@ -25,7 +25,7 @@ import java.util.*;  import java.util.concurrent.*;  import android.os.Handler; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class TelemetryReader extends Thread { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java index 3c1a1782..dc39c899 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java @@ -40,7 +40,7 @@ import android.os.Looper;  import android.widget.Toast;  import android.location.Criteria; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class TelemetryService extends Service implements AltosIdleMonitorListener { @@ -129,6 +129,8 @@ public class TelemetryService extends Service implements AltosIdleMonitorListene  			case MSG_DISCONNECT:  				AltosDebug.debug("Disconnect command received");  				s.address = null; +				if (!(Boolean) msg.obj) +					AltosDroidPreferences.set_active_device(null);  				s.disconnect(true);  				break;  			case MSG_DELETE_SERIAL: @@ -612,6 +614,8 @@ public class TelemetryService extends Service implements AltosIdleMonitorListene  		telemetry_state.latest_serial = AltosPreferences.latest_state(); +		AltosDebug.debug("latest serial %d\n", telemetry_state.latest_serial); +  		for (int serial : serials) {  			AltosState saved_state = AltosPreferences.state(serial);  			if (saved_state != null) { @@ -628,6 +632,7 @@ public class TelemetryService extends Service implements AltosIdleMonitorListene  				telemetry_state.states.put(serial, saved_state);  			} else {  				AltosDebug.debug("Failed to recover state for %d", serial); +				AltosPreferences.remove_state(serial);  			}  		}  	} diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java index d3ccf0a9..e7bef92c 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryState.java @@ -18,7 +18,7 @@  package org.altusmetrum.AltosDroid;  import java.util.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import android.location.Location;  public class TelemetryState { diff --git a/altoslib/AltosAccel.java b/altoslib/AltosAccel.java index 2c563f66..c6a2da11 100644 --- a/altoslib/AltosAccel.java +++ b/altoslib/AltosAccel.java @@ -15,11 +15,11 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*; -public class AltosAccel extends AltosUnits implements Serializable { +public class AltosAccel extends AltosUnits {  	public double value(double v, boolean imperial_units) {  		if (imperial_units) diff --git a/altoslib/AltosCRCException.java b/altoslib/AltosCRCException.java index 03dad137..87d84370 100644 --- a/altoslib/AltosCRCException.java +++ b/altoslib/AltosCRCException.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosCRCException extends Exception {  	public int rssi; diff --git a/altoslib/AltosCSV.java b/altoslib/AltosCSV.java index fa515b31..b38ed8da 100644 --- a/altoslib/AltosCSV.java +++ b/altoslib/AltosCSV.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosCompanion.java b/altoslib/AltosCompanion.java index dc33dacc..e228b074 100644 --- a/altoslib/AltosCompanion.java +++ b/altoslib/AltosCompanion.java @@ -15,11 +15,11 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*; -public class AltosCompanion implements Serializable { +public class AltosCompanion {  	public final static int	board_id_telescience = 0x0a;  	public final static int	MAX_CHANNELS = 12; @@ -37,4 +37,9 @@ public class AltosCompanion implements Serializable {  			channels = MAX_CHANNELS;  		companion_data = new int[channels];  	} + +	public AltosCompanion() { +		channels = 0; +		companion_data = new int[0]; +	}  } diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java index 812296f3..ce430d7a 100644 --- a/altoslib/AltosConfigData.java +++ b/altoslib/AltosConfigData.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.util.*;  import java.text.*; @@ -204,7 +204,7 @@ public class AltosConfigData implements Iterable<String> {  		for (int i = 0; i < parts.length; i++) {  			try { -				r[i] = AltosLib.fromdec(parts[i]); +				r[i] = (int) AltosLib.fromdec(parts[i]);  			} catch (NumberFormatException n) {  				r[i] = 0;  			} diff --git a/altoslib/AltosConfigDataException.java b/altoslib/AltosConfigDataException.java index 75cd1695..a55f75c2 100644 --- a/altoslib/AltosConfigDataException.java +++ b/altoslib/AltosConfigDataException.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosConfigDataException extends Exception { diff --git a/altoslib/AltosConfigValues.java b/altoslib/AltosConfigValues.java index aab0892a..babd7a4d 100644 --- a/altoslib/AltosConfigValues.java +++ b/altoslib/AltosConfigValues.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public interface AltosConfigValues {  	/* set and get all of the dialog values */ diff --git a/altoslib/AltosConvert.java b/altoslib/AltosConvert.java index 265b5f0f..5498ae98 100644 --- a/altoslib/AltosConvert.java +++ b/altoslib/AltosConvert.java @@ -18,7 +18,7 @@  /*   * Sensor data conversion functions   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosConvert {  	/* diff --git a/altoslib/AltosDebug.java b/altoslib/AltosDebug.java index e93c2d2d..0bb12688 100644 --- a/altoslib/AltosDebug.java +++ b/altoslib/AltosDebug.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*; diff --git a/altoslib/AltosDistance.java b/altoslib/AltosDistance.java index b68a4525..1ade5abb 100644 --- a/altoslib/AltosDistance.java +++ b/altoslib/AltosDistance.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosDistance extends AltosUnits { @@ -54,4 +54,58 @@ public class AltosDistance extends AltosUnits {  			return 1;  		return 0;  	} -}
\ No newline at end of file + +	public AltosDistance() { +		range_metric = new AltosUnitsRange[2]; + +		range_metric[0] = new AltosUnitsRange(0, "m", "meters") { +				double value(double v) { +					return v; +				} +				int show_fraction(int width) { +					return width / 9; +				} +				int say_fraction() { +					return 0; +				} +			}; +		range_metric[1] = new AltosUnitsRange(2000, "km", "kilometers") { +				double value(double v) { +					return v / 1000; +				} +				int show_fraction(int width) { +					return width / 5; +				} +				int say_fraction() { +					return 1; +				} +			}; + +		range_imperial = new AltosUnitsRange[2]; + +		range_imperial[0] = new AltosUnitsRange(0, "ft", "feet") { +				double value(double v) { +					return AltosConvert.meters_to_feet(v); +				} +				int show_fraction(int width) { +					return width / 9; +				} +				int say_fraction() { +					return 0; +				} +			}; + +		range_imperial[1] = new AltosUnitsRange(AltosConvert.feet_to_meters(1000), +							"mi", "miles") { +				double value(double v) { +					return AltosConvert.meters_to_miles(v); +				} +				int show_fraction(int width) { +					return width / 5; +				} +				int say_fraction() { +					return 1; +				} +			}; +	} +} diff --git a/altoslib/AltosEeprom.java b/altoslib/AltosEeprom.java index 5f0a349f..94009b57 100644 --- a/altoslib/AltosEeprom.java +++ b/altoslib/AltosEeprom.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromChunk.java b/altoslib/AltosEepromChunk.java index 7a80e294..4f956636 100644 --- a/altoslib/AltosEepromChunk.java +++ b/altoslib/AltosEepromChunk.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.text.*;  import java.util.concurrent.*; diff --git a/altoslib/AltosEepromDownload.java b/altoslib/AltosEepromDownload.java index 1a02cb9c..fa76574c 100644 --- a/altoslib/AltosEepromDownload.java +++ b/altoslib/AltosEepromDownload.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromFile.java b/altoslib/AltosEepromFile.java index 000bb1be..d23116a6 100644 --- a/altoslib/AltosEepromFile.java +++ b/altoslib/AltosEepromFile.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromGPS.java b/altoslib/AltosEepromGPS.java index a0a074ee..a6d2ef32 100644 --- a/altoslib/AltosEepromGPS.java +++ b/altoslib/AltosEepromGPS.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromHeader.java b/altoslib/AltosEepromHeader.java index 6c8c56d4..1f94ac07 100644 --- a/altoslib/AltosEepromHeader.java +++ b/altoslib/AltosEepromHeader.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromIterable.java b/altoslib/AltosEepromIterable.java index 97bb9285..c0311b99 100644 --- a/altoslib/AltosEepromIterable.java +++ b/altoslib/AltosEepromIterable.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromList.java b/altoslib/AltosEepromList.java index 4d511ead..abc30a71 100644 --- a/altoslib/AltosEepromList.java +++ b/altoslib/AltosEepromList.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromLog.java b/altoslib/AltosEepromLog.java index f0ed2db4..9eb5d230 100644 --- a/altoslib/AltosEepromLog.java +++ b/altoslib/AltosEepromLog.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.text.*;  import java.util.concurrent.*; diff --git a/altoslib/AltosEepromMega.java b/altoslib/AltosEepromMega.java index 29f0aa90..09fb4288 100644 --- a/altoslib/AltosEepromMega.java +++ b/altoslib/AltosEepromMega.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromMetrum2.java b/altoslib/AltosEepromMetrum2.java index 5662c8e5..f23bffd2 100644 --- a/altoslib/AltosEepromMetrum2.java +++ b/altoslib/AltosEepromMetrum2.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromMini.java b/altoslib/AltosEepromMini.java index f429a0e8..b06e6c84 100644 --- a/altoslib/AltosEepromMini.java +++ b/altoslib/AltosEepromMini.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromMonitor.java b/altoslib/AltosEepromMonitor.java index a966c631..9f6094a5 100644 --- a/altoslib/AltosEepromMonitor.java +++ b/altoslib/AltosEepromMonitor.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public interface AltosEepromMonitor { diff --git a/altoslib/AltosEepromTM.java b/altoslib/AltosEepromTM.java index 7a27a234..a65bd11e 100644 --- a/altoslib/AltosEepromTM.java +++ b/altoslib/AltosEepromTM.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosEepromTMini.java b/altoslib/AltosEepromTMini.java index 8f01c088..82f5aedf 100644 --- a/altoslib/AltosEepromTMini.java +++ b/altoslib/AltosEepromTMini.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosFile.java b/altoslib/AltosFile.java index d1d17610..dc2dba82 100644 --- a/altoslib/AltosFile.java +++ b/altoslib/AltosFile.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.File;  import java.util.*; diff --git a/altoslib/AltosFlash.java b/altoslib/AltosFlash.java index d79edf68..285e31d5 100644 --- a/altoslib/AltosFlash.java +++ b/altoslib/AltosFlash.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*; diff --git a/altoslib/AltosFlashListener.java b/altoslib/AltosFlashListener.java index 8d171baf..170bf0b0 100644 --- a/altoslib/AltosFlashListener.java +++ b/altoslib/AltosFlashListener.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public interface AltosFlashListener {  	public void position(String label, int percent); diff --git a/altoslib/AltosFlightDisplay.java b/altoslib/AltosFlightDisplay.java index 4b57526a..5a6d88d1 100644 --- a/altoslib/AltosFlightDisplay.java +++ b/altoslib/AltosFlightDisplay.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public interface AltosFlightDisplay extends AltosUnitsListener, AltosFontListener {  	void reset(); diff --git a/altoslib/AltosFlightReader.java b/altoslib/AltosFlightReader.java index 62f24e9f..77711a4c 100644 --- a/altoslib/AltosFlightReader.java +++ b/altoslib/AltosFlightReader.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.text.*;  import java.io.*; diff --git a/altoslib/AltosFlightStats.java b/altoslib/AltosFlightStats.java index 1c7d67e0..32314b2b 100644 --- a/altoslib/AltosFlightStats.java +++ b/altoslib/AltosFlightStats.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*; diff --git a/altoslib/AltosFontListener.java b/altoslib/AltosFontListener.java index 565f50e4..9a1622d9 100644 --- a/altoslib/AltosFontListener.java +++ b/altoslib/AltosFontListener.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public interface AltosFontListener {  	void font_size_changed(int font_size); diff --git a/altoslib/AltosFrequency.java b/altoslib/AltosFrequency.java index 9542fe33..874a9bcc 100644 --- a/altoslib/AltosFrequency.java +++ b/altoslib/AltosFrequency.java @@ -15,13 +15,13 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*;  import java.text.*; -public class AltosFrequency implements Serializable { +public class AltosFrequency {  	public double	frequency;  	public String	description; @@ -57,7 +57,6 @@ public class AltosFrequency implements Serializable {  		return diff < 0.010;  	} -  	public AltosFrequency(double f, String d) {  		frequency = f;  		description = d; diff --git a/altoslib/AltosGPS.java b/altoslib/AltosGPS.java index c5290a3a..d29ccdd1 100644 --- a/altoslib/AltosGPS.java +++ b/altoslib/AltosGPS.java @@ -15,13 +15,13 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.text.*;  import java.util.concurrent.*;  import java.io.*; -public class AltosGPS implements Cloneable, Serializable { +public class AltosGPS implements Cloneable {  	public final static int MISSING = AltosLib.MISSING; diff --git a/altoslib/AltosGPSSat.java b/altoslib/AltosGPSSat.java index c853b634..8b95c150 100644 --- a/altoslib/AltosGPSSat.java +++ b/altoslib/AltosGPSSat.java @@ -15,12 +15,14 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; + +import java.io.*;  import java.text.*; +import java.util.*;  import java.util.concurrent.*; -import java.io.*; -public class AltosGPSSat implements Serializable { +public class AltosGPSSat {  	public int	svid;  	public int	c_n0; diff --git a/altoslib/AltosGreatCircle.java b/altoslib/AltosGreatCircle.java index de3904bf..a2f12807 100644 --- a/altoslib/AltosGreatCircle.java +++ b/altoslib/AltosGreatCircle.java @@ -15,12 +15,12 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.lang.Math;  import java.io.*; -public class AltosGreatCircle implements Cloneable, Serializable { +public class AltosGreatCircle implements Cloneable {  	public double	distance;  	public double	bearing;  	public double	range; @@ -71,7 +71,10 @@ public class AltosGreatCircle implements Cloneable, Serializable {  				course = 2 * Math.PI-course;  		}  		distance = d * earth_radius; -		bearing = course * 180/Math.PI; +		if (Double.isNaN(course) || Double.isInfinite(course)) +			bearing = 0; +		else +			bearing = course * 180/Math.PI;  		double height_diff = end_alt - start_alt;  		range = Math.sqrt(distance * distance + height_diff * height_diff); diff --git a/altoslib/AltosHeight.java b/altoslib/AltosHeight.java index 2bae2566..01bd4a6b 100644 --- a/altoslib/AltosHeight.java +++ b/altoslib/AltosHeight.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosHeight extends AltosUnits { diff --git a/altoslib/AltosHexfile.java b/altoslib/AltosHexfile.java index f72d4183..e7f900c4 100644 --- a/altoslib/AltosHexfile.java +++ b/altoslib/AltosHexfile.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.LinkedList; diff --git a/altoslib/AltosHexsym.java b/altoslib/AltosHexsym.java index 1d9cbb18..ab2beff5 100644 --- a/altoslib/AltosHexsym.java +++ b/altoslib/AltosHexsym.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosHexsym {  	String	name; diff --git a/altoslib/AltosIMU.java b/altoslib/AltosIMU.java index 62539e08..dbadcf89 100644 --- a/altoslib/AltosIMU.java +++ b/altoslib/AltosIMU.java @@ -15,12 +15,12 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.util.concurrent.*;  import java.io.*; -public class AltosIMU implements Cloneable, Serializable { +public class AltosIMU implements Cloneable {  	public int		accel_along;  	public int		accel_across;  	public int		accel_through; @@ -29,13 +29,13 @@ public class AltosIMU implements Cloneable, Serializable {  	public int		gyro_pitch;  	public int		gyro_yaw; -	public static double	counts_per_g = 2048.0; +	public static final double	counts_per_g = 2048.0;  	public static double convert_accel(double counts) {  		return counts / counts_per_g * (-AltosConvert.GRAVITATIONAL_ACCELERATION);  	} -	public static double	counts_per_degsec = 16.4; +	public static final double	counts_per_degsec = 16.4;  	public static double convert_gyro(double counts) {  		return counts / counts_per_degsec; diff --git a/altoslib/AltosIdle.java b/altoslib/AltosIdle.java index 07a628c3..36a3ca04 100644 --- a/altoslib/AltosIdle.java +++ b/altoslib/AltosIdle.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosIdleFetch.java b/altoslib/AltosIdleFetch.java index 0095bb73..5102c16b 100644 --- a/altoslib/AltosIdleFetch.java +++ b/altoslib/AltosIdleFetch.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; @@ -134,9 +134,6 @@ public class AltosIdleFetch implements AltosStateUpdate {  	AltosLink		link; -	double			frequency; -	String			callsign; -  	public void update_state(AltosState state) throws InterruptedException, AltosUnknownProduct {  		try {  			boolean	matched = false; @@ -148,6 +145,8 @@ public class AltosIdleFetch implements AltosStateUpdate {  			state.set_ground_accel(config_data.accel_cal_plus);  			state.set_accel_g(config_data.accel_cal_plus, config_data.accel_cal_minus);  			state.set_product(config_data.product); +			state.set_firmware_version(config_data.version); +			state.set_log_space(config_data.log_space);  			for (AltosIdler idler : idlers) {  				if (idler.matches(config_data)) {  					idler.update_state(state, link, config_data); diff --git a/altoslib/AltosIdleMonitor.java b/altoslib/AltosIdleMonitor.java index c67b4d8a..fde8c101 100644 --- a/altoslib/AltosIdleMonitor.java +++ b/altoslib/AltosIdleMonitor.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.concurrent.*; diff --git a/altoslib/AltosIdleMonitorListener.java b/altoslib/AltosIdleMonitorListener.java index 36857f58..27a51466 100644 --- a/altoslib/AltosIdleMonitorListener.java +++ b/altoslib/AltosIdleMonitorListener.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public interface AltosIdleMonitorListener {  	public void update(AltosState state, AltosListenerState listener_state); diff --git a/altoslib/AltosIdleReader.java b/altoslib/AltosIdleReader.java new file mode 100644 index 00000000..795593f7 --- /dev/null +++ b/altoslib/AltosIdleReader.java @@ -0,0 +1,121 @@ +/* + * Copyright © 2016 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 org.altusmetrum.altoslib_11; + +import java.text.*; +import java.io.*; +import java.util.concurrent.*; + +public class AltosIdleReader extends AltosFlightReader { +	AltosLink	link; +	boolean		remote; +	AltosState	state = null; +	AltosIdleFetch	fetch; +	long		next_millis; +	static final long	report_interval = 5 * 1000; +	static final long	minimum_delay = 1 * 1000; + +	private void start_link() throws InterruptedException, TimeoutException { +		if (remote) { +			link.start_remote(); +		} else +			link.flush_input(); +	} + +	private boolean stop_link() throws InterruptedException, TimeoutException { +		if (remote) +			link.stop_remote(); +		return link.reply_abort; +	} + +	public AltosState read() throws InterruptedException, ParseException, AltosCRCException, IOException { +		boolean worked = false; +		boolean aborted = false; + +		if (state == null) +			state = new AltosState(); +		else +			state = state.clone(); + +		long	delay = next_millis - System.currentTimeMillis(); + +		if (delay > 0) +			Thread.sleep(delay); +		next_millis = System.currentTimeMillis() + report_interval; +		try { +			try { +				start_link(); +				fetch.update_state(state); +				if (!link.has_error && !link.reply_abort) +					worked = true; +			} catch (TimeoutException te) { +			} catch (AltosUnknownProduct ue) { +				worked = true; +			} +		} finally { +			try { +				aborted = stop_link(); +			} catch (TimeoutException te) { +				aborted = true; +			} +			if (worked) { +				if (remote) { +					try { +						state.set_rssi(link.rssi(), 0); +					} catch (TimeoutException te) { +						state.set_rssi(0, 0); +					} +				} +			} +		} + +		long	finish = System.currentTimeMillis(); + +		if (next_millis - finish < minimum_delay) +			next_millis = finish + minimum_delay; + +		return state; +	} + +	public void close(boolean interrupted) { +		try { +			link.close(); +		} catch (InterruptedException ie) { +		} +	} + +	public void set_frequency(double frequency) throws InterruptedException, TimeoutException { +		link.set_radio_frequency(frequency); +	} + +	public void save_frequency() { +		AltosPreferences.set_frequency(link.serial, link.frequency); +	} + +	public void set_callsign(String callsign) throws InterruptedException, TimeoutException { +		link.set_callsign(callsign); +	} + +	public AltosIdleReader (AltosLink link, boolean remote) +		throws IOException, InterruptedException, TimeoutException { +		this.link = link; +		this.remote = remote; +		this.next_millis = System.currentTimeMillis(); +		fetch = new AltosIdleFetch(link); +	} +} diff --git a/altoslib/AltosIgnite.java b/altoslib/AltosIgnite.java index ab9c2da6..f3c07339 100644 --- a/altoslib/AltosIgnite.java +++ b/altoslib/AltosIgnite.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.util.*;  import java.io.*; diff --git a/altoslib/AltosImage.java b/altoslib/AltosImage.java index d54335c7..9a0751b6 100644 --- a/altoslib/AltosImage.java +++ b/altoslib/AltosImage.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*; diff --git a/altoslib/AltosJson.java b/altoslib/AltosJson.java new file mode 100644 index 00000000..67f3a00a --- /dev/null +++ b/altoslib/AltosJson.java @@ -0,0 +1,1314 @@ +/* + * Copyright © 2016 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 org.altusmetrum.altoslib_11; + +import java.io.*; +import java.util.*; +import java.text.*; +import java.lang.*; +import java.lang.reflect.*; + +class JsonUtil { +	StringBuffer quote(StringBuffer result, String a) { +		result.append("\""); +		for (int i = 0; i < a.length(); i++) { +			char c = a.charAt(i); + +			switch (c) { +			case '"': +			case '\\': +				result.append('\\').append(c); +				break; +			case '\n': +				result.append("\\n"); +				break; +			default: +				result.append(c); +				break; +			} +		} +		result.append("\""); +		return result; +	} + +	StringBuffer append(StringBuffer result, AltosJson value, int indent, boolean pretty) { +		value.append(result, indent, pretty); +		return result; +	} + +	StringBuffer append(StringBuffer result, String string) { +		result.append(string); +		return result; +	} + +	StringBuffer indent(StringBuffer result, int indent) { +		result.append("\n"); +		for (int i = 0; i < indent; i++) +			result.append("\t"); +		return result; +	} +	static NumberFormat get_nf_json() { +		DecimalFormat nf = (DecimalFormat) NumberFormat.getNumberInstance(Locale.ROOT); +		nf.setParseIntegerOnly(false); +		nf.setGroupingUsed(false); +		nf.setMaximumFractionDigits(17); +		nf.setMinimumFractionDigits(0); +		nf.setMinimumIntegerDigits(1); +		nf.setDecimalSeparatorAlwaysShown(false); +		return nf; +	} + +	static NumberFormat nf_json = get_nf_json(); +} + +class JsonHash extends JsonUtil { +	Hashtable<String,AltosJson> hash; + +	void append_hash(StringBuffer result, int indent, boolean pretty) { +		boolean		first = true; + +		result.append("{"); + +		ArrayList<String> key_list = new ArrayList<String>(hash.keySet()); + +		Collections.sort(key_list, new Comparator<String>() { +				@Override +				public int compare(String a, String b) { return a.compareTo(b); } +			}); + +		for (String key : key_list) { +			AltosJson	value = hash.get(key); + +			if (!first) +				result.append(","); +			first = false; +			if (pretty) +				indent(result, indent+1); +			quote(result, key); +			append(result, ": "); +			append(result, value, indent+1, pretty); +		} +		if (pretty) +			indent(result, indent); +		append(result, "}"); +	} + +	void put(String key, AltosJson value) { +		hash.put(key, value); +	} + +	AltosJson get(String key) { +		return hash.get(key); +	} + +	JsonHash() { +		hash = new Hashtable<String,AltosJson>(); +	} +} + +class JsonArray extends JsonUtil { +	ArrayList<AltosJson> array; + +	void append_array(StringBuffer result, int indent, boolean pretty) { +		boolean first = true; + +		append(result, "["); +		for (int i = 0; i < array.size(); i++) { +			AltosJson	value = array.get(i); + +			if (!first) +				append(result, ","); +			first = false; +			if (pretty) +				indent(result, indent+1); +			append(result, value, indent+1, pretty); +		} +		if (pretty) +			indent(result, indent); +		append(result, "]"); +	} + +	void put(int index, AltosJson value) { +		if (index >= array.size()) +			array.add(index, value); +		else +			array.set(index, value); +	} + +	AltosJson get(int index) { +		if (index < 0 || index > array.size()) +			return null; +		return array.get(index); +	} + +	int size() { +		return array.size(); +	} + +	JsonArray() { +		array = new ArrayList<AltosJson>(); +	} +} + +class JsonToken { +	double	dval; +	long	lval; +	String	sval; +	boolean	bval; +	int	token; + +	static final int _string = 0; +	static final int _double = 1; +	static final int _long = 2; +	static final int _boolean = 3; +	static final int _oc = 4; +	static final int _cc = 5; +	static final int _os = 6; +	static final int _cs = 7; +	static final int _comma = 8; +	static final int _colon = 9; +	static final int _end = 10; +	static final int _error = 11; + +	static String token_name(int token) { +		switch (token) { +		case _string: +			return "string"; +		case _double: +			return "number"; +		case _long: +			return "number"; +		case _boolean: +			return "boolean"; +		case _oc: +			return "{"; +		case _cc: +			return "}"; +		case _os: +			return "["; +		case _cs: +			return "]"; +		case _comma: +			return ","; +		case _colon: +			return ":"; +		case _end: +			return "<EOF>"; +		case _error: +			return "<ERROR>"; +		default: +			return "<UNKNOWN>"; +		} +	} + +	String token_name() { +		return token_name(token); +	} + +	JsonToken(int token) { +		this.token = token; +	} + +	JsonToken(int token, boolean bval) { +		this.token = token; +		this.bval = bval; +	} + +	JsonToken(int token, double dval) { +		this.token = token; +		this.dval = dval; +	} + +	JsonToken(int token, long lval) { +		this.token = token; +		this.lval = lval; +	} + +	JsonToken(int token, String sval) { +		this.token = token; +		this.sval = sval; +	} + +	JsonToken(int token, StringBuffer bval) { +		this(token, bval.toString()); +	} +} + +/* + * Lexer for json + */ +class JsonLexer extends JsonUtil { +	StringReader	f; +	int		line; +	int		ungot = -2; +	StringBuffer	pending_token; +	JsonToken	token; + +	static class keyword { +		String		word; +		JsonToken	token; + +		JsonToken match(String value) { +			if (word.equals(value)) +				return token; +			return null; +		} + +		keyword(String word, JsonToken token) { +			this.word = word; +			this.token = token; +		} +	} + +	/* boolean values are the only keywords in json +	 */ +	static keyword[] keywords = { +		new keyword("true", new JsonToken(JsonToken._boolean, true)), +		new keyword("false", new JsonToken(JsonToken._boolean, false)), +		new keyword("NegInfinity", new JsonToken(JsonToken._double, Double.NEGATIVE_INFINITY)), +		new keyword("Infinity", new JsonToken(JsonToken._double, Double.POSITIVE_INFINITY)), +		new keyword("NaN", new JsonToken(JsonToken._double, Double.NaN)) +	}; + +	static JsonToken keyword(String word) { +		for (int i = 0; i < keywords.length; i++) { +			JsonToken token = keywords[i].match(word); +			if (token != null) +				return token; +		} +		return null; +	} + +	/* Get the next char (-1 for EOF) */ +	int ch() throws IOException { +		int c; +		if (ungot != -2) { +			c = ungot; +			ungot = -2; +		} else +			c = f.read(); +		if (c != -1) +			pending_token.append((char) c); +		if (c == '\n') +			++line; +		return c; +	} + +	void unch(int c) { +		if (ungot != -2) +			throw new IllegalArgumentException("ungot buffer full"); +		pending_token.deleteCharAt( pending_token.length()-1); +		if (c == '\n') +			--line; +		ungot = c; +	} + +	String last_token_string() { +		if (pending_token == null) +			return null; + +		return pending_token.toString(); +	} + +	static boolean is_long_range(double d) { +		return -9223372036854775808.0 <= d && d <= 9223372036854775807.0; +	} + +	JsonToken lex() { +		pending_token = new StringBuffer(); + +		try { +			for (;;) { +				int c = ch(); + +				switch (c) { +				case -1: +					return new JsonToken(JsonToken._end); +				case '\n': +				case ' ': +				case '\t': +					continue; +				case '{': +					return new JsonToken(JsonToken._oc); +				case '}': +					return new JsonToken(JsonToken._cc); +				case '[': +					return new JsonToken(JsonToken._os); +				case ']': +					return new JsonToken(JsonToken._cs); +				case ',': +					return new JsonToken(JsonToken._comma); +				case ':': +					return new JsonToken(JsonToken._colon); +				case '0': case '1': case '2': case '3': case '4': +				case '5': case '6': case '7': case '8': case '9': +				case '.': case '-': case '+': +					StringBuffer dbuf = new StringBuffer(); +					boolean is_double = false; +					while (Character.isDigit(c) || c == '.' || c == '+' || c == '-' || c == 'e' || c == 'E') { +						if (c == '.' || c == 'E') +							is_double = true; +						dbuf.appendCodePoint(c); +						c = ch(); +					} +					unch(c); +					String dstr = dbuf.toString(); +					double dval; +					try { +						dval = nf_json.parse(dstr).doubleValue(); +					} catch (ParseException pe) { +						return new JsonToken(JsonToken._error, dstr); +					} +					if (is_double || !is_long_range(dval)) +						return new JsonToken(JsonToken._double, dval); +					else { +						long lval = Long.parseLong(dstr); +						return new JsonToken(JsonToken._long, lval); +					} +				case '"': +					StringBuffer bval = new StringBuffer(); +					for (;;) { +						c = ch(); +						if (c == '"') +							break; +			 			if (c == '\\') { +							c = ch(); +							switch (c) { +							case 'n': +								c = '\n'; +								break; +							case 't': +								c = '\t'; +								break; +							default: +								break; +							} +						} +						bval.appendCodePoint(c); +					} +					return new JsonToken(JsonToken._string, bval); +				default: +					if (Character.isLetter(c)) { +						StringBuffer tbuf = new StringBuffer(); +						do { +							tbuf.appendCodePoint(c); +							c = ch(); +						} while (Character.isLetter(c)); +						unch(c); +						JsonToken token = keyword(tbuf.toString()); +						if (token != null) +							return token; +					} +					break; +				} +			} +		} catch (IOException ie) { +			return new JsonToken(JsonToken._error, "<EIO>"); +		} +	} + +	void next() { +		token = lex(); +	} + +	JsonToken expect(int e) { +		JsonToken t = token; +		if (t.token != e) +			throw new IllegalArgumentException(String.format("got \"%s\" while expecting \"%s\"", +									 token.token_name(), +									 JsonToken.token_name(e))); +		next(); +		return t; +	} + +	JsonLexer(String s) { +		f = new StringReader(s); +		line = 1; +		token = null; +	} +} + +/* + * Parse a json string into a AltosJson object + */ +class JsonParse { +	JsonLexer	lexer; + +	void parse_error(String format, Object ... arguments) { +		throw new IllegalArgumentException(String.format("line %d: JSON parse error %s\n", +								 lexer.line, +								 String.format(format, arguments))); +	} + +	/* Hashes are { string: value ... } */ +	JsonHash hash() { +		JsonHash	hash = new JsonHash(); + +		/* skip the open brace */ +		lexer.next(); +		for (;;) { +			/* Allow for empty hashes */ +			if (lexer.token.token == JsonToken._cc) { +				lexer.next(); +				return hash; +			} + +			/* string : value */ +			String key = lexer.expect(JsonToken._string).sval; +			lexer.expect(JsonToken._colon); +			AltosJson value = value(); +			hash.put(key, value); + +			switch (lexer.token.token) { +			case JsonToken._comma: +				lexer.next(); +				break; +			case JsonToken._cc: +				lexer.next(); +				return hash; +			default: +				parse_error("got %s expect \",\" or \"}\"", lexer.token.token_name()); +				return null; +			} +		} +	} + +	/* Arrays are [ value ... ] */ +	JsonArray array() { +		JsonArray	array = new JsonArray(); + +		lexer.next(); +		for (int i = 0;; i++) { +			/* Allow for empty arrays */ +			if (lexer.token.token == JsonToken._cs) { +				lexer.next(); +				return array; +			} + +			AltosJson value = value(); +			array.put(i, value); +			switch (lexer.token.token) { +			case JsonToken._comma: +				lexer.next(); +				break; +			case JsonToken._cs: +				lexer.next(); +				return array; +			default: +				parse_error("got %s expect \",\" or \"]\"", lexer.token.token_name()); +				return null; +			} +		} +	} + +	/* Json is a simple LL language; one token is sufficient to +	 * identify the next object in the input +	 */ +	AltosJson value() { +		switch (lexer.token.token) { +		case JsonToken._oc: +			return new AltosJson(hash()); +		case JsonToken._os: +			return new AltosJson(array()); +		case JsonToken._double: +			double dval = lexer.token.dval; +			lexer.next(); +			return new AltosJson(dval); +		case JsonToken._long: +			long lval = lexer.token.lval; +			lexer.next(); +			return new AltosJson(lval); +		case JsonToken._string: +			String sval = lexer.token.sval; +			lexer.next(); +			return new AltosJson(sval); +		case JsonToken._boolean: +			boolean bval = lexer.token.bval; +			lexer.next(); +			return new AltosJson(bval); +		default: +			parse_error("Unexpected token \"%s\"", lexer.token.token_name()); +		} +		return null; +	} + +	AltosJson parse() { +		lexer.next(); +		return value(); +	} + +	JsonParse(String s) { +		lexer = new JsonLexer(s); +	} +} + +public class AltosJson extends JsonUtil { +	private static final int	type_none = 0; +	private static final int	type_hash = 1; +	private static final int	type_array = 2; +	private static final int	type_double = 3; +	private static final int	type_long = 4; +	private static final int	type_string = 5; +	private static final int	type_boolean = 6; + +	private int		type; + +	private JsonHash	hash; +	private JsonArray	array; +	private double		d_number; +	private long		l_number; +	private String		string; +	private boolean		bool; + +	/* Generate string representation of the value +	 */ +	StringBuffer append(StringBuffer result, int indent, boolean pretty) { +		switch (type) { +		case type_hash: +			hash.append_hash(result, indent, pretty); +			break; +		case type_array: +			array.append_array(result, indent, pretty); +			break; +		case type_double: +			if (Double.isInfinite(d_number)) { +				if (d_number < 0) +					result.append("NegInfinity"); +				else +					result.append("Infinity"); +			} else if (Double.isNaN(d_number)) { +				result.append("NaN"); +			} else { +				String dval = nf_json.format(d_number); +				if (dval.equals("-0")) +					dval = "0"; +				result.append(dval); +			} +			break; +		case type_long: +			result.append(new Long(l_number).toString()); +			break; +		case type_string: +			quote(result, string); +			break; +		case type_boolean: +			result.append(bool ? "true" : "false"); +			break; +		} +		return result; +	} + +	private String toString(int indent, boolean pretty) { +		StringBuffer result = new StringBuffer(); +		append(result, indent, pretty); +		return result.toString(); +	} + +	public String toString() { +		return toString(0, false); +	} + +	public String toPrettyString() { +		return toString(0, true); +	} + +	/* Parse string representation to a value +	 */ + +	public static AltosJson fromString(String string) { +		JsonParse	parse = new JsonParse(string); +		try { +			return parse.parse(); +		} catch (IllegalArgumentException ie) { +			System.out.printf("json:\n%s\n%s\n", string, ie.getMessage()); +			return null; +		} +	} + +	/* Accessor functions +	 */ +	private boolean assert_type(boolean setting, int type, int other_type, String error) { +		if (setting && this.type == type_none) { +			this.type = type; +			return false; +		} +		if (this.type != type && this.type != other_type) +			throw new IllegalArgumentException(error); +		return true; +	} + +	private boolean assert_type(boolean setting, int type, String error) { +		return assert_type(setting, type, type, error); +	} + +	private void assert_hash(boolean setting) { +		if (!assert_type(setting, type_hash, "not a hash")) +			hash = new JsonHash(); +	} + +	private void assert_array(boolean setting) { +		if (!assert_type(setting, type_array, "not an array")) +			array = new JsonArray(); +	} + +	private void assert_number() { +		assert_type(false, type_double, type_long, "not a number"); +	} + +	private void assert_double() { +		assert_type(true, type_double, type_long, "not a number"); +	} + +	private void assert_long() { +		assert_type(true, type_long, type_double, "not a number"); +	} + +	private void assert_string(boolean setting) { +		assert_type(setting, type_string, "not a string"); +	} + +	private void assert_boolean(boolean setting) { +		assert_type(setting, type_boolean, "not a boolean"); +	} + +	/* Primitive accessors +	 */ +	public double number() { +		assert_number(); +		if (type == type_double) +			return d_number; +		else +			return (double) l_number; +	} + +	public long l_number() { +		assert_number(); +		if (type == type_double) +			return (long) d_number; +		else +			return l_number; +	} + +	public String string() { +		assert_string(false); +		return string; +	} + +	public boolean bool() { +		assert_boolean(false); +		return bool; +	} + +	public AltosJson get(int index) { +		assert_array(false); +		return array.get(index); +	} + +	public AltosJson get(String key) { +		assert_hash(false); +		return hash.get(key); +	} + +	public int size() { +		assert_array(false); +		return array.size(); +	} + +	/* Typed accessors with defaulting +	 */ +	public double get_double(String key, double def) { +		AltosJson value = get(key); +		if (value != null) { +			return value.number(); +		} +		return def; +	} + +	public long get_long(String key, long def) { +		AltosJson value = get(key); +		if (value != null) +			return value.l_number(); +		return def; +	} + +	public int get_int(String key, int def) { +		AltosJson value = get(key); +		if (value != null) +			return (int) value.l_number(); +		return def; +	} + +	public String get_string(String key, String def) { +		AltosJson value = get(key); +		if (value != null) +			return value.string(); +		return def; +	} + +	public boolean get_boolean(String key, boolean def) { +		AltosJson value = get(key); +		if (value != null) +			return value.bool(); +		return def; +	} + +	public double get_double(int index, double def) { +		AltosJson value = get(index); +		if (value != null) +			return value.number(); +		return def; +	} + +	public long get_long(int index, long def) { +		AltosJson value = get(index); +		if (value != null) +			return value.l_number(); +		return def; +	} + +	public int get_int(int index, int def) { +		AltosJson value = get(index); +		if (value != null) +			return (int) value.l_number(); +		return def; +	} + +	public String get_string(int index, String def) { +		AltosJson value = get(index); +		if (value != null) +			return value.string(); +		return def; +	} + +	public boolean get_boolean(int index, boolean def) { +		AltosJson value = get(index); +		if (value != null) +			return value.bool(); +		return def; +	} + +	public double[] get_double_array(String key, double[] def) { +		AltosJson value = get(key); +		if (value != null) { +			double[] ret = new double[value.size()]; +			for (int i = 0; i < value.size(); i++) +				ret[i] = value.get_double(i, def == null ? 0 : def[i]); +			return ret; +		} +		return def; +	} + +	public int[] get_int_array(String key, int[] def) { +		AltosJson value = get(key); +		if (value != null) { +			int[] ret = new int[value.size()]; +			for (int i = 0; i < value.size(); i++) +				ret[i] = value.get_int(i, def == null ? 0 : def[i]); +			return ret; +		} +		return def; +	} + +	/* Array setter functions +	 */ +	public AltosJson put(int index, AltosJson value) { +		assert_array(true); +		array.put(index, value); +		return value; +	} + +	public Object put(int index, Object value) { +		assert_array(true); +		if (value != null) +			array.put(index, new AltosJson(value)); +		return value; +	} + +	public double put(int index, double value) { +		assert_array(true); +		array.put(index, new AltosJson(value)); +		return value; +	} + +	public AltosJson put(int index, double[] value) { +		if (value != null) { +			assert_array(true); +			array.put(index, new AltosJson(value)); +		} +		return this; +	} + +	public int[] put(int index, int[] value) { +		if (value != null) { +			assert_array(true); +			array.put(index, new AltosJson(value)); +		} +		return value; +	} + +	public String put(int index, String value) { +		if (value != null) { +			assert_array(true); +			array.put(index, new AltosJson(value)); +		} +		return value; +	} + +	public boolean put(int index, boolean value) { +		assert_array(true); +		array.put(index, new AltosJson(value)); +		return value; +	} + +	/* Hash setter functions +	 */ +	public AltosJson put(String key, AltosJson value) { +		assert_hash(true); +		hash.put(key, value); +		return value; +	} + +	public Object put(String key, Object value) { +		assert_hash(true); +		if (value != null) +			hash.put(key, new AltosJson(value)); +		return value; +	} + +	public double put(String key, double value) { +		assert_hash(true); +		hash.put(key, new AltosJson(value)); +		return value; +	} + +	public String put(String key, String value) { +		if (value != null) { +			assert_hash(true); +			hash.put(key, new AltosJson(value)); +		} +		return value; +	} + +	public boolean put(String key, boolean value) { +		assert_hash(true); +		hash.put(key, new AltosJson(value)); +		return value; +	} + +	public AltosJson[] put(String key, AltosJson[] value) { +		if (value != null) { +			assert_hash(true); +			hash.put(key, new AltosJson(value)); +		} +		return value; +	} + +	public double[] put(String key, double[] value) { +		if (value != null) { +			assert_hash(true); +			hash.put(key, new AltosJson(value)); +		} +		return value; +	} + +	public int[] put(String key, int[] value) { +		if (value != null) { +			assert_hash(true); +			hash.put(key, new AltosJson(value)); +		} +		return value; +	} + +	/* Primitive setter functions +	 */ +	public double put(double value) { +		assert_double(); +		d_number = value; +		return value; +	} + +	public byte put(byte value) { +		assert_long(); +		l_number = value; +		return value; +	} + +	public char put(char value) { +		assert_long(); +		l_number = value; +		return value; +	} + +	public int put(int value) { +		assert_long(); +		l_number = value; +		return value; +	} + +	public long put(long value) { +		assert_long(); +		l_number = value; +		return value; +	} + +	public String put(String value) { +		assert_string(true); +		string = value; +		return value; +	} + +	public boolean put(boolean value) { +		assert_boolean(true); +		bool = value; +		return value; +	} + +	private boolean isInnerClass(Class c) { +		for (Field field : c.getDeclaredFields()) +			if (field.isSynthetic()) +				return true; +		return false; +	} + +	/* Construct an object of the specified class from the JSON +	 * representation. +	 * +	 * This works as long as the structure is non-recursive, and +	 * all inner classes are only members of their immediate outer +	 * class +	 */ +	private Object make(Class c, Class enclosing_class, Object enclosing_object) { +		Object	ret; +		if (c == Boolean.TYPE) { +			ret = bool(); +		} else if (c == Byte.TYPE) { +			ret = (Byte) (byte) l_number(); +		} else if (c == Character.TYPE) { +			ret = (Character) (char) l_number(); +		} else if (c == Integer.TYPE) { +			ret = (Integer) (int) l_number(); +		} else if (c == Long.TYPE) { +			ret = l_number(); +		} else if (c == Double.TYPE) { +			ret = number(); +		} else if (c == String.class) { +			ret = string(); +		} else if (c.isArray()) { +			assert_array(false); + +			Class element_class = c.getComponentType(); +			if (element_class == Boolean.TYPE) { +				boolean[] array = (boolean[]) Array.newInstance(element_class, size()); +				for (int i = 0; i < array.length; i++) +					array[i] = (Boolean) get(i).make(element_class); +				ret = array; +			} else if (element_class == Byte.TYPE) { +				byte[] array = (byte[]) Array.newInstance(element_class, size()); +				for (int i = 0; i < array.length; i++) +					array[i] = (Byte) get(i).make(element_class); +				ret = array; +			} else if (element_class == Character.TYPE) { +				char[] array = (char[]) Array.newInstance(element_class, size()); +				for (int i = 0; i < array.length; i++) +					array[i] = (Character) get(i).make(element_class); +				ret = array; +			} else if (element_class == Integer.TYPE) { +				int[] array = (int[]) Array.newInstance(element_class, size()); +				for (int i = 0; i < array.length; i++) +					array[i] = (Integer) get(i).make(element_class); +				ret = array; +			} else if (element_class == Long.TYPE) { +				long[] array = (long[]) Array.newInstance(element_class, size()); +				for (int i = 0; i < array.length; i++) +					array[i] = (Long) get(i).make(element_class); +				ret = array; +			} else if (element_class == Double.TYPE) { +				double[] array = (double[]) Array.newInstance(element_class, size()); +				for (int i = 0; i < array.length; i++) +					array[i] = (Double) get(i).make(element_class); +				ret = array; +			} else { +				Object[] array = (Object[]) Array.newInstance(element_class, size()); +				for (int i = 0; i < array.length; i++) +					array[i] = get(i).make(element_class); +				ret = array; +			} +		} else { +			assert_hash(false); +			Object object = null; +			try { +				/* Inner classes have a hidden extra parameter +				 * to the constructor. Assume that the enclosing object is +				 * of the enclosing class and construct the object +				 * based on that. +				 */ +				if (enclosing_class != null && isInnerClass(c)) { +					Constructor<?> ctor = ((Class<?>)c).getDeclaredConstructor((Class<?>) enclosing_class); +					object = ctor.newInstance(enclosing_object); +				} else { +					object = c.newInstance(); +				} +				for (; c != Object.class; c = c.getSuperclass()) { +					for (Field field : c.getDeclaredFields()) { +						String	fieldName = field.getName(); +						Class	fieldClass = field.getType(); + +						if (Modifier.isStatic(field.getModifiers())) +							continue; +						if (field.isSynthetic()) +							continue; +						try { +							AltosJson json = get(fieldName); +							if (json != null) { +								Object val = json.make(fieldClass, c, object); +								field.setAccessible(true); +								field.set(object, val); +							} +						} catch (IllegalAccessException ie) { +							System.out.printf("%s:%s %s\n", +									  c.getName(), fieldName, ie.toString()); +						} +					} +				} +				ret = object; +			} catch (InvocationTargetException ie) { +				System.out.printf("%s: %s\n", +						  c.getName(), ie.toString()); +				ret = null; +			} catch (NoSuchMethodException ie) { +				System.out.printf("%s: %s\n", +						  c.getName(), ie.toString()); +				ret = null; +			} catch (InstantiationException ie) { +				System.out.printf("%s: %s\n", +						  c.getName(), ie.toString()); +				ret = null; +			} catch (IllegalAccessException ie) { +				System.out.printf("%s: %s\n", +						  c.getName(), ie.toString()); +				ret = null; +			} +		} +		return ret; +	} + +	/* This is the public API for the +	 * above function which doesn't handle +	 * inner classes +	 */ +	public Object make(Class c) { +		return make(c, null, null); +	} + +	/* Constructors, one for each primitive type, String and Object */ +	public AltosJson(boolean bool) { +		type = type_boolean; +		this.bool = bool; +	} + +	public AltosJson(byte number) { +		type = type_long; +		this.l_number = number; +	} + +	public AltosJson(char number) { +		type = type_long; +		this.l_number = number; +	} + +	public AltosJson(int number) { +		type = type_long; +		this.l_number = number; +	} + +	public AltosJson(long number) { +		type = type_long; +		this.l_number = number; +	} + +	public AltosJson(double number) { +		type = type_double; +		this.d_number = number; +	} + +	public AltosJson(String string) { +		type = type_string; +		this.string = string; +	} + +	public AltosJson(Object object) { +		if (object instanceof Boolean) { +			type = type_boolean; +			bool = (Boolean) object; +		} else if (object instanceof Byte) { +			type = type_long; +			l_number = (Byte) object; +		} else if (object instanceof Character) { +			type = type_long; +			l_number = (Character) object; +		} else if (object instanceof Integer) { +			type = type_long; +			l_number = (Integer) object; +		} else if (object instanceof Long) { +			type = type_long; +			l_number = (Long) object; +		} else if (object instanceof Double) { +			type = type_double; +			d_number = (Double) object; +		} else if (object instanceof String) { +			type = type_string; +			string = (String) object; +		} else if (object.getClass().isArray()) { +			assert_array(true); + +			Class component_class = object.getClass().getComponentType(); +			if (component_class == Boolean.TYPE) { +				boolean[] array = (boolean[]) object; +				for (int i = 0; i < array.length; i++) +					put(i, new AltosJson(array[i])); +			} else if (component_class == Byte.TYPE) { +				byte[] array = (byte[]) object; +				for (int i = 0; i < array.length; i++) +					put(i, new AltosJson(array[i])); +			} else if (component_class == Character.TYPE) { +				char[] array = (char[]) object; +				for (int i = 0; i < array.length; i++) +					put(i, new AltosJson(array[i])); +			} else if (component_class == Integer.TYPE) { +				int[] array = (int[]) object; +				for (int i = 0; i < array.length; i++) +					put(i, new AltosJson(array[i])); +			} else if (component_class == Long.TYPE) { +				long[] array = (long[]) object; +				for (int i = 0; i < array.length; i++) +					put(i, new AltosJson(array[i])); +			} else if (component_class == Double.TYPE) { +				double[] array = (double[]) object; +				for (int i = 0; i < array.length; i++) +					put(i, new AltosJson(array[i])); +			} else { +				Object[] array = (Object[]) object; +				for (int i = 0; i < array.length; i++) +					put(i, new AltosJson(array[i])); +			} +		} else { +			assert_hash(true); +			for (Class c = object.getClass(); c != Object.class; c = c.getSuperclass()) { +				for (Field field : c.getDeclaredFields()) { +					String	fieldName = field.getName(); + +					/* Skip static fields */ +					if (Modifier.isStatic(field.getModifiers())) +						continue; + +					/* Skip synthetic fields. We're assuming +					 * those are always an inner class reference +					 * to the outer class object +					 */ +					if (field.isSynthetic()) +						continue; +					try { +						/* We may need to force the field to be accessible if +						 * it is private +						 */ +						field.setAccessible(true); +						Object val = field.get(object); +						if (val != null) { +							AltosJson json = new AltosJson(val); +							put(fieldName, json); +						} +					} catch (IllegalAccessException ie) { +						System.out.printf("%s:%s %s\n", +								  c.getName(), fieldName, ie.toString()); +					} +				} +			} +		} +	} + +	/* Array constructors, one for each primitive type, String and Object */ +	public AltosJson(boolean[] bools) { +		assert_array(true); +		for(int i = 0; i < bools.length; i++) +			put(i, new AltosJson(bools[i])); +	} + +	public AltosJson(byte[] numbers) { +		assert_array(true); +		for(int i = 0; i < numbers.length; i++) +			put(i, new AltosJson(numbers[i])); +	} + +	public AltosJson(char[] numbers) { +		assert_array(true); +		for(int i = 0; i < numbers.length; i++) +			put(i, new AltosJson(numbers[i])); +	} + +	public AltosJson(int[] numbers) { +		assert_array(true); +		for(int i = 0; i < numbers.length; i++) +			put(i, new AltosJson(numbers[i])); +	} + +	public AltosJson(long[] numbers) { +		assert_array(true); +		for(int i = 0; i < numbers.length; i++) +			put(i, new AltosJson(numbers[i])); +	} + +	public AltosJson(double[] numbers) { +		assert_array(true); +		for(int i = 0; i < numbers.length; i++) +			put(i, new AltosJson(numbers[i])); +	} + +	public AltosJson(String[] strings) { +		assert_array(true); +		for(int i = 0; i < strings.length; i++) +			put(i, new AltosJson(strings[i])); +	} + +	public AltosJson(AltosJson[] jsons) { +		assert_array(true); +		for (int i = 0; i < jsons.length; i++) +			put(i, jsons[i]); +	} + +	public AltosJson(Object[] array) { +		assert_array(true); +		for (int i = 0; i < array.length; i++) +			put(i, new AltosJson(array[i])); +	} + +	/* Empty constructor +	 */ +	public AltosJson() { +		type = type_none; +	} + +	public AltosJson(JsonHash hash) { +		type = type_hash; +		this.hash = hash; +	} + +	public AltosJson(JsonArray array) { +		type = type_array; +		this.array = array; +	} +} diff --git a/altoslib/AltosKML.java b/altoslib/AltosKML.java index ac5e0257..ba053015 100644 --- a/altoslib/AltosKML.java +++ b/altoslib/AltosKML.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosLatLon.java b/altoslib/AltosLatLon.java index d39fe15f..ed1dd64e 100644 --- a/altoslib/AltosLatLon.java +++ b/altoslib/AltosLatLon.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosLatLon {  	public double	lat; diff --git a/altoslib/AltosLatitude.java b/altoslib/AltosLatitude.java index e0deb504..04931ece 100644 --- a/altoslib/AltosLatitude.java +++ b/altoslib/AltosLatitude.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosLatitude extends AltosLocation {  	public String pos() { return "N"; } diff --git a/altoslib/AltosLaunchSite.java b/altoslib/AltosLaunchSite.java index ee2a60e9..831fdf64 100644 --- a/altoslib/AltosLaunchSite.java +++ b/altoslib/AltosLaunchSite.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.lang.*; diff --git a/altoslib/AltosLaunchSiteListener.java b/altoslib/AltosLaunchSiteListener.java index c77eadc5..6167b7cf 100644 --- a/altoslib/AltosLaunchSiteListener.java +++ b/altoslib/AltosLaunchSiteListener.java @@ -14,7 +14,7 @@   * with this program; if not, write to the Free Software Foundation, Inc.,   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.lang.*; diff --git a/altoslib/AltosLaunchSites.java b/altoslib/AltosLaunchSites.java index 3ebac601..db6a1f80 100644 --- a/altoslib/AltosLaunchSites.java +++ b/altoslib/AltosLaunchSites.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.lang.*; diff --git a/altoslib/AltosLib.java b/altoslib/AltosLib.java index a73a7759..044caf8d 100644 --- a/altoslib/AltosLib.java +++ b/altoslib/AltosLib.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.util.*;  import java.io.*; @@ -493,9 +493,10 @@ public class AltosLib {  		return r;  	} -	public static int fromdec(String s) throws NumberFormatException { -		int c, v = 0; -		int sign = 1; +	public static long fromdec(String s) throws NumberFormatException { +		int c; +		long v = 0; +		long sign = 1;  		for (int i = 0; i < s.length(); i++) {  			c = s.charAt(i);  			if (i == 0 && c == '-') { diff --git a/altoslib/AltosLine.java b/altoslib/AltosLine.java index 876cb7df..90490192 100644 --- a/altoslib/AltosLine.java +++ b/altoslib/AltosLine.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosLine {  	public String	line; diff --git a/altoslib/AltosLink.java b/altoslib/AltosLink.java index cd8609c0..32766674 100644 --- a/altoslib/AltosLink.java +++ b/altoslib/AltosLink.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.concurrent.*; diff --git a/altoslib/AltosListenerState.java b/altoslib/AltosListenerState.java index 389e392f..7d9ec2a4 100644 --- a/altoslib/AltosListenerState.java +++ b/altoslib/AltosListenerState.java @@ -15,11 +15,11 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*; -public class AltosListenerState implements Serializable { +public class AltosListenerState {  	public int	crc_errors;  	public double	battery;  	public boolean	running; diff --git a/altoslib/AltosLocation.java b/altoslib/AltosLocation.java index df1c9d63..2ab07ebb 100644 --- a/altoslib/AltosLocation.java +++ b/altoslib/AltosLocation.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public abstract class AltosLocation extends AltosUnits { diff --git a/altoslib/AltosLog.java b/altoslib/AltosLog.java index a6e04215..74017a29 100644 --- a/altoslib/AltosLog.java +++ b/altoslib/AltosLog.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.text.*; diff --git a/altoslib/AltosLongitude.java b/altoslib/AltosLongitude.java index 61d74afc..77fe9c9a 100644 --- a/altoslib/AltosLongitude.java +++ b/altoslib/AltosLongitude.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosLongitude extends AltosLocation {  	public String pos() { return "E"; } diff --git a/altoslib/AltosMag.java b/altoslib/AltosMag.java index ce5a48c3..5864529f 100644 --- a/altoslib/AltosMag.java +++ b/altoslib/AltosMag.java @@ -15,17 +15,17 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.util.concurrent.*;  import java.io.*; -public class AltosMag implements Cloneable, Serializable { +public class AltosMag implements Cloneable {  	public int		along;  	public int		across;  	public int		through; -	public static double counts_per_gauss = 1090; +	public static final double counts_per_gauss = 1090;  	public static double convert_gauss(double counts) {  		return counts / counts_per_gauss; diff --git a/altoslib/AltosMap.java b/altoslib/AltosMap.java index 1841277f..0c775f33 100644 --- a/altoslib/AltosMap.java +++ b/altoslib/AltosMap.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.lang.*; @@ -51,6 +51,7 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener {  	};  	AltosMapInterface	map_interface; +	int			scale;  	AltosMapCache		cache; @@ -328,7 +329,8 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener {  				if (!tiles.containsKey(point)) {  					AltosLatLon	ul = transform.lat_lon(point);  					AltosLatLon	center = transform.lat_lon(new AltosPointDouble(x + AltosMap.px_size/2, y + AltosMap.px_size/2)); -					AltosMapTile tile = map_interface.new_tile(cache, ul, center, zoom, maptype, px_size); +					AltosMapTile tile = map_interface.new_tile(cache, ul, center, zoom, maptype, px_size, scale); +					debug("show state %s url %s\n", AltosMapTile.status_name(tile.store.status()), tile.store.url);  					tile.add_listener(this);  					tiles.put(point, tile);  				} @@ -475,11 +477,16 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener {  			drag_stop(x, y);  	} -	public AltosMap(AltosMapInterface map_interface) { +	public AltosMap(AltosMapInterface map_interface, int scale) {  		this.map_interface = map_interface; +		this.scale = scale;  		cache = new AltosMapCache(map_interface);  		line = map_interface.new_line();  		path = map_interface.new_path();  		set_zoom_label();  	} + +	public AltosMap(AltosMapInterface map_interface) { +		this(map_interface, 1); +	}  } diff --git a/altoslib/AltosMapCache.java b/altoslib/AltosMapCache.java index 38e0f769..28f6b116 100644 --- a/altoslib/AltosMapCache.java +++ b/altoslib/AltosMapCache.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.net.*; @@ -60,7 +60,6 @@ public class AltosMapCache implements AltosMapCacheListener {  		public synchronized void notify_tile(AltosMapTile tile, int status) {  			if (status == AltosMapTile.fetched) { -				System.out.printf("tile fetched, loading image\n");  				load();  			}  		} @@ -139,8 +138,6 @@ public class AltosMapCache implements AltosMapCacheListener {  				elements[oldest].flush();  			elements[oldest] = element; -			System.out.printf("AltosMapCache.get image ? %s\n", -					  element.image == null ? "false" : "true");  			return element.image;  		}  	} diff --git a/altoslib/AltosMapCacheListener.java b/altoslib/AltosMapCacheListener.java index 4984d9e5..b010d12f 100644 --- a/altoslib/AltosMapCacheListener.java +++ b/altoslib/AltosMapCacheListener.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public interface AltosMapCacheListener {  	public void map_cache_changed(int map_cache); diff --git a/altoslib/AltosMapInterface.java b/altoslib/AltosMapInterface.java index 756a78f2..78cd70eb 100644 --- a/altoslib/AltosMapInterface.java +++ b/altoslib/AltosMapInterface.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.net.*; @@ -29,7 +29,7 @@ public interface AltosMapInterface {  	public abstract AltosMapMark new_mark(double lat, double lon, int state); -	public abstract AltosMapTile new_tile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size); +	public abstract AltosMapTile new_tile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size, int scale);  	public abstract int width(); diff --git a/altoslib/AltosMapLine.java b/altoslib/AltosMapLine.java index bd590136..187aa6d9 100644 --- a/altoslib/AltosMapLine.java +++ b/altoslib/AltosMapLine.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.lang.Math; @@ -50,7 +50,7 @@ public abstract class AltosMapLine {  		if (AltosConvert.imperial_units) {  			distance = AltosConvert.meters_to_feet(distance); -			if (distance < 10000) { +			if (distance < 1000) {  				format = "%4.0fft";  			} else {  				distance /= 5280; @@ -64,7 +64,7 @@ public abstract class AltosMapLine {  					format = "%5.0fmi";  			}  		} else { -			if (distance < 10000) { +			if (distance < 1000) {  				format = "%4.0fm";  			} else {  				distance /= 1000; diff --git a/altoslib/AltosMapLoader.java b/altoslib/AltosMapLoader.java index 7112a1c4..d715df38 100644 --- a/altoslib/AltosMapLoader.java +++ b/altoslib/AltosMapLoader.java @@ -15,16 +15,17 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; +import java.util.concurrent.*;  import java.text.*;  import java.lang.Math;  import java.net.URL;  import java.net.URLConnection; -public class AltosMapLoader extends Thread implements AltosMapTileListener { +public class AltosMapLoader extends Thread implements AltosMapStoreListener {  	AltosMapLoaderListener	listener;  	double	latitude, longitude; @@ -34,6 +35,7 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener {  	int	all_types;  	int	cur_type;  	double	radius; +	int	scale;  	int	tiles_loaded_layer;  	int	tiles_loaded_total; @@ -42,7 +44,11 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener {  	int	layers_total;  	int	layers_loaded; -	AltosMap	map; +	private static final int	MAX_LOADING = 200; + +	private Semaphore	loading = new Semaphore(MAX_LOADING); + +	boolean	abort;  	int tile_radius(int zoom) {  		double	delta_lon = AltosMapTransform.lon_from_distance(latitude, radius); @@ -62,7 +68,7 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener {  		return (tile_radius * 2 + 1) * (tile_radius * 2 + 1);  	} -	public void do_load() { +	private boolean do_load() {  		tiles_this_layer = tiles_per_layer(cur_z);  		tiles_loaded_layer = 0;  		listener.debug("tiles_this_layer %d (zoom %d)\n", tiles_this_layer, cur_z); @@ -73,8 +79,6 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener {  		AltosLatLon load_centre = new AltosLatLon(latitude, longitude);  		AltosMapTransform transform = new AltosMapTransform(256, 256, zoom, load_centre); -		map.centre(load_centre); -  		AltosPointInt	upper_left;  		AltosPointInt	lower_right; @@ -88,16 +92,25 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener {  		for (int y = (int) upper_left.y; y <= lower_right.y; y += AltosMap.px_size) {  			for (int x = (int) upper_left.x; x <= lower_right.x; x += AltosMap.px_size) { +				try { +					loading.acquire(); +				} catch (InterruptedException ie) { +					return false; +				}  				AltosPointInt	point = new AltosPointInt(x, y);  				AltosLatLon	ul = transform.lat_lon(point);  				AltosLatLon	center = transform.lat_lon(new AltosPointDouble(x + AltosMap.px_size/2, y + AltosMap.px_size/2)); -				AltosMapTile	tile = map.map_interface.new_tile(null, ul, center, zoom, maptype, AltosMap.px_size); -				tile.add_listener(this); +				AltosMapStore	store = AltosMapStore.get(center, zoom, maptype, AltosMap.px_size, scale); +				listener.debug("load state %s url %s\n", AltosMapTile.status_name(store.status()), store.url); +				store.add_listener(this); +				if (abort) +					return false;  			}  		} +		return true;  	} -	public int next_type(int start) { +	private int next_type(int start) {  		int next_type;  		for (next_type = start;  		     next_type <= AltosMap.maptype_terrain && (all_types & (1 << next_type)) == 0; @@ -106,19 +119,19 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener {  		return next_type;  	} -	public void next_load() { +	private boolean next_load() {  		int next_type = next_type(cur_type + 1);  		if (next_type > AltosMap.maptype_terrain) {  			if (cur_z == max_z) { -				return; +				return false;  			} else {  				cur_z++;  			}  			next_type = next_type(0);  		}  		cur_type = next_type; -		do_load(); +		return true;  	}  	public void run() { @@ -147,15 +160,22 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener {  		listener.debug("total tiles %d layers %d\n", tiles_total, layers_total);  		listener.loader_start(tiles_total); -		do_load(); +		do { +			if (!do_load()) +				break; +		} while (next_load()); +		if (abort) +			listener.loader_done(tiles_total);  	} -	public synchronized void notify_tile(AltosMapTile tile, int status) { +	public synchronized void notify_store(AltosMapStore store, int status) {  		boolean	do_next = false;  		if (status == AltosMapTile.fetching)  			return; -		tile.remove_listener(this); +		loading.release(); + +		store.remove_listener(this);  		if (layers_loaded >= layers_total)  			return; @@ -163,7 +183,7 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener {  		++tiles_loaded_total;  		++tiles_loaded_layer; -		listener.debug("AltosMapLoader.notify_tile status %d total %d of %d layer %d of %d\n", +		listener.debug("AltosMapLoader.notify_store status %d total %d of %d layer %d of %d\n",  			       status, tiles_loaded_total, tiles_total, tiles_loaded_layer, tiles_this_layer);  		if (tiles_loaded_layer == tiles_this_layer) { @@ -174,19 +194,19 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener {  		if (tiles_loaded_total == tiles_total)  			listener.loader_done(tiles_total); -		else { +		else  			listener.loader_notify(tiles_loaded_total, -					       tiles_total, tile.store.file.toString()); -			if (do_next) -				next_load(); -		} +					       tiles_total, store.file.toString()); +	} + +	public void abort() { +		this.abort = true;  	} -	public AltosMapLoader(AltosMap map, AltosMapLoaderListener listener, -			      double latitude, double longitude, int min_z, int max_z, double radius, int all_types) { +	public AltosMapLoader(AltosMapLoaderListener listener, +			      double latitude, double longitude, int min_z, int max_z, double radius, int all_types, int scale) {  		listener.debug("lat %f lon %f min_z %d max_z %d radius %f all_types %d\n",  			       latitude, longitude, min_z, max_z, radius, all_types); -		this.map = map;  		this.listener = listener;  		this.latitude = latitude;  		this.longitude = longitude; @@ -194,6 +214,8 @@ public class AltosMapLoader extends Thread implements AltosMapTileListener {  		this.max_z = max_z;  		this.radius = radius;  		this.all_types = all_types; +		this.scale = scale; +		this.abort = false;  		start();  	}  } diff --git a/altoslib/AltosMapLoaderListener.java b/altoslib/AltosMapLoaderListener.java index 47d7b858..97c8b7f5 100644 --- a/altoslib/AltosMapLoaderListener.java +++ b/altoslib/AltosMapLoaderListener.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public interface AltosMapLoaderListener {  	public abstract void loader_start(int max); diff --git a/altoslib/AltosMapMark.java b/altoslib/AltosMapMark.java index db714922..0fac5b37 100644 --- a/altoslib/AltosMapMark.java +++ b/altoslib/AltosMapMark.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.lang.Math; diff --git a/altoslib/AltosMapPath.java b/altoslib/AltosMapPath.java index 6f6db4f4..75664f83 100644 --- a/altoslib/AltosMapPath.java +++ b/altoslib/AltosMapPath.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.lang.Math; diff --git a/altoslib/AltosMapPathPoint.java b/altoslib/AltosMapPathPoint.java index 5b46cb19..89494408 100644 --- a/altoslib/AltosMapPathPoint.java +++ b/altoslib/AltosMapPathPoint.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.lang.Math; diff --git a/altoslib/AltosMapRectangle.java b/altoslib/AltosMapRectangle.java index b6294a4e..566e414f 100644 --- a/altoslib/AltosMapRectangle.java +++ b/altoslib/AltosMapRectangle.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosMapRectangle {  	AltosLatLon	ul, lr; diff --git a/altoslib/AltosMapStore.java b/altoslib/AltosMapStore.java index aed365ca..53bfd517 100644 --- a/altoslib/AltosMapStore.java +++ b/altoslib/AltosMapStore.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.net.*; @@ -28,6 +28,45 @@ public class AltosMapStore {  	int					status; +	private static File map_file(AltosLatLon center, int zoom, int maptype, int px_size, int scale) { +		double lat = center.lat; +		double lon = center.lon; +		char chlat = lat < 0 ? 'S' : 'N'; +		char chlon = lon < 0 ? 'W' : 'E'; + +		if (lat < 0) lat = -lat; +		if (lon < 0) lon = -lon; +		String maptype_string = String.format("%s-", AltosMap.maptype_names[maptype]); +		String format_string; +		if (maptype == AltosMap.maptype_hybrid || maptype == AltosMap.maptype_satellite || maptype == AltosMap.maptype_terrain) +			format_string = "jpg"; +		else +			format_string = "png"; +		return new File(AltosPreferences.mapdir(), +				String.format("map-%c%.6f,%c%.6f-%s%d%s.%s", +					      chlat, lat, chlon, lon, maptype_string, zoom, scale == 1 ? "" : String.format("-%d", scale), format_string)); +	} + +	private static String map_url(AltosLatLon center, int zoom, int maptype, int px_size, int scale) { +		String format_string; +		int z = zoom; + +		if (maptype == AltosMap.maptype_hybrid || maptype == AltosMap.maptype_satellite || maptype == AltosMap.maptype_terrain) +			format_string = "jpg"; +		else +			format_string = "png32"; + +		for (int s = 1; s < scale; s <<= 1) +			z--; + +		if (AltosVersion.has_google_maps_api_key()) +			return String.format("http://maps.google.com/maps/api/staticmap?center=%.6f,%.6f&zoom=%d&size=%dx%d&scale=%d&sensor=false&maptype=%s&format=%s&key=%s", +					     center.lat, center.lon, z, px_size/scale, px_size/scale, scale, AltosMap.maptype_names[maptype], format_string, AltosVersion.google_maps_api_key); +		else +			return String.format("http://maps.google.com/maps/api/staticmap?center=%.6f,%.6f&zoom=%d&size=%dx%d&scale=%d&sensor=false&maptype=%s&format=%s", +					     center.lat, center.lon, z, px_size/scale, px_size/scale, AltosMap.maptype_names[maptype], format_string); +	} +  	public int status() {  		return status;  	} @@ -229,16 +268,19 @@ public class AltosMapStore {  	static HashMap<String,AltosMapStore> stores = new HashMap<String,AltosMapStore>(); -	public static AltosMapStore get(String url, File file) { +	public static AltosMapStore get(AltosLatLon center, int zoom, int maptype, int px_size, int scale) { +		String url = map_url(center, zoom, maptype, px_size, scale); +  		AltosMapStore	store;  		synchronized(stores) {  			if (stores.containsKey(url)) {  				store = stores.get(url);  			} else { -				store = new AltosMapStore(url, file); +				store = new AltosMapStore(url, map_file(center, zoom, maptype, px_size, scale));  				stores.put(url, store);  			}  		}  		return store;  	} +  } diff --git a/altoslib/AltosMapStoreListener.java b/altoslib/AltosMapStoreListener.java index 65bd6ef8..bfee5f5c 100644 --- a/altoslib/AltosMapStoreListener.java +++ b/altoslib/AltosMapStoreListener.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public interface AltosMapStoreListener {  	abstract void notify_store(AltosMapStore store, int status); diff --git a/altoslib/AltosMapTile.java b/altoslib/AltosMapTile.java index fdc8ff65..b65f6fc1 100644 --- a/altoslib/AltosMapTile.java +++ b/altoslib/AltosMapTile.java @@ -15,12 +15,12 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; -public abstract class AltosMapTile implements AltosFontListener, AltosMapStoreListener { +public class AltosMapTile implements AltosFontListener, AltosMapStoreListener {  	LinkedList<AltosMapTileListener>	listeners = new LinkedList<AltosMapTileListener>();  	public AltosLatLon	upper_left, center;  	public int		px_size; @@ -38,43 +38,23 @@ public abstract class AltosMapTile implements AltosFontListener, AltosMapStoreLi  	static public final int	bad_request = 4;/* downloading failed */  	static public final int	forbidden = 5;	/* downloading failed */ -	private File map_file() { -		double lat = center.lat; -		double lon = center.lon; -		char chlat = lat < 0 ? 'S' : 'N'; -		char chlon = lon < 0 ? 'W' : 'E'; - -		if (lat < 0) lat = -lat; -		if (lon < 0) lon = -lon; -		String maptype_string = String.format("%s-", AltosMap.maptype_names[maptype]); -		String format_string; -		if (maptype == AltosMap.maptype_hybrid || maptype == AltosMap.maptype_satellite || maptype == AltosMap.maptype_terrain) -			format_string = "jpg"; -		else -			format_string = "png"; -		return new File(AltosPreferences.mapdir(), -				String.format("map-%c%.6f,%c%.6f-%s%d%s.%s", -					      chlat, lat, chlon, lon, maptype_string, zoom, scale == 1 ? "" : String.format("-%d", scale), format_string)); -	} - -	private String map_url() { -		String format_string; -		int z = zoom; - -		if (maptype == AltosMap.maptype_hybrid || maptype == AltosMap.maptype_satellite || maptype == AltosMap.maptype_terrain) -			format_string = "jpg"; -		else -			format_string = "png32"; - -		for (int s = 1; s < scale; s <<= 1) -			z--; - -		if (AltosVersion.has_google_maps_api_key()) -			return String.format("http://maps.google.com/maps/api/staticmap?center=%.6f,%.6f&zoom=%d&size=%dx%d&scale=%d&sensor=false&maptype=%s&format=%s&key=%s", -					     center.lat, center.lon, z, px_size/scale, px_size/scale, scale, AltosMap.maptype_names[maptype], format_string, AltosVersion.google_maps_api_key); -		else -			return String.format("http://maps.google.com/maps/api/staticmap?center=%.6f,%.6f&zoom=%d&size=%dx%d&scale=%d&sensor=false&maptype=%s&format=%s", -					     center.lat, center.lon, z, px_size/scale, px_size/scale, AltosMap.maptype_names[maptype], format_string); +	static public String status_name(int status) { +		switch (status) { +		case loaded: +			return "loaded"; +		case fetched: +			return "fetched"; +		case fetching: +			return "fetching"; +		case failed: +			return "failed"; +		case bad_request: +			return "bad_request"; +		case forbidden: +			return "forbidden"; +		default: +			return "unknown"; +		}  	}  	public void font_size_changed(int font_size) { @@ -87,7 +67,6 @@ public abstract class AltosMapTile implements AltosFontListener, AltosMapStoreLi  	}  	public void notify_store(AltosMapStore store, int status) { -//		System.out.printf("AltosMapTile.notify_store %d\n", status);  		notify_listeners(status);  	} @@ -99,7 +78,8 @@ public abstract class AltosMapTile implements AltosFontListener, AltosMapStoreLi  		notify_listeners(status);  	} -	public abstract void paint(AltosMapTransform t); +	public void paint(AltosMapTransform t) { +	}  	public AltosImage get_image() {  		if (cache == null) @@ -132,11 +112,7 @@ public abstract class AltosMapTile implements AltosFontListener, AltosMapStoreLi  		this.px_size = px_size;  		this.scale = scale; -		store = AltosMapStore.get(map_url(), map_file()); +		store = AltosMapStore.get(center, zoom, maptype, px_size, scale);  		store.add_listener(this);  	} - -	public AltosMapTile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size) { -		this(cache, upper_left, center, zoom, maptype, px_size, 1); -	}  } diff --git a/altoslib/AltosMapTileListener.java b/altoslib/AltosMapTileListener.java index 6d78b205..7939e4bd 100644 --- a/altoslib/AltosMapTileListener.java +++ b/altoslib/AltosMapTileListener.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public interface AltosMapTileListener {  	abstract public void notify_tile(AltosMapTile tile, int status); diff --git a/altoslib/AltosMapTransform.java b/altoslib/AltosMapTransform.java index b8901127..53f3abac 100644 --- a/altoslib/AltosMapTransform.java +++ b/altoslib/AltosMapTransform.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.lang.Math; diff --git a/altoslib/AltosMapTypeListener.java b/altoslib/AltosMapTypeListener.java index b82bda3f..20740e7d 100644 --- a/altoslib/AltosMapTypeListener.java +++ b/altoslib/AltosMapTypeListener.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public interface AltosMapTypeListener {  	public void map_type_changed(int map_type); diff --git a/altoslib/AltosMapZoomListener.java b/altoslib/AltosMapZoomListener.java index 51f8c3c5..59c91e8e 100644 --- a/altoslib/AltosMapZoomListener.java +++ b/altoslib/AltosMapZoomListener.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public interface AltosMapZoomListener {  	abstract public void zoom_changed(int zoom); diff --git a/altoslib/AltosMma655x.java b/altoslib/AltosMma655x.java index b09ec74b..57bc7b91 100644 --- a/altoslib/AltosMma655x.java +++ b/altoslib/AltosMma655x.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.util.concurrent.*; diff --git a/altoslib/AltosMs5607.java b/altoslib/AltosMs5607.java index 1277f267..e40479b1 100644 --- a/altoslib/AltosMs5607.java +++ b/altoslib/AltosMs5607.java @@ -15,12 +15,12 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.util.concurrent.*;  import java.io.*; -public class AltosMs5607 implements Serializable { +public class AltosMs5607 {  	public int	reserved;  	public int	sens;  	public int	off; diff --git a/altoslib/AltosNoSymbol.java b/altoslib/AltosNoSymbol.java index 5451047e..3f3cbbe7 100644 --- a/altoslib/AltosNoSymbol.java +++ b/altoslib/AltosNoSymbol.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosNoSymbol extends Exception {  	public AltosNoSymbol(String name) { diff --git a/altoslib/AltosOrient.java b/altoslib/AltosOrient.java index 8b22c131..edaa304c 100644 --- a/altoslib/AltosOrient.java +++ b/altoslib/AltosOrient.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosOrient extends AltosUnits { diff --git a/altoslib/AltosParse.java b/altoslib/AltosParse.java index 1cbddcf9..45ef7dac 100644 --- a/altoslib/AltosParse.java +++ b/altoslib/AltosParse.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.util.*;  import java.text.*; @@ -27,6 +27,14 @@ public class AltosParse {  	public static int parse_int(String v) throws ParseException {  		try { +			return (int) AltosLib.fromdec(v); +		} catch (NumberFormatException e) { +			throw new ParseException("error parsing int " + v, 0); +		} +	} + +	public static long parse_long(String v) throws ParseException { +		try {  			return AltosLib.fromdec(v);  		} catch (NumberFormatException e) {  			throw new ParseException("error parsing int " + v, 0); @@ -41,9 +49,23 @@ public class AltosParse {  		}  	} -	static NumberFormat nf_locale = NumberFormat.getInstance(); +	static NumberFormat get_nf_locale() { +		NumberFormat nf = NumberFormat.getInstance(); +		nf.setParseIntegerOnly(false); +		nf.setGroupingUsed(false); +		return nf; +	} + +	static NumberFormat nf_locale = get_nf_locale(); + +	static NumberFormat get_nf_net() { +		NumberFormat nf = NumberFormat.getInstance(Locale.ROOT); +		nf.setParseIntegerOnly(false); +		nf.setGroupingUsed(false); +		return nf; +	} -	static NumberFormat nf_net = NumberFormat.getInstance(Locale.ROOT); +	static NumberFormat nf_net = get_nf_net();  	public static double parse_double_locale(String str) throws ParseException {  		try { @@ -53,14 +75,26 @@ public class AltosParse {  		}  	} +	public static String format_double_locale(double number) { +		return nf_locale.format(number); +	} +  	public static double parse_double_net(String str) throws ParseException {  		try { -			return nf_net.parse(str.trim()).doubleValue(); +			String t = str.trim(); +//			System.out.printf("Parse string \"%s\" trim \"%s\"\n", str, t); +			return nf_net.parse(t).doubleValue();  		} catch (ParseException pe) {  			throw new ParseException("error parsing double " + str, 0);  		}  	} +	public static String format_double_net(double number) { +		String ret = nf_net.format(number); +//		System.out.printf("format double %f \"%s\"\n", number, ret); +		return ret; +	} +  	public static double parse_coord(String coord) throws ParseException {  		String[]	dsf = coord.split("\\D+"); diff --git a/altoslib/AltosPointDouble.java b/altoslib/AltosPointDouble.java index 65bad427..b18c4b48 100644 --- a/altoslib/AltosPointDouble.java +++ b/altoslib/AltosPointDouble.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosPointDouble {  	public double	x, y; diff --git a/altoslib/AltosPointInt.java b/altoslib/AltosPointInt.java index 34eb6fd3..14b0dabf 100644 --- a/altoslib/AltosPointInt.java +++ b/altoslib/AltosPointInt.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosPointInt {  	public int	x, y; diff --git a/altoslib/AltosPreferences.java b/altoslib/AltosPreferences.java index fb3026a4..569aaa54 100644 --- a/altoslib/AltosPreferences.java +++ b/altoslib/AltosPreferences.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; @@ -116,7 +116,7 @@ public class AltosPreferences {  	public final static String	frequency_count = "COUNT";  	public final static String	frequency_format = "FREQUENCY-%d";  	public final static String	description_format = "DESCRIPTION-%d"; -	public final static String	frequenciesPreference = "FREQUENCIES"; +	public final static String	frequenciesPreference = "FREQUENCIES-1";  	/* Units preference */ @@ -133,24 +133,30 @@ public class AltosPreferences {  	static int	map_type;  	public static AltosFrequency[] load_common_frequencies() { -  		AltosFrequency[] frequencies = null; -		frequencies = (AltosFrequency[]) backend.getSerializable(frequenciesPreference, null); +		try { +			AltosJson json = AltosJson.fromString(backend.getString(frequenciesPreference, +										null)); +			frequencies = (AltosFrequency[]) json.make(frequencies.getClass()); +		} catch (Exception e) { +		}  		if (frequencies == null) {  			if (backend.nodeExists(common_frequencies_node_name)) {  				AltosPreferencesBackend	node = backend.node(common_frequencies_node_name);  				int		count = node.getInt(frequency_count, 0); -				frequencies = new AltosFrequency[count]; -				for (int i = 0; i < count; i++) { -					double	frequency; -					String	description; +				if (count > 0) { +					frequencies = new AltosFrequency[count]; +					for (int i = 0; i < count; i++) { +						double	frequency; +						String	description; -					frequency = node.getDouble(String.format(frequency_format, i), 0.0); -					description = node.getString(String.format(description_format, i), null); -					frequencies[i] = new AltosFrequency(frequency, description); +						frequency = node.getDouble(String.format(frequency_format, i), 0.0); +						description = node.getString(String.format(description_format, i), null); +						frequencies[i] = new AltosFrequency(frequency, description); +					}  				}  			}  		} @@ -165,6 +171,12 @@ public class AltosPreferences {  		return frequencies;  	} +	public static void save_common_frequencies() { +		AltosJson	json = new AltosJson(common_frequencies); +		backend.putString(frequenciesPreference, json.toString()); +		flush_preferences(); +	} +  	public static int launcher_serial;  	public static int launcher_channel; @@ -353,7 +365,7 @@ public class AltosPreferences {  	public static void set_state(AltosState state) {  		synchronized(backend) { -			backend.putSerializable(String.format(statePreferenceFormat, state.serial), state); +			backend.putJson(String.format(statePreferenceFormat, state.serial), new AltosJson(state));  			backend.putInt(statePreferenceLatest, state.serial);  			flush_preferences();  		} @@ -378,6 +390,7 @@ public class AltosPreferences {  	public static void remove_state(int serial) {  		synchronized(backend) {  			backend.remove(String.format(statePreferenceFormat, serial)); +			flush_preferences();  		}  	} @@ -392,10 +405,12 @@ public class AltosPreferences {  	public static AltosState state(int serial) {  		synchronized(backend) {  			try { -				return (AltosState) backend.getSerializable(String.format(statePreferenceFormat, serial), null); +				AltosJson json = backend.getJson(String.format(statePreferenceFormat, serial)); +				if (json != null) +					return (AltosState) (json.make(AltosState.class));  			} catch (Exception e) { -				return null;  			} +			return null;  		}  	} @@ -512,8 +527,8 @@ public class AltosPreferences {  	public static void set_common_frequencies(AltosFrequency[] frequencies) {  		synchronized(backend) {  			common_frequencies = frequencies; -			backend.putSerializable(frequenciesPreference, frequencies); -			flush_preferences(); + +			save_common_frequencies();  		}  	} diff --git a/altoslib/AltosPreferencesBackend.java b/altoslib/AltosPreferencesBackend.java index 6e1124e2..0580652e 100644 --- a/altoslib/AltosPreferencesBackend.java +++ b/altoslib/AltosPreferencesBackend.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; @@ -38,40 +38,20 @@ public abstract class AltosPreferencesBackend {  	public abstract byte[]  getBytes(String key, byte[] def);  	public abstract void    putBytes(String key, byte[] value); -	public Serializable getSerializable(String key, Serializable def) { -		byte[] bytes = null; - -		bytes = getBytes(key, null); -		if (bytes == null) -			return def; - -		ByteArrayInputStream bais = new ByteArrayInputStream(bytes); +	public AltosJson	getJson(String key) { +		String	value = getString(key, null); +		if (value == null) +			return null;  		try { -			ObjectInputStream ois = new ObjectInputStream(bais); -			Serializable object = (Serializable) ois.readObject(); -			return object; -		} catch (IOException ie) { -			debug("IO exception %s\n", ie.toString()); -		} catch (ClassNotFoundException ce) { -			debug("ClassNotFoundException %s\n", ce.toString()); +			return AltosJson.fromString(value); +		} catch (IllegalArgumentException ie) { +			return null;  		} -		return def;  	} -	public void putSerializable(String key, Serializable object) { -		ByteArrayOutputStream baos = new ByteArrayOutputStream(); - -		try { -			ObjectOutputStream oos = new ObjectOutputStream(baos); - -			oos.writeObject(object); -			byte[] bytes = baos.toByteArray(); - -			putBytes(key, bytes); -		} catch (IOException ie) { -			debug("set_state failed %s\n", ie.toString()); -		} +	public void	       	putJson(String key, AltosJson j) { +		putString(key, j.toString());  	}  	public abstract boolean nodeExists(String key); diff --git a/altoslib/AltosProgrammer.java b/altoslib/AltosProgrammer.java index 2f8e3bd0..78be8282 100644 --- a/altoslib/AltosProgrammer.java +++ b/altoslib/AltosProgrammer.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*; diff --git a/altoslib/AltosPyro.java b/altoslib/AltosPyro.java index 28e65bc2..c948ce21 100644 --- a/altoslib/AltosPyro.java +++ b/altoslib/AltosPyro.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.util.*;  import java.text.*; @@ -138,7 +138,7 @@ public class AltosPyro {  			units = pyro_to_units.get(flag);  		if (units == null)  			return name; -		return String.format ("%s (%s)", name, units.show_units()); +		return String.format ("%s (%s)", name, units.parse_units());  	}  	public static AltosUnits pyro_to_units(int flag) { @@ -277,7 +277,7 @@ public class AltosPyro {  				int	value = 0;  				++i;  				try { -					value = AltosLib.fromdec(tokens[i]); +					value = (int) AltosLib.fromdec(tokens[i]);  				} catch (NumberFormatException n) {  					throw new ParseException(String.format("Invalid pyro value \"%s\"",  									       tokens[i]), i); diff --git a/altoslib/AltosQuaternion.java b/altoslib/AltosQuaternion.java index bc471c9c..79559429 100644 --- a/altoslib/AltosQuaternion.java +++ b/altoslib/AltosQuaternion.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosQuaternion {  	double	r;		/* real bit */ @@ -115,10 +115,17 @@ public class AltosQuaternion {  	}  	public AltosQuaternion(AltosQuaternion q) { -		this.r = q.r; -		this.x = q.x; -		this.y = q.y; -		this.z = q.z; +		r = q.r; +		x = q.x; +		y = q.y; +		z = q.z; +	} + +	public AltosQuaternion() { +		r = 1; +		x = 0; +		y = 0; +		z = 0;  	}  	static public AltosQuaternion vector(double x, double y, double z) { diff --git a/altoslib/AltosRectangle.java b/altoslib/AltosRectangle.java index 4757687d..e1705548 100644 --- a/altoslib/AltosRectangle.java +++ b/altoslib/AltosRectangle.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosRectangle {  	public int	x, y, width, height; diff --git a/altoslib/AltosReplayReader.java b/altoslib/AltosReplayReader.java index 0f77c979..f420c958 100644 --- a/altoslib/AltosReplayReader.java +++ b/altoslib/AltosReplayReader.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosRomconfig.java b/altoslib/AltosRomconfig.java index af201939..37585879 100644 --- a/altoslib/AltosRomconfig.java +++ b/altoslib/AltosRomconfig.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*; diff --git a/altoslib/AltosRotation.java b/altoslib/AltosRotation.java index e53a3a49..97cf7896 100644 --- a/altoslib/AltosRotation.java +++ b/altoslib/AltosRotation.java @@ -15,9 +15,9 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11; -public class AltosRotation { +public class AltosRotation extends AltosQuaternion {  	private AltosQuaternion		rotation;  	public double tilt() { @@ -47,4 +47,8 @@ public class AltosRotation {  		AltosQuaternion	up = new AltosQuaternion(0, 0, 0, sky);  		rotation = up.vectors_to_rotation(orient);  	} + +	public AltosRotation() { +		rotation = new AltosQuaternion(); +	}  } diff --git a/altoslib/AltosSavedState.java b/altoslib/AltosSavedState.java index 3dbf59a5..f1d3e993 100644 --- a/altoslib/AltosSavedState.java +++ b/altoslib/AltosSavedState.java @@ -15,11 +15,11 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*; -public class AltosSavedState implements Serializable { +public class AltosSavedState {  	public AltosState		state;  	public AltosListenerState	listener_state; diff --git a/altoslib/AltosSelfFlash.java b/altoslib/AltosSelfFlash.java index f996d7b1..b6056c9c 100644 --- a/altoslib/AltosSelfFlash.java +++ b/altoslib/AltosSelfFlash.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*; diff --git a/altoslib/AltosSensorEMini.java b/altoslib/AltosSensorEMini.java index 884800f8..875dad0b 100644 --- a/altoslib/AltosSensorEMini.java +++ b/altoslib/AltosSensorEMini.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorMM.java b/altoslib/AltosSensorMM.java index 99eca9d8..654f85bd 100644 --- a/altoslib/AltosSensorMM.java +++ b/altoslib/AltosSensorMM.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorMega.java b/altoslib/AltosSensorMega.java index a4224311..18474e18 100644 --- a/altoslib/AltosSensorMega.java +++ b/altoslib/AltosSensorMega.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorMetrum.java b/altoslib/AltosSensorMetrum.java index 1b09647f..5f56a899 100644 --- a/altoslib/AltosSensorMetrum.java +++ b/altoslib/AltosSensorMetrum.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorTGPS.java b/altoslib/AltosSensorTGPS.java index 9f572eca..80b27824 100644 --- a/altoslib/AltosSensorTGPS.java +++ b/altoslib/AltosSensorTGPS.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorTM.java b/altoslib/AltosSensorTM.java index bb842b52..e80bac6a 100644 --- a/altoslib/AltosSensorTM.java +++ b/altoslib/AltosSensorTM.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSensorTMini.java b/altoslib/AltosSensorTMini.java index 9e01b50c..739670f5 100644 --- a/altoslib/AltosSensorTMini.java +++ b/altoslib/AltosSensorTMini.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.util.concurrent.TimeoutException; diff --git a/altoslib/AltosSpeed.java b/altoslib/AltosSpeed.java index e09bbb7a..73851979 100644 --- a/altoslib/AltosSpeed.java +++ b/altoslib/AltosSpeed.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosSpeed extends AltosUnits { diff --git a/altoslib/AltosState.java b/altoslib/AltosState.java index 7b41e98d..15cf7d64 100644 --- a/altoslib/AltosState.java +++ b/altoslib/AltosState.java @@ -19,11 +19,11 @@   * Track flight state from telemetry or eeprom data stream   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*; -public class AltosState implements Cloneable, Serializable { +public class AltosState implements Cloneable {  	public static final int set_position = 1;  	public static final int set_gps = 2; @@ -46,7 +46,7 @@ public class AltosState implements Cloneable, Serializable {  	private int	prev_tick;  	public int	boost_tick; -	class AltosValue implements Serializable{ +	class AltosValue {  		double	value;  		double	prev_value;  		private double	max_value; @@ -182,14 +182,19 @@ public class AltosState implements Cloneable, Serializable {  			prev_value = AltosLib.MISSING;  			max_value = AltosLib.MISSING;  		} +  	} -	class AltosCValue implements Serializable { +	class AltosCValue { -		class AltosIValue extends AltosValue implements Serializable { +		class AltosIValue extends AltosValue {  			boolean can_max() {  				return c_can_max();  			} + +			AltosIValue() { +				super(); +			}  		};  		public AltosIValue	measured; @@ -278,7 +283,7 @@ public class AltosState implements Cloneable, Serializable {  			computed.finish_update();  		} -		AltosCValue() { +		public AltosCValue() {  			measured = new AltosIValue();  			computed = new AltosIValue();  		} @@ -317,7 +322,7 @@ public class AltosState implements Cloneable, Serializable {  		ground_altitude.set_measured(a, time);  	} -	class AltosGpsGroundAltitude extends AltosValue implements Serializable { +	class AltosGpsGroundAltitude extends AltosValue {  		void set(double a, double t) {  			super.set(a, t);  			pad_alt = value(); @@ -329,6 +334,10 @@ public class AltosState implements Cloneable, Serializable {  			pad_alt = value();  			gps_altitude.set_gps_height();  		} + +		AltosGpsGroundAltitude() { +			super(); +		}  	}  	private AltosGpsGroundAltitude gps_ground_altitude; @@ -341,7 +350,7 @@ public class AltosState implements Cloneable, Serializable {  		gps_ground_altitude.set(a, time);  	} -	class AltosGroundPressure extends AltosCValue implements Serializable { +	class AltosGroundPressure extends AltosCValue {  		void set_filtered(double p, double time) {  			computed.set_filtered(p, time);  			if (!is_measured()) @@ -352,6 +361,10 @@ public class AltosState implements Cloneable, Serializable {  			super.set_measured(p, time);  			ground_altitude.set_computed(pressure_to_altitude(p), time);  		} + +		AltosGroundPressure () { +			super(); +		}  	}  	private AltosGroundPressure ground_pressure; @@ -364,7 +377,7 @@ public class AltosState implements Cloneable, Serializable {  		ground_pressure.set_measured(pressure, time);  	} -	class AltosAltitude extends AltosCValue implements Serializable { +	class AltosAltitude extends AltosCValue {  		private void set_speed(AltosValue v) {  			if (!acceleration.is_measured() || !ascent) @@ -382,11 +395,15 @@ public class AltosState implements Cloneable, Serializable {  			set_speed(measured);  			set |= set_position;  		} + +		AltosAltitude() { +			super(); +		}  	}  	private AltosAltitude	altitude; -	class AltosGpsAltitude extends AltosValue implements Serializable { +	class AltosGpsAltitude extends AltosValue {  		private void set_gps_height() {  			double	a = value(); @@ -402,6 +419,10 @@ public class AltosState implements Cloneable, Serializable {  			super.set(a, t);  			set_gps_height();  		} + +		AltosGpsAltitude() { +			super(); +		}  	}  	private AltosGpsAltitude	gps_altitude; @@ -469,7 +490,7 @@ public class AltosState implements Cloneable, Serializable {  		return gps_speed.max();  	} -	class AltosPressure extends AltosValue implements Serializable { +	class AltosPressure extends AltosValue {  		void set(double p, double time) {  			super.set(p, time);  			if (state == AltosLib.ao_flight_pad) @@ -477,6 +498,10 @@ public class AltosState implements Cloneable, Serializable {  			double a = pressure_to_altitude(p);  			altitude.set_computed(a, time);  		} + +		AltosPressure() { +			super(); +		}  	}  	private AltosPressure	pressure; @@ -539,7 +564,7 @@ public class AltosState implements Cloneable, Serializable {  		return AltosLib.MISSING;  	} -	class AltosSpeed extends AltosCValue implements Serializable { +	class AltosSpeed extends AltosCValue {  		boolean can_max() {  			return state < AltosLib.ao_flight_fast || state == AltosLib.ao_flight_stateless; @@ -563,6 +588,10 @@ public class AltosState implements Cloneable, Serializable {  			super.set_measured(new_value, time);  			set_accel();  		} + +		AltosSpeed() { +			super(); +		}  	}  	private AltosSpeed speed; @@ -593,7 +622,7 @@ public class AltosState implements Cloneable, Serializable {  		return AltosLib.MISSING;  	} -	class AltosAccel extends AltosCValue implements Serializable { +	class AltosAccel extends AltosCValue {  		boolean can_max() {  			return state < AltosLib.ao_flight_fast || state == AltosLib.ao_flight_stateless; @@ -604,6 +633,10 @@ public class AltosState implements Cloneable, Serializable {  			if (ascent)  				speed.set_integral(this.measured);  		} + +		AltosAccel() { +			super(); +		}  	}  	AltosAccel acceleration; @@ -684,6 +717,7 @@ public class AltosState implements Cloneable, Serializable {  	public double	ground_accel_avg;  	public int	log_format; +	public int	log_space;  	public String	product;  	public AltosMs5607	baro; @@ -801,6 +835,7 @@ public class AltosState implements Cloneable, Serializable {  		ground_accel_avg = AltosLib.MISSING;  		log_format = AltosLib.MISSING; +		log_space = AltosLib.MISSING;  		product = null;  		serial = AltosLib.MISSING;  		receiver_serial = AltosLib.MISSING; @@ -960,6 +995,7 @@ public class AltosState implements Cloneable, Serializable {  		ground_accel_avg = old.ground_accel_avg;  		log_format = old.log_format; +		log_space = old.log_space;  		product = old.product;  		serial = old.serial;  		receiver_serial = old.receiver_serial; @@ -1078,6 +1114,10 @@ public class AltosState implements Cloneable, Serializable {  		}  	} +	public void set_log_space(int log_space) { +		this.log_space = log_space; +	} +  	public void set_flight_params(int apogee_delay, int main_deploy) {  		this.apogee_delay = apogee_delay;  		this.main_deploy = main_deploy; @@ -1483,6 +1523,31 @@ public class AltosState implements Cloneable, Serializable {  	public AltosState clone() {  		AltosState s = new AltosState();  		s.copy(this); + +		/* Code to test state save/restore. Enable only for that purpose +		 */ +		if (false) { +			AltosJson	json = new AltosJson(this); +			String		onetrip = json.toPrettyString(); +			AltosJson	back = AltosJson.fromString(onetrip); +			AltosState	tripstate = (AltosState) back.make(this.getClass()); +			AltosJson	tripjson = new AltosJson(tripstate); +			String		twotrip = tripjson.toPrettyString(); + +			if (!onetrip.equals(twotrip)) { +				try { +					FileWriter one_file = new FileWriter("one.json", true); +					one_file.write(onetrip); +					one_file.flush(); +					FileWriter two_file = new FileWriter("two.json", true); +					two_file.write(twotrip); +					two_file.flush(); +				} catch (Exception e) { +				} +				System.out.printf("json error\n"); +				System.exit(1); +			} +		}  		return s;  	} diff --git a/altoslib/AltosStateIterable.java b/altoslib/AltosStateIterable.java index a7baa85e..bce2a8d9 100644 --- a/altoslib/AltosStateIterable.java +++ b/altoslib/AltosStateIterable.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; @@ -32,7 +32,6 @@ public abstract class AltosStateIterable implements Iterable<AltosState> {  		try {  			in = new FileInputStream(file);  		} catch (Exception e) { -			System.out.printf("Failed to open file '%s'\n", file);  			return null;  		}  		if (file.getName().endsWith("telem")) diff --git a/altoslib/AltosStateUpdate.java b/altoslib/AltosStateUpdate.java index 12d4dd41..1209c2a0 100644 --- a/altoslib/AltosStateUpdate.java +++ b/altoslib/AltosStateUpdate.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public interface AltosStateUpdate {  	public void	update_state(AltosState state) throws InterruptedException, AltosUnknownProduct; diff --git a/altoslib/AltosTelemetry.java b/altoslib/AltosTelemetry.java index 67caa60c..d526e6e5 100644 --- a/altoslib/AltosTelemetry.java +++ b/altoslib/AltosTelemetry.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.text.*; diff --git a/altoslib/AltosTelemetryCompanion.java b/altoslib/AltosTelemetryCompanion.java index b9d32f48..8f0d06b0 100644 --- a/altoslib/AltosTelemetryCompanion.java +++ b/altoslib/AltosTelemetryCompanion.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosTelemetryCompanion extends AltosTelemetryStandard {  	AltosCompanion	companion; diff --git a/altoslib/AltosTelemetryConfiguration.java b/altoslib/AltosTelemetryConfiguration.java index cd2cb8ca..352f1808 100644 --- a/altoslib/AltosTelemetryConfiguration.java +++ b/altoslib/AltosTelemetryConfiguration.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosTelemetryConfiguration extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryFile.java b/altoslib/AltosTelemetryFile.java index b80c2dc9..5f512e14 100644 --- a/altoslib/AltosTelemetryFile.java +++ b/altoslib/AltosTelemetryFile.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosTelemetryIterable.java b/altoslib/AltosTelemetryIterable.java index ff395868..256626f3 100644 --- a/altoslib/AltosTelemetryIterable.java +++ b/altoslib/AltosTelemetryIterable.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.io.*;  import java.util.*; diff --git a/altoslib/AltosTelemetryLegacy.java b/altoslib/AltosTelemetryLegacy.java index 6c0fcfeb..df41b7d9 100644 --- a/altoslib/AltosTelemetryLegacy.java +++ b/altoslib/AltosTelemetryLegacy.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.text.*; diff --git a/altoslib/AltosTelemetryLocation.java b/altoslib/AltosTelemetryLocation.java index 33c36449..1cff3cd4 100644 --- a/altoslib/AltosTelemetryLocation.java +++ b/altoslib/AltosTelemetryLocation.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosTelemetryLocation extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryMap.java b/altoslib/AltosTelemetryMap.java index 13b5dbea..8e5bcd1c 100644 --- a/altoslib/AltosTelemetryMap.java +++ b/altoslib/AltosTelemetryMap.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.text.*;  import java.util.HashMap; diff --git a/altoslib/AltosTelemetryMegaData.java b/altoslib/AltosTelemetryMegaData.java index d71f2802..ed0211a9 100644 --- a/altoslib/AltosTelemetryMegaData.java +++ b/altoslib/AltosTelemetryMegaData.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosTelemetryMegaData extends AltosTelemetryStandard {  	int	state; diff --git a/altoslib/AltosTelemetryMegaSensor.java b/altoslib/AltosTelemetryMegaSensor.java index f0d16f19..365db92d 100644 --- a/altoslib/AltosTelemetryMegaSensor.java +++ b/altoslib/AltosTelemetryMegaSensor.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosTelemetryMegaSensor extends AltosTelemetryStandard {  	int	accel; diff --git a/altoslib/AltosTelemetryMetrumData.java b/altoslib/AltosTelemetryMetrumData.java index a4e9116f..0d943836 100644 --- a/altoslib/AltosTelemetryMetrumData.java +++ b/altoslib/AltosTelemetryMetrumData.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosTelemetryMetrumData extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryMetrumSensor.java b/altoslib/AltosTelemetryMetrumSensor.java index 1b405f2b..0ccc4e15 100644 --- a/altoslib/AltosTelemetryMetrumSensor.java +++ b/altoslib/AltosTelemetryMetrumSensor.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosTelemetryMetrumSensor extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryMini.java b/altoslib/AltosTelemetryMini.java index 8996d662..8bca55fa 100644 --- a/altoslib/AltosTelemetryMini.java +++ b/altoslib/AltosTelemetryMini.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosTelemetryMini extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryRaw.java b/altoslib/AltosTelemetryRaw.java index 8cf023a4..c28d04d3 100644 --- a/altoslib/AltosTelemetryRaw.java +++ b/altoslib/AltosTelemetryRaw.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosTelemetryRaw extends AltosTelemetryStandard {  	public AltosTelemetryRaw(int[] bytes) { diff --git a/altoslib/AltosTelemetryReader.java b/altoslib/AltosTelemetryReader.java index 2b0a443c..370610b1 100644 --- a/altoslib/AltosTelemetryReader.java +++ b/altoslib/AltosTelemetryReader.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.text.*;  import java.io.*; diff --git a/altoslib/AltosTelemetrySatellite.java b/altoslib/AltosTelemetrySatellite.java index de60e63c..d88e6cac 100644 --- a/altoslib/AltosTelemetrySatellite.java +++ b/altoslib/AltosTelemetrySatellite.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosTelemetrySatellite extends AltosTelemetryStandard {  	int		channels; diff --git a/altoslib/AltosTelemetrySensor.java b/altoslib/AltosTelemetrySensor.java index 74b61d3c..7a4a9f35 100644 --- a/altoslib/AltosTelemetrySensor.java +++ b/altoslib/AltosTelemetrySensor.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosTelemetrySensor extends AltosTelemetryStandard { diff --git a/altoslib/AltosTelemetryStandard.java b/altoslib/AltosTelemetryStandard.java index 7086abfc..dea9c29e 100644 --- a/altoslib/AltosTelemetryStandard.java +++ b/altoslib/AltosTelemetryStandard.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public abstract class AltosTelemetryStandard extends AltosTelemetry {  	int[]	bytes; diff --git a/altoslib/AltosTemperature.java b/altoslib/AltosTemperature.java index a1e485b3..2b261b70 100644 --- a/altoslib/AltosTemperature.java +++ b/altoslib/AltosTemperature.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosTemperature extends AltosUnits { diff --git a/altoslib/AltosUnits.java b/altoslib/AltosUnits.java index 13b9dbe6..b46b30ad 100644 --- a/altoslib/AltosUnits.java +++ b/altoslib/AltosUnits.java @@ -15,12 +15,27 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import java.text.*;  public abstract class AltosUnits { +	AltosUnitsRange[]	range_metric, range_imperial; + +	private AltosUnitsRange range(double v, boolean imperial_units) { +		AltosUnitsRange[]	ranges = imperial_units ? range_imperial : range_metric; + +		for (int i = ranges.length - 1; i > 0; i--) +			if (v >= ranges[i].lower_limit) +				return ranges[i]; +		return ranges[0]; +	} + +	private AltosUnitsRange first_range(boolean imperial_units) { +		return imperial_units ? range_imperial[0] : range_metric[0]; +	} +  	public abstract double value(double v, boolean imperial_units);  	public abstract double inverse(double v, boolean imperial_units); @@ -31,89 +46,168 @@ public abstract class AltosUnits {  	public abstract int show_fraction(int width, boolean imperial_units); -	public double parse_locale(String s, boolean imperial_units) throws ParseException { -		double v = AltosParse.parse_double_locale(s); -		return inverse(v, imperial_units); +	private double value(double v) { +		return value(v, AltosConvert.imperial_units);  	} -	public double parse_net(String s, boolean imperial_units) throws ParseException { -		double v = AltosParse.parse_double_net(s); -		return inverse(v, imperial_units); +	private double inverse(double v) { +		return inverse(v, AltosConvert.imperial_units);  	} -	public double parse_locale(String s) throws ParseException { -		return parse_locale(s, AltosConvert.imperial_units); +	private String show_units() { +		return show_units(AltosConvert.imperial_units);  	} -	public double parse_net(String s) throws ParseException { -		return parse_net(s, AltosConvert.imperial_units); +	private String say_units() { +		return say_units(AltosConvert.imperial_units);  	} -	public double value(double v) { -		return value(v, AltosConvert.imperial_units); +	private int show_fraction(int width) { +		return show_fraction(width, AltosConvert.imperial_units);  	} -	public double inverse(double v) { -		return inverse(v, AltosConvert.imperial_units); +	private int say_fraction(boolean imperial_units) { +		return 0;  	} -	public String show_units() { -		return show_units(AltosConvert.imperial_units); +	private String show_format(AltosUnitsRange range, int width) { +		return String.format("%%%d.%df %s", width, range.show_fraction(width), range.show_units);  	} -	public String say_units() { -		return say_units(AltosConvert.imperial_units); +	private String say_format(AltosUnitsRange range) { +		return String.format("%%1.%df", range.say_fraction());  	} -	public int show_fraction(int width) { -		return show_fraction(width, AltosConvert.imperial_units); +	private String say_units_format(AltosUnitsRange range)  { +		return String.format("%%1.%df %s", range.say_fraction(), range.say_units);  	} -	int say_fraction(boolean imperial_units) { -		return 0; +	public String show(int width, double v, boolean imperial_units) { +		AltosUnitsRange range = range(v, imperial_units); + +		return String.format(show_format(range, width), range.value(v)); +	} + +	public String say(double v, boolean imperial_units) { +		AltosUnitsRange range = range(v, imperial_units); + +		return String.format(say_format(range), range.value(v)); +	} + +	public String say_units(double v, boolean imperial_units) { +		AltosUnitsRange range = range(v, imperial_units); + +		return String.format(say_units_format(range), range.value(v)); +	} + +	public String show(int width, double v) { +		return show(width, v, AltosConvert.imperial_units); +	} + +	public String say(double v) { +		return say(v, AltosConvert.imperial_units); +	} + +	public String say_units(double v) { +		return say_units(v, AltosConvert.imperial_units); +	} + +	/* Parsing functions. Use the first range of the type */ +	public String parse_units(boolean imperial_units) { +		return first_range(imperial_units).show_units; +	} + +	public String parse_units() { +		return parse_units(AltosConvert.imperial_units); +	} + +	public double parse_value(double v, boolean imperial_units) { +		return first_range(imperial_units).value(v); +	} + +	public double parse_value(double v) { +		return parse_value(v, AltosConvert.imperial_units);  	} -	private String show_format(int width, boolean imperial_units) { -		return String.format("%%%d.%df %s", width, show_fraction(width, imperial_units), show_units(imperial_units)); +	/* Graphing functions. Use the first range of the type */ +	public String graph_units(boolean imperial_units) { +		return first_range(imperial_units).show_units;  	} -	private String say_format(boolean imperial_units) { -		return String.format("%%1.%df", say_fraction(imperial_units)); +	public String graph_units() { +		return graph_units(AltosConvert.imperial_units);  	} -	private String say_units_format(boolean imperial_units) { -		return String.format("%%1.%df %s", say_fraction(imperial_units), say_units(imperial_units)); +	public double graph_value(double v, boolean imperial_units) { +		return first_range(imperial_units).value(v); +	} + +	public double graph_value(double v) { +		return graph_value(v, AltosConvert.imperial_units); +	} + +	private String graph_format(AltosUnitsRange range, int width) { +		return String.format(String.format("%%%d.%df", width, range.show_fraction(width)), 0.0);  	}  	public String graph_format(int width, boolean imperial_units) { -		return String.format(String.format("%%%d.%df", width, show_fraction(width, imperial_units)), 0.0); +		return graph_format(first_range(imperial_units), width);  	}  	public String graph_format(int width) {  		return graph_format(width, AltosConvert.imperial_units);  	} -	public String show(int width, double v, boolean imperial_units) { -		return String.format(show_format(width, imperial_units), value(v, imperial_units)); +	/* Parsing functions. */ +	public double parse_locale(String s, boolean imperial_units) throws ParseException { +		double v = AltosParse.parse_double_locale(s); +		return inverse(v, imperial_units);  	} -	public String show(int width, double v) { -		return show(width, v, AltosConvert.imperial_units); +	public double parse_net(String s, boolean imperial_units) throws ParseException { +		double v = AltosParse.parse_double_net(s); +		return inverse(v, imperial_units);  	} -	public String say(double v, boolean imperial_units) { -		return String.format(say_format(imperial_units), value(v, imperial_units)); +	public double parse_locale(String s) throws ParseException { +		return parse_locale(s, AltosConvert.imperial_units);  	} -	public String say(double v) { -		return say(v, AltosConvert.imperial_units); +	public double parse_net(String s) throws ParseException { +		return parse_net(s, AltosConvert.imperial_units);  	} -	public String say_units(double v, boolean imperial_units) { -		return String.format(say_units_format(imperial_units), value(v, imperial_units)); -	} +	public AltosUnits() { +		range_metric = new AltosUnitsRange[1]; -	public String say_units(double v) { -		return say_units(v, AltosConvert.imperial_units); +		range_metric[0] = new AltosUnitsRange(this, false) { +				double value(double v) { +					return units.value(v, false); +				} + +				int show_fraction(int width) { +					return units.show_fraction(width, false); +				} + +				int say_fraction() { +					return units.say_fraction(false); +				} +			}; + +		range_imperial = new AltosUnitsRange[1]; + +		range_imperial[0] = new AltosUnitsRange(this, true) { +				double value(double v) { +					return units.value(v, true); +				} + +				int show_fraction(int width) { +					return units.show_fraction(width, true); +				} + +				int say_fraction() { +					return units.say_fraction(true); +				} +			};  	}  } diff --git a/altoslib/AltosUnitsListener.java b/altoslib/AltosUnitsListener.java index bb8451b7..89dbdf77 100644 --- a/altoslib/AltosUnitsListener.java +++ b/altoslib/AltosUnitsListener.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public interface AltosUnitsListener {  	public void units_changed(boolean imperial_units); diff --git a/altoslib/AltosUnitsRange.java b/altoslib/AltosUnitsRange.java new file mode 100644 index 00000000..f376a463 --- /dev/null +++ b/altoslib/AltosUnitsRange.java @@ -0,0 +1,46 @@ +/* + * Copyright © 2016 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 org.altusmetrum.altoslib_11; + +import java.text.*; + +public abstract class AltosUnitsRange { + +	AltosUnits	units; + +	double		lower_limit; +	String		show_units; +	String		say_units; + +	abstract double	value(double v); +	abstract int show_fraction(int width); +	abstract int say_fraction(); + +	AltosUnitsRange(AltosUnits units, boolean imperial_units) { +		this.units = units; +		this.show_units = units.show_units(imperial_units); +		this.say_units = units.say_units(imperial_units); +	} + +	AltosUnitsRange(double lower_limit, String show_units, String say_units) { +		this.units = null; +		this.lower_limit = lower_limit; +		this.show_units = show_units; +		this.say_units = say_units; +	} +} diff --git a/altoslib/AltosUnknownProduct.java b/altoslib/AltosUnknownProduct.java index ff536f57..fe16f441 100644 --- a/altoslib/AltosUnknownProduct.java +++ b/altoslib/AltosUnknownProduct.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosUnknownProduct extends Exception {  	public String product; diff --git a/altoslib/AltosVersion.java.in b/altoslib/AltosVersion.java.in index 9ac94dcd..12fecaa0 100644 --- a/altoslib/AltosVersion.java.in +++ b/altoslib/AltosVersion.java.in @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosVersion {  	public final static String version = "@VERSION@"; diff --git a/altoslib/AltosVoltage.java b/altoslib/AltosVoltage.java index 1738dd86..5c9cea28 100644 --- a/altoslib/AltosVoltage.java +++ b/altoslib/AltosVoltage.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public class AltosVoltage extends AltosUnits { diff --git a/altoslib/AltosWriter.java b/altoslib/AltosWriter.java index 02b5d669..a3a394d3 100644 --- a/altoslib/AltosWriter.java +++ b/altoslib/AltosWriter.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  public interface AltosWriter { diff --git a/altoslib/Makefile.am b/altoslib/Makefile.am index dc9da8fd..2a9eb9c9 100644 --- a/altoslib/Makefile.am +++ b/altoslib/Makefile.am @@ -64,6 +64,7 @@ altoslib_JAVA = \  	AltosIdleFetch.java \  	AltosIdleMonitor.java \  	AltosIdleMonitorListener.java \ +	AltosIdleReader.java \  	AltosIgnite.java \  	AltosIMU.java \  	AltosKML.java \ @@ -118,6 +119,7 @@ altoslib_JAVA = \  	AltosIMU.java \  	AltosMag.java \  	AltosUnits.java \ +	AltosUnitsRange.java \  	AltosDistance.java \  	AltosHeight.java \  	AltosSpeed.java \ @@ -159,6 +161,7 @@ altoslib_JAVA = \  	AltosMapLoaderListener.java \  	AltosMapLoader.java \  	AltosMapTypeListener.java \ +	AltosJson.java \  	AltosVersion.java  JAR=altoslib_$(ALTOSLIB_VERSION).jar diff --git a/altosui/Altos.java b/altosui/Altos.java index 81bc8c28..1c8bfdb7 100644 --- a/altosui/Altos.java +++ b/altosui/Altos.java @@ -20,8 +20,8 @@ package altosui;  import java.awt.*;  import libaltosJNI.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class Altos extends AltosUILib { diff --git a/altosui/AltosAscent.java b/altosui/AltosAscent.java index 85260a70..99f7e5ad 100644 --- a/altosui/AltosAscent.java +++ b/altosui/AltosAscent.java @@ -21,8 +21,8 @@ import java.util.*;  import java.awt.*;  import java.awt.event.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosAscent extends AltosUIFlightTab {  	JLabel	cur, max; diff --git a/altosui/AltosCompanionInfo.java b/altosui/AltosCompanionInfo.java index 251982ad..8bf25715 100644 --- a/altosui/AltosCompanionInfo.java +++ b/altosui/AltosCompanionInfo.java @@ -19,8 +19,8 @@ package altosui;  import java.awt.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosCompanionInfo extends JTable implements AltosFlightDisplay {  	private AltosFlightInfoTableModel model; diff --git a/altosui/AltosConfig.java b/altosui/AltosConfig.java index e47b0e22..63f50206 100644 --- a/altosui/AltosConfig.java +++ b/altosui/AltosConfig.java @@ -22,8 +22,8 @@ import javax.swing.*;  import java.io.*;  import java.util.concurrent.*;  import java.text.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosConfig implements ActionListener { diff --git a/altosui/AltosConfigPyroUI.java b/altosui/AltosConfigPyroUI.java index e0915a17..4bfdb663 100644 --- a/altosui/AltosConfigPyroUI.java +++ b/altosui/AltosConfigPyroUI.java @@ -22,8 +22,8 @@ import java.awt.*;  import java.awt.event.*;  import javax.swing.*;  import javax.swing.event.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosConfigPyroUI  	extends AltosUIDialog @@ -105,7 +105,7 @@ public class AltosConfigPyroUI  				double 	unit_value = new_value;  				AltosUnits units = AltosPyro.pyro_to_units(flag);  				if (units != null) -					unit_value = units.value(new_value); +					unit_value = units.parse_value(new_value);  				String	format;  				if (scale >= 100)  					format = "%6.2f"; diff --git a/altosui/AltosConfigTD.java b/altosui/AltosConfigTD.java index eedc18c5..61727498 100644 --- a/altosui/AltosConfigTD.java +++ b/altosui/AltosConfigTD.java @@ -21,8 +21,8 @@ import java.awt.event.*;  import javax.swing.*;  import java.io.*;  import java.util.concurrent.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosConfigTD implements ActionListener { diff --git a/altosui/AltosConfigTDUI.java b/altosui/AltosConfigTDUI.java index 9a76fbe2..1c0e0fef 100644 --- a/altosui/AltosConfigTDUI.java +++ b/altosui/AltosConfigTDUI.java @@ -21,8 +21,8 @@ import java.awt.*;  import java.awt.event.*;  import javax.swing.*;  import javax.swing.event.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosConfigTDUI  	extends AltosUIDialog diff --git a/altosui/AltosConfigUI.java b/altosui/AltosConfigUI.java index 24167df3..cb7af829 100644 --- a/altosui/AltosConfigUI.java +++ b/altosui/AltosConfigUI.java @@ -22,8 +22,8 @@ import java.awt.event.*;  import javax.swing.*;  import javax.swing.event.*;  import java.text.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosConfigUI  	extends AltosUIDialog @@ -976,7 +976,7 @@ public class AltosConfigUI  	}  	String get_main_deploy_label() { -		return String.format("Main Deploy Altitude(%s):", AltosConvert.height.show_units()); +		return String.format("Main Deploy Altitude(%s):", AltosConvert.height.parse_units());  	}  	String[] main_deploy_values() { @@ -1243,7 +1243,7 @@ public class AltosConfigUI  	}  	String get_tracker_motion_label() { -		return String.format("Logging Trigger Motion (%s):", AltosConvert.height.show_units()); +		return String.format("Logging Trigger Motion (%s):", AltosConvert.height.parse_units());  	}  	void set_tracker_tool_tip() { diff --git a/altosui/AltosConfigureUI.java b/altosui/AltosConfigureUI.java index 52c50352..b4f423d9 100644 --- a/altosui/AltosConfigureUI.java +++ b/altosui/AltosConfigureUI.java @@ -22,7 +22,7 @@ import java.awt.event.*;  import java.beans.*;  import javax.swing.*;  import javax.swing.event.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosConfigureUI  	extends AltosUIConfigure diff --git a/altosui/AltosDescent.java b/altosui/AltosDescent.java index eeaed19e..44bcecee 100644 --- a/altosui/AltosDescent.java +++ b/altosui/AltosDescent.java @@ -21,8 +21,8 @@ import java.util.*;  import java.awt.*;  import java.awt.event.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosDescent extends AltosUIFlightTab { diff --git a/altosui/AltosFlightStatus.java b/altosui/AltosFlightStatus.java index 4229e4fc..82c63396 100644 --- a/altosui/AltosFlightStatus.java +++ b/altosui/AltosFlightStatus.java @@ -19,8 +19,8 @@ package altosui;  import java.awt.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosFlightStatus extends JComponent implements AltosFlightDisplay {  	GridBagLayout	layout; diff --git a/altosui/AltosFlightStatusTableModel.java b/altosui/AltosFlightStatusTableModel.java index 7bf2bb78..dc5b96a9 100644 --- a/altosui/AltosFlightStatusTableModel.java +++ b/altosui/AltosFlightStatusTableModel.java @@ -27,7 +27,7 @@ import java.util.*;  import java.text.*;  import java.util.prefs.*;  import java.util.concurrent.LinkedBlockingQueue; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosFlightStatusTableModel extends AbstractTableModel {  	private String[] columnNames = { diff --git a/altosui/AltosFlightStatusUpdate.java b/altosui/AltosFlightStatusUpdate.java index d39366da..88d6f0ff 100644 --- a/altosui/AltosFlightStatusUpdate.java +++ b/altosui/AltosFlightStatusUpdate.java @@ -18,7 +18,7 @@  package altosui;  import java.awt.event.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosFlightStatusUpdate implements ActionListener { diff --git a/altosui/AltosFlightUI.java b/altosui/AltosFlightUI.java index a1526cb5..63f8c670 100644 --- a/altosui/AltosFlightUI.java +++ b/altosui/AltosFlightUI.java @@ -22,8 +22,8 @@ import java.awt.event.*;  import javax.swing.*;  import java.util.*;  import java.util.concurrent.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay {  	AltosVoice		voice; @@ -40,7 +40,7 @@ public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay {  	AltosDescent	descent;  	AltosLanded	landed;  	AltosCompanionInfo	companion; -	AltosUIMapNew      sitemap; +	AltosUIMap      sitemap;  	boolean		has_map;  	boolean		has_companion;  	boolean		has_state; @@ -289,7 +289,7 @@ public class AltosFlightUI extends AltosUIFrame implements AltosFlightDisplay {  		has_companion = false;  		has_state = false; -		sitemap = new AltosUIMapNew(); +		sitemap = new AltosUIMap();  		displays.add(sitemap);  		has_map = false; diff --git a/altosui/AltosGraphUI.java b/altosui/AltosGraphUI.java index 34d56b24..4f394d73 100644 --- a/altosui/AltosGraphUI.java +++ b/altosui/AltosGraphUI.java @@ -23,8 +23,8 @@ import java.util.ArrayList;  import java.awt.*;  import java.awt.event.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  import org.jfree.chart.ChartPanel;  import org.jfree.chart.JFreeChart; @@ -35,7 +35,7 @@ public class AltosGraphUI extends AltosUIFrame implements AltosFontListener, Alt  	JTabbedPane		pane;  	AltosGraph		graph;  	AltosUIEnable		enable; -	AltosUIMapNew		map; +	AltosUIMap		map;  	AltosState		state;  	AltosGraphDataSet	graphDataSet;  	AltosFlightStats	stats; @@ -47,7 +47,7 @@ public class AltosGraphUI extends AltosUIFrame implements AltosFontListener, Alt  		for (AltosState state : states) {  			if (state.gps != null && state.gps.locked && state.gps.nsat >= 4) {  				if (map == null) -					map = new AltosUIMapNew(); +					map = new AltosUIMap();  				map.show(state, null);  				has_gps = true;  			} @@ -100,8 +100,6 @@ public class AltosGraphUI extends AltosUIFrame implements AltosFontListener, Alt  		addWindowListener(new WindowAdapter() {  				@Override  				public void windowClosing(WindowEvent e) { -					setVisible(false); -					dispose();  					AltosUIPreferences.unregister_font_listener(AltosGraphUI.this);  					AltosPreferences.unregister_units_listener(AltosGraphUI.this);  				} diff --git a/altosui/AltosIdleMonitorUI.java b/altosui/AltosIdleMonitorUI.java index d789de77..1a992946 100644 --- a/altosui/AltosIdleMonitorUI.java +++ b/altosui/AltosIdleMonitorUI.java @@ -24,8 +24,8 @@ import javax.swing.event.*;  import java.io.*;  import java.util.concurrent.*;  import java.util.Arrays; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDisplay, AltosIdleMonitorListener, DocumentListener {  	AltosDevice		device; @@ -35,7 +35,7 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl  	AltosFlightStatus	flightStatus;  	AltosIgnitor		ignitor;  	AltosIdleMonitor	thread; -	AltosUIMapNew      	sitemap; +	AltosUIMap      	sitemap;  	int			serial;  	boolean			remote;  	boolean			has_ignitor; @@ -275,7 +275,7 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl  		ignitor = new AltosIgnitor(); -		sitemap = new AltosUIMapNew(); +		sitemap = new AltosUIMap();  		/* Make the tabbed pane use the rest of the window space */  		bag.add(pane, constraints(0, 4, GridBagConstraints.BOTH)); diff --git a/altosui/AltosIgniteUI.java b/altosui/AltosIgniteUI.java index eca2a668..84dc54db 100644 --- a/altosui/AltosIgniteUI.java +++ b/altosui/AltosIgniteUI.java @@ -24,8 +24,8 @@ import java.io.*;  import java.text.*;  import java.util.*;  import java.util.concurrent.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosIgniteUI  	extends AltosUIDialog diff --git a/altosui/AltosIgnitor.java b/altosui/AltosIgnitor.java index 903da5a9..13d99124 100644 --- a/altosui/AltosIgnitor.java +++ b/altosui/AltosIgnitor.java @@ -20,8 +20,8 @@ package altosui;  import java.awt.*;  import java.awt.event.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosIgnitor extends AltosUIFlightTab { diff --git a/altosui/AltosLanded.java b/altosui/AltosLanded.java index b704651d..77c504b8 100644 --- a/altosui/AltosLanded.java +++ b/altosui/AltosLanded.java @@ -21,8 +21,8 @@ import java.awt.*;  import java.awt.event.*;  import javax.swing.*;  import java.io.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosLanded extends AltosUIFlightTab implements ActionListener { diff --git a/altosui/AltosLaunch.java b/altosui/AltosLaunch.java index 503b0621..fb2cd883 100644 --- a/altosui/AltosLaunch.java +++ b/altosui/AltosLaunch.java @@ -20,7 +20,7 @@ package altosui;  import java.io.*;  import java.util.concurrent.*;  import java.awt.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosLaunch {  	AltosDevice	device; @@ -91,7 +91,7 @@ public class AltosLaunch {  				throw new TimeoutException();  			if (get_string(line, "Rssi: ", status_name)) {  				try { -					rssi = Altos.fromdec(status_name.get()); +					rssi = (int) Altos.fromdec(status_name.get());  				} catch (NumberFormatException ne) {  				}  				break; @@ -194,4 +194,4 @@ public class AltosLaunch {  		device = in_device;  		serial = new AltosSerial(device);  	} -}
\ No newline at end of file +} diff --git a/altosui/AltosLaunchUI.java b/altosui/AltosLaunchUI.java index 127a33a3..22608c1b 100644 --- a/altosui/AltosLaunchUI.java +++ b/altosui/AltosLaunchUI.java @@ -23,7 +23,7 @@ import javax.swing.*;  import java.io.*;  import java.text.*;  import java.util.concurrent.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altosuilib_11.*;  class FireButton extends JButton {  	protected void processMouseEvent(MouseEvent e) { diff --git a/altosui/AltosPad.java b/altosui/AltosPad.java index 4f55636d..b6f1f3c9 100644 --- a/altosui/AltosPad.java +++ b/altosui/AltosPad.java @@ -18,8 +18,8 @@  package altosui;  import java.util.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosPad extends AltosUIFlightTab { @@ -101,7 +101,11 @@ public class AltosPad extends AltosUIFlightTab {  	class ReceiverBattery extends AltosUIVoltageIndicator { -		public double voltage(AltosState state) { return AltosLib.MISSING; } +		double	last_voltage = AltosLib.MISSING; + +		public double voltage(AltosState state) { +			return last_voltage; +		}  		public double good() { return AltosLib.ao_battery_good; } @@ -111,8 +115,10 @@ public class AltosPad extends AltosUIFlightTab {  		public double value(AltosState state, AltosListenerState listener_state, int i) {  			if (listener_state == null) -				return AltosLib.MISSING; -			return listener_state.battery; +				last_voltage = AltosLib.MISSING; +			else +				last_voltage = listener_state.battery; +			return last_voltage;  		}  		public ReceiverBattery (AltosUIFlightTab container, int y) { @@ -205,40 +211,26 @@ public class AltosPad extends AltosUIFlightTab {  		}  	} -	class PadAlt extends AltosUIIndicator { +	class PadAlt extends AltosUIUnitsIndicator { -		double	last_alt = AltosLib.MISSING - 1; +		public double value(AltosState state, int i) { +			if (report_pad(state)) +				return state.pad_alt; +			else +				return state.gps.alt; +		}  		public void show (AltosState state, AltosListenerState listener_state) { -			double alt = AltosLib.MISSING; -			String label = null; +			String label = "Altitude"; -			if (state != null) { -				if (report_pad(state)) { -					alt = state.pad_alt; -					label = "Pad Altitude"; -				} else { -					alt = state.gps.alt; -					label = "Altitude"; -				} -			} -			if (alt != last_alt) { -				if (alt != AltosLib.MISSING) { -					show(AltosConvert.height.show(5, alt)); -					set_label(label); -				} else -					hide(); -				last_alt = alt; -			} -		} - -		public void reset() { -			super.reset(); -			last_alt =  AltosLib.MISSING - 1; +			if (state != null && report_pad(state)) +				label = "Pad Altitude"; +			set_label(label); +			super.show(state, listener_state);  		}  		public PadAlt (AltosUIFlightTab container, int y) { -			super (container, y, "Pad Altitude", 1, false, 2); +			super (container, y, AltosConvert.height, "Pad Altitude", 1, false, 2);  		}  	}  	public String getName() { return "Pad"; } diff --git a/altosui/AltosUI.java b/altosui/AltosUI.java index 4a390ee6..fa259906 100644 --- a/altosui/AltosUI.java +++ b/altosui/AltosUI.java @@ -22,8 +22,8 @@ import java.awt.event.*;  import javax.swing.*;  import java.io.*;  import java.util.concurrent.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class AltosUI extends AltosUIFrame {  	public AltosVoice voice = new AltosVoice(); @@ -295,7 +295,7 @@ public class AltosUI extends AltosUIFrame {  	}  	void LoadMaps() { -		new AltosUIMapPreloadNew(AltosUI.this); +		new AltosUIMapPreload(AltosUI.this);  	}  	void LaunchController() { @@ -492,39 +492,47 @@ public class AltosUI extends AltosUIFrame {  		if (states == null)  			return false;  		try { +			System.out.printf("%s:\n", file.toString());  			AltosFlightStats stats = new AltosFlightStats(states); -			if (stats.serial > 0) +			if (stats.serial != AltosLib.MISSING)  				System.out.printf("Serial:       %5d\n", stats.serial); -			if (stats.flight > 0) +			if (stats.flight != AltosLib.MISSING)  				System.out.printf("Flight:       %5d\n", stats.flight); -			if (stats.year > 0) +			if (stats.year != AltosLib.MISSING)  				System.out.printf("Date:    %04d-%02d-%02d\n",  						  stats.year, stats.month, stats.day); -			if (stats.hour > 0) +			if (stats.hour != AltosLib.MISSING)  				System.out.printf("Time:      %02d:%02d:%02d UTC\n",  						  stats.hour, stats.minute, stats.second); -			System.out.printf("Max height:  %6.0f m    %6.0f ft\n", -					  stats.max_height, -					  AltosConvert.meters_to_feet(stats.max_height)); -			System.out.printf("Max speed:   %6.0f m/s  %6.0f ft/s  %6.4f Mach\n", -					  stats.max_speed, -					  AltosConvert.meters_to_feet(stats.max_speed), -					  AltosConvert.meters_to_mach(stats.max_speed)); +			if (stats.max_height != AltosLib.MISSING) +				System.out.printf("Max height:  %6.0f m    %6.0f ft\n", +						  stats.max_height, +						  AltosConvert.meters_to_feet(stats.max_height)); +			if (stats.max_speed != AltosLib.MISSING) +				System.out.printf("Max speed:   %6.0f m/s  %6.0f ft/s  %6.4f Mach\n", +						  stats.max_speed, +						  AltosConvert.meters_to_feet(stats.max_speed), +						  AltosConvert.meters_to_mach(stats.max_speed));  			if (stats.max_acceleration != AltosLib.MISSING) {  				System.out.printf("Max accel:   %6.0f m/s² %6.0f ft/s² %6.2f g\n",  						  stats.max_acceleration,  						  AltosConvert.meters_to_feet(stats.max_acceleration),  						  AltosConvert.meters_to_g(stats.max_acceleration));  			} -			System.out.printf("Drogue rate: %6.0f m/s  %6.0f ft/s\n", -					  stats.state_speed[Altos.ao_flight_drogue], -					  AltosConvert.meters_to_feet(stats.state_speed[Altos.ao_flight_drogue])); -			System.out.printf("Main rate:   %6.0f m/s  %6.0f ft/s\n", -					  stats.state_speed[Altos.ao_flight_main], -					  AltosConvert.meters_to_feet(stats.state_speed[Altos.ao_flight_main])); -			System.out.printf("Flight time: %6.0f s\n", -					  stats.state_end[Altos.ao_flight_main] - -					  stats.state_start[Altos.ao_flight_boost]); +			if (stats.state_speed[Altos.ao_flight_drogue] != AltosLib.MISSING) +				System.out.printf("Drogue rate: %6.0f m/s  %6.0f ft/s\n", +						  stats.state_speed[Altos.ao_flight_drogue], +						  AltosConvert.meters_to_feet(stats.state_speed[Altos.ao_flight_drogue])); +			if (stats.state_speed[Altos.ao_flight_main] != AltosLib.MISSING) +				System.out.printf("Main rate:   %6.0f m/s  %6.0f ft/s\n", +						  stats.state_speed[Altos.ao_flight_main], +						  AltosConvert.meters_to_feet(stats.state_speed[Altos.ao_flight_main])); +			if (stats.state_end[Altos.ao_flight_main] != AltosLib.MISSING && +			    stats.state_start[Altos.ao_flight_boost] != AltosLib.MISSING) +				System.out.printf("Flight time: %6.0f s\n", +						  stats.state_end[Altos.ao_flight_main] - +						  stats.state_start[Altos.ao_flight_boost]); +			System.out.printf("\n");  			return true;  		} catch (InterruptedException ie) {  		} catch (IOException ie) { @@ -536,7 +544,6 @@ public class AltosUI extends AltosUIFrame {  		try {  			AltosStateIterable eef = record_iterable(file); -			System.out.printf ("process cat\n");  			for (AltosState state : eef) {  				System.out.printf ("tick %d state %d height %g\n",  						   state.tick, state.state(), state.height()); @@ -605,15 +612,13 @@ public class AltosUI extends AltosUIFrame {  					File file = new File(args[i]);  					switch (process) {  					case process_none: -					case process_graph:  						if (altosui == null)  							altosui = new AltosUI(); +					case process_graph:  						if (!process_graph(file))  							++errors;  						break;  					case process_replay: -						if (altosui == null) -							altosui = new AltosUI();  						if (!process_replay(file))  							++errors;  						break; diff --git a/altosui/Makefile.am b/altosui/Makefile.am index dce8420e..cfe3bb5b 100644 --- a/altosui/Makefile.am +++ b/altosui/Makefile.am @@ -56,11 +56,17 @@ ALTOSLIB_CLASS=\  ALTOSUILIB_CLASS=\  	altosuilib_$(ALTOSUILIB_VERSION).jar +if MULTI_ARCH +LIBALTOS_LINUX=libaltos32.so libaltos64.so +else +LIBALTOS_LINUX=libaltos.so +endif +  LIBALTOS= \ -	libaltos32.so \ -	libaltos64.so \ +	$(LIBALTOS_LINUX) \  	libaltos.dylib \ -	altos.dll +	altos.dll \ +	altos64.dll  desktopdir = $(datadir)/applications  desktop_file = altusmetrum-altosui.desktop @@ -126,10 +132,12 @@ FIRMWARE_TELEMINI_1_0=$(top_srcdir)/src/telemini-v1.0/telemini-v1.0-$(VERSION).i  FIRMWARE_TELEMINI=$(FIRMWARE_TELEMINI_1_0)  FIRMWARE_TBT_1_0=$(top_srcdir)/src/telebt-v1.0/telebt-v1.0-$(VERSION).ihx -FIRMWARE_TBT=$(FIRMWARE_TBT_1_0) +FIRMWARE_TBT_3_0=$(top_srcdir)/src/telebt-v3.0/telebt-v3.0-$(VERSION).ihx +FIRMWARE_TBT=$(FIRMWARE_TBT_1_0) $(FIRMWARE_TBT_3_0)  FIRMWARE_TMEGA_1_0=$(top_srcdir)/src/telemega-v1.0/telemega-v1.0-$(VERSION).ihx -FIRMWARE_TMEGA=$(FIRMWARE_TMEGA_1_0) +FIRMWARE_TMEGA_2_0=$(top_srcdir)/src/telemega-v2.0/telemega-v2.0-$(VERSION).ihx +FIRMWARE_TMEGA=$(FIRMWARE_TMEGA_1_0) $(FIRMWARE_TMEGA_2_0)  FIRMWARE_EMINI_1_0=$(top_srcdir)/src/easymini-v1.0/easymini-v1.0-$(VERSION).ihx  FIRMWARE_EMINI=$(FIRMWARE_EMINI_1_0) @@ -161,7 +169,7 @@ WINDOWS_DIST=Altos-Windows-$(VERSION_DASH).exe  FAT_FILES=$(FATJAR) $(ALTOSLIB_CLASS) $(ALTOSUILIB_CLASS) $(FREETTS_CLASS) $(JFREECHART_CLASS) $(JCOMMON_CLASS) -LINUX_LIBS=libaltos32.so libaltos64.so +LINUX_LIBS=$(LIBALTOS_LINUX)  LINUX_FILES=$(FAT_FILES) $(LINUX_LIBS) $(FIRMWARE) $(DOC) $(desktop_file).in $(LINUX_ICONS) $(LINUX_MIMETYPE)  LINUX_EXTRA=altosui-fat @@ -176,7 +184,8 @@ all-local: classes/altosui $(JAR) altosui altosui-test altosui-jdb  clean-local:  	-rm -rf classes $(JAR) $(FATJAR) \ -		$(LINUX_DIST) $(LINUX_SH) $(MACOSX_DIST) windows $(WINDOWS_DIST) $(ALTOSLIB_CLASS) $(ALTOSUILIB_CLASS) $(FREETTS_CLASS) \ +		Altos-Linux-*.tar.bz2 Altos-Linux-*.sh Altos-Mac-*.dmg Altos-Windows-*.exe \ +		windows altoslib_*.jar altosuilib_*.jar $(FREETTS_CLASS) \  		$(JFREECHART_CLASS) $(JCOMMON_CLASS) $(LIBALTOS) Manifest.txt Manifest-fat.txt altos-windows.log altos-windows.nsi \  		altosui altosui-test altosui-jdb macosx linux *.desktop @@ -267,6 +276,10 @@ altosui-jdb: Makefile  	echo 'exec jdb -classpath "classes:./*:../libaltos:$(FREETTS)/freetts.jar:$(JCOMMON)/jcommon.jar:$(JFREECHART)/jfreechart.jar" -Djava.library.path="../libaltos/.libs" altosui/AltosUI "$$@"' >> $@  	chmod +x $@ +libaltos.so: build-libaltos +	-rm -f "$@" +	$(LN_S) ../libaltos/.libs/"$@" . +  libaltos32.so: build-libaltos  	-rm -f "$@"  	$(LN_S) ../libaltos/.libs/"$@" . @@ -291,6 +304,8 @@ altos64.dll: ../libaltos/altos64.dll  ../libaltos/.libs/libaltos32.so: build-libaltos +../libaltos/.libs/libaltos.so: build-libaltos +  ../libaltos/altos.dll: build-altos-dll  ../libaltos/altos64.dll: build-altos64-dll diff --git a/altosuilib/AltosBTDevice.java b/altosuilib/AltosBTDevice.java index 8c2e0d75..df00bcee 100644 --- a/altosuilib/AltosBTDevice.java +++ b/altosuilib/AltosBTDevice.java @@ -15,10 +15,10 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import libaltosJNI.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosBTDevice extends altos_bt_device implements AltosDevice { diff --git a/altosuilib/AltosBTDeviceIterator.java b/altosuilib/AltosBTDeviceIterator.java index ea29b055..75ca18ed 100644 --- a/altosuilib/AltosBTDeviceIterator.java +++ b/altosuilib/AltosBTDeviceIterator.java @@ -15,11 +15,11 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.util.*;  import libaltosJNI.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosBTDeviceIterator implements Iterator<AltosBTDevice> {  	AltosBTDevice	current; diff --git a/altosuilib/AltosBTKnown.java b/altosuilib/AltosBTKnown.java index 8ae11f67..11b0d48d 100644 --- a/altosuilib/AltosBTKnown.java +++ b/altosuilib/AltosBTKnown.java @@ -15,10 +15,10 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.util.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosBTKnown implements Iterable<AltosBTDevice> {  	LinkedList<AltosBTDevice>	devices = new LinkedList<AltosBTDevice>(); diff --git a/altosuilib/AltosBTManage.java b/altosuilib/AltosBTManage.java index e6a1ef64..bdb35d49 100644 --- a/altosuilib/AltosBTManage.java +++ b/altosuilib/AltosBTManage.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import java.awt.event.*; @@ -23,7 +23,7 @@ import javax.swing.*;  import javax.swing.plaf.basic.*;  import java.util.*;  import java.util.concurrent.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosBTManage extends AltosUIDialog implements ActionListener, Iterable<AltosBTDevice> {  	LinkedBlockingQueue<AltosBTDevice> found_devices; diff --git a/altosuilib/AltosCSVUI.java b/altosuilib/AltosCSVUI.java index 3846d3fd..9d67ce8d 100644 --- a/altosuilib/AltosCSVUI.java +++ b/altosuilib/AltosCSVUI.java @@ -15,13 +15,13 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import java.awt.event.*;  import javax.swing.*;  import java.io.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosCSVUI  	extends AltosUIDialog diff --git a/altosuilib/AltosConfigFreqUI.java b/altosuilib/AltosConfigFreqUI.java index 5a689a39..b8477ecd 100644 --- a/altosuilib/AltosConfigFreqUI.java +++ b/altosuilib/AltosConfigFreqUI.java @@ -15,14 +15,14 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import java.text.*;  import java.awt.event.*;  import javax.swing.*;  import java.util.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  class AltosEditFreqUI extends AltosUIDialog implements ActionListener {  	Frame		frame; diff --git a/altosuilib/AltosDataChooser.java b/altosuilib/AltosDataChooser.java index 3dfadfe1..f1a5610e 100644 --- a/altosuilib/AltosDataChooser.java +++ b/altosuilib/AltosDataChooser.java @@ -15,12 +15,12 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import javax.swing.*;  import javax.swing.filechooser.FileNameExtensionFilter;  import java.io.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosDataChooser extends JFileChooser {  	JFrame	frame; diff --git a/altosuilib/AltosDevice.java b/altosuilib/AltosDevice.java index dbaf2e36..f51c76c2 100644 --- a/altosuilib/AltosDevice.java +++ b/altosuilib/AltosDevice.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import libaltosJNI.*; diff --git a/altosuilib/AltosDeviceDialog.java b/altosuilib/AltosDeviceDialog.java index 21a8a23f..0cd658c0 100644 --- a/altosuilib/AltosDeviceDialog.java +++ b/altosuilib/AltosDeviceDialog.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import javax.swing.*;  import java.awt.*; diff --git a/altosuilib/AltosDeviceUIDialog.java b/altosuilib/AltosDeviceUIDialog.java index 75c3e691..7d1e3618 100644 --- a/altosuilib/AltosDeviceUIDialog.java +++ b/altosuilib/AltosDeviceUIDialog.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import javax.swing.*;  import java.awt.*; diff --git a/altosuilib/AltosDisplayThread.java b/altosuilib/AltosDisplayThread.java index 968a0b75..ba48ab82 100644 --- a/altosuilib/AltosDisplayThread.java +++ b/altosuilib/AltosDisplayThread.java @@ -15,13 +15,13 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import javax.swing.*;  import java.io.*;  import java.text.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosDisplayThread extends Thread { diff --git a/altosuilib/AltosEepromDelete.java b/altosuilib/AltosEepromDelete.java index 442cee88..026b5da4 100644 --- a/altosuilib/AltosEepromDelete.java +++ b/altosuilib/AltosEepromDelete.java @@ -15,13 +15,13 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.event.*;  import javax.swing.*;  import java.io.*;  import java.util.concurrent.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosEepromDelete implements Runnable {  	AltosEepromList		flights; diff --git a/altosuilib/AltosEepromManage.java b/altosuilib/AltosEepromManage.java index 5f83e6f4..a4b62ff0 100644 --- a/altosuilib/AltosEepromManage.java +++ b/altosuilib/AltosEepromManage.java @@ -15,13 +15,13 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.event.*;  import javax.swing.*;  import java.io.*;  import java.util.concurrent.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosEepromManage implements ActionListener { diff --git a/altosuilib/AltosEepromMonitor.java b/altosuilib/AltosEepromMonitor.java index 508e3e3f..7fe5be18 100644 --- a/altosuilib/AltosEepromMonitor.java +++ b/altosuilib/AltosEepromMonitor.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import java.awt.event.*; diff --git a/altosuilib/AltosEepromMonitorUI.java b/altosuilib/AltosEepromMonitorUI.java index 905780a5..9492bc31 100644 --- a/altosuilib/AltosEepromMonitorUI.java +++ b/altosuilib/AltosEepromMonitorUI.java @@ -15,12 +15,12 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import java.awt.event.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosEepromMonitorUI extends AltosUIDialog implements AltosEepromMonitor {  	JFrame		owner; diff --git a/altosuilib/AltosEepromSelect.java b/altosuilib/AltosEepromSelect.java index 67bff710..28b3982b 100644 --- a/altosuilib/AltosEepromSelect.java +++ b/altosuilib/AltosEepromSelect.java @@ -15,13 +15,13 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import javax.swing.*;  import javax.swing.border.*;  import java.awt.*;  import java.awt.event.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  class AltosEepromItem implements ActionListener {  	AltosEepromLog	log; diff --git a/altosuilib/AltosFlashUI.java b/altosuilib/AltosFlashUI.java index 07f04c3e..6574bd99 100644 --- a/altosuilib/AltosFlashUI.java +++ b/altosuilib/AltosFlashUI.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import java.awt.event.*; @@ -23,7 +23,7 @@ import javax.swing.*;  import javax.swing.filechooser.FileNameExtensionFilter;  import java.io.*;  import java.util.concurrent.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosFlashUI  	extends AltosUIDialog diff --git a/altosuilib/AltosFlightInfoTableModel.java b/altosuilib/AltosFlightInfoTableModel.java index 9a430743..ca3728a5 100644 --- a/altosuilib/AltosFlightInfoTableModel.java +++ b/altosuilib/AltosFlightInfoTableModel.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import javax.swing.table.*; diff --git a/altosuilib/AltosFlightStatsTable.java b/altosuilib/AltosFlightStatsTable.java index 6171f61a..c0f1ecb6 100644 --- a/altosuilib/AltosFlightStatsTable.java +++ b/altosuilib/AltosFlightStatsTable.java @@ -15,12 +15,12 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import javax.swing.*;  import java.util.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosFlightStatsTable extends JComponent implements AltosFontListener {  	GridBagLayout	layout; diff --git a/altosuilib/AltosGraph.java b/altosuilib/AltosGraph.java index a4334cc6..ad843f7f 100644 --- a/altosuilib/AltosGraph.java +++ b/altosuilib/AltosGraph.java @@ -15,14 +15,14 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.io.*;  import java.util.ArrayList;  import java.awt.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import org.jfree.ui.*;  import org.jfree.chart.*; diff --git a/altosuilib/AltosGraphDataPoint.java b/altosuilib/AltosGraphDataPoint.java index e4a065c6..fcb88388 100644 --- a/altosuilib/AltosGraphDataPoint.java +++ b/altosuilib/AltosGraphDataPoint.java @@ -15,9 +15,9 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosGraphDataPoint implements AltosUIDataPoint { diff --git a/altosuilib/AltosGraphDataSet.java b/altosuilib/AltosGraphDataSet.java index 673d1de9..3e3bf479 100644 --- a/altosuilib/AltosGraphDataSet.java +++ b/altosuilib/AltosGraphDataSet.java @@ -15,12 +15,12 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.lang.*;  import java.io.*;  import java.util.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  class AltosGraphIterator implements Iterator<AltosUIDataPoint> {  	AltosGraphDataSet	dataSet; diff --git a/altosuilib/AltosInfoTable.java b/altosuilib/AltosInfoTable.java index 3833b37a..3509f65d 100644 --- a/altosuilib/AltosInfoTable.java +++ b/altosuilib/AltosInfoTable.java @@ -15,13 +15,13 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import java.awt.event.*;  import javax.swing.*;  import javax.swing.table.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosInfoTable extends JTable implements AltosFlightDisplay, HierarchyListener {  	private AltosFlightInfoTableModel model; diff --git a/altosuilib/AltosLed.java b/altosuilib/AltosLed.java index 07485cc4..b1dc3220 100644 --- a/altosuilib/AltosLed.java +++ b/altosuilib/AltosLed.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import javax.swing.*; diff --git a/altosuilib/AltosLights.java b/altosuilib/AltosLights.java index f445199c..34293bb4 100644 --- a/altosuilib/AltosLights.java +++ b/altosuilib/AltosLights.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import javax.swing.*; diff --git a/altosuilib/AltosPositionListener.java b/altosuilib/AltosPositionListener.java index 06ba4188..8eb4594a 100644 --- a/altosuilib/AltosPositionListener.java +++ b/altosuilib/AltosPositionListener.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  public interface AltosPositionListener {  	public void position_changed(int position); diff --git a/altosuilib/AltosRomconfigUI.java b/altosuilib/AltosRomconfigUI.java index 3a5188f8..33686b4f 100644 --- a/altosuilib/AltosRomconfigUI.java +++ b/altosuilib/AltosRomconfigUI.java @@ -15,12 +15,12 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import java.awt.event.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosRomconfigUI  	extends AltosUIDialog diff --git a/altosuilib/AltosScanUI.java b/altosuilib/AltosScanUI.java index 1d176e82..ee68fbc9 100644 --- a/altosuilib/AltosScanUI.java +++ b/altosuilib/AltosScanUI.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import java.awt.event.*; @@ -25,7 +25,7 @@ import java.io.*;  import java.util.*;  import java.text.*;  import java.util.concurrent.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  class AltosScanResult {  	String		callsign; diff --git a/altosuilib/AltosSerial.java b/altosuilib/AltosSerial.java index 85ab4654..1bf4dbbe 100644 --- a/altosuilib/AltosSerial.java +++ b/altosuilib/AltosSerial.java @@ -19,13 +19,13 @@   * Deal with TeleDongle on a serial port   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.io.*;  import java.util.*;  import java.awt.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import libaltosJNI.*;  /* diff --git a/altosuilib/AltosSerialInUseException.java b/altosuilib/AltosSerialInUseException.java index af7edb65..cba5cac0 100644 --- a/altosuilib/AltosSerialInUseException.java +++ b/altosuilib/AltosSerialInUseException.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  public class AltosSerialInUseException extends Exception {  	public AltosDevice	device; diff --git a/altosuilib/AltosUIAxis.java b/altosuilib/AltosUIAxis.java index e307874a..8ec8a114 100644 --- a/altosuilib/AltosUIAxis.java +++ b/altosuilib/AltosUIAxis.java @@ -15,14 +15,14 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.io.*;  import java.util.ArrayList;  import java.awt.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import org.jfree.ui.*;  import org.jfree.chart.*; @@ -48,7 +48,7 @@ public class AltosUIAxis extends NumberAxis {  	public final static int axis_default = axis_include_zero;  	public void set_units() { -		String u = units.show_units(); +		String u = units.parse_units();  		if (u != null)  			setLabel(String.format("%s (%s)", label, u));  		else diff --git a/altosuilib/AltosUIConfigure.java b/altosuilib/AltosUIConfigure.java index 89114c7e..de070473 100644 --- a/altosuilib/AltosUIConfigure.java +++ b/altosuilib/AltosUIConfigure.java @@ -15,14 +15,14 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import java.awt.event.*;  import java.beans.*;  import javax.swing.*;  import javax.swing.event.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  class DelegatingRenderer implements ListCellRenderer<Object> { diff --git a/altosuilib/AltosUIDataMissing.java b/altosuilib/AltosUIDataMissing.java index 585289ed..44668dff 100644 --- a/altosuilib/AltosUIDataMissing.java +++ b/altosuilib/AltosUIDataMissing.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  public class AltosUIDataMissing extends Exception {  	public int	id; diff --git a/altosuilib/AltosUIDataPoint.java b/altosuilib/AltosUIDataPoint.java index 7feb6d8e..7d905b46 100644 --- a/altosuilib/AltosUIDataPoint.java +++ b/altosuilib/AltosUIDataPoint.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  public interface AltosUIDataPoint {  	public abstract double x() throws AltosUIDataMissing; diff --git a/altosuilib/AltosUIDataSet.java b/altosuilib/AltosUIDataSet.java index 82809aa5..8c7bcf03 100644 --- a/altosuilib/AltosUIDataSet.java +++ b/altosuilib/AltosUIDataSet.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  public interface AltosUIDataSet {  	public abstract String name(); diff --git a/altosuilib/AltosUIDialog.java b/altosuilib/AltosUIDialog.java index a2625975..2fd46498 100644 --- a/altosuilib/AltosUIDialog.java +++ b/altosuilib/AltosUIDialog.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import java.awt.event.*; diff --git a/altosuilib/AltosUIEnable.java b/altosuilib/AltosUIEnable.java index 7bb80bc1..74de4bf5 100644 --- a/altosuilib/AltosUIEnable.java +++ b/altosuilib/AltosUIEnable.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import java.awt.event.*; @@ -23,7 +23,7 @@ import javax.swing.*;  import java.io.*;  import java.util.concurrent.*;  import java.util.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import org.jfree.ui.*;  import org.jfree.chart.*; diff --git a/altosuilib/AltosUIFlightTab.java b/altosuilib/AltosUIFlightTab.java index e098b76f..1e324450 100644 --- a/altosuilib/AltosUIFlightTab.java +++ b/altosuilib/AltosUIFlightTab.java @@ -15,13 +15,13 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.util.*;  import java.awt.*;  import java.awt.event.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public abstract class AltosUIFlightTab extends JComponent implements AltosFlightDisplay, HierarchyListener {  	public GridBagLayout	layout; diff --git a/altosuilib/AltosUIFrame.java b/altosuilib/AltosUIFrame.java index 295225d6..ac440190 100644 --- a/altosuilib/AltosUIFrame.java +++ b/altosuilib/AltosUIFrame.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import java.awt.event.*; @@ -23,8 +23,13 @@ import javax.swing.*;  import java.util.*;  class AltosUIFrameListener extends WindowAdapter { +	@Override  	public void windowClosing (WindowEvent e) { -		AltosUIPreferences.unregister_ui_listener((AltosUIFrame) e.getWindow()); +		AltosUIFrame frame = (AltosUIFrame) e.getWindow(); +		AltosUIPreferences.unregister_ui_listener(frame); +		AltosUIFrame.frame_closed(); +		frame.setVisible(false); +		frame.dispose();  	}  } @@ -263,10 +268,23 @@ public class AltosUIFrame extends JFrame implements AltosUIListener, AltosPositi  		return constraints(x, width, GridBagConstraints.NONE);  	} +	static int open_frames; + +	public static void frame_opened() { +		++open_frames; +	} + +	public static void frame_closed() { +		--open_frames; +		if (open_frames == 0) +			System.exit(0); +	} +  	void init() {  		AltosUIPreferences.register_ui_listener(this);  		AltosUIPreferences.register_position_listener(this);  		position = AltosUIPreferences.position(); +		frame_opened();  		addWindowListener(new AltosUIFrameListener());  		/* Try to make menus live in the menu bar like regular Mac apps */ diff --git a/altosuilib/AltosUIFreqList.java b/altosuilib/AltosUIFreqList.java index 7d49e692..c770f654 100644 --- a/altosuilib/AltosUIFreqList.java +++ b/altosuilib/AltosUIFreqList.java @@ -15,10 +15,10 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosUIFreqList extends JComboBox<AltosFrequency> { diff --git a/altosuilib/AltosUIGraph.java b/altosuilib/AltosUIGraph.java index dca12854..9c257763 100644 --- a/altosuilib/AltosUIGraph.java +++ b/altosuilib/AltosUIGraph.java @@ -15,14 +15,14 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.io.*;  import java.util.ArrayList;  import java.awt.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import org.jfree.ui.*;  import org.jfree.chart.*; diff --git a/altosuilib/AltosUIGrapher.java b/altosuilib/AltosUIGrapher.java index a30609fd..1acf5c46 100644 --- a/altosuilib/AltosUIGrapher.java +++ b/altosuilib/AltosUIGrapher.java @@ -15,14 +15,14 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.io.*;  import java.util.ArrayList;  import java.awt.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import org.jfree.ui.*;  import org.jfree.chart.*; diff --git a/altosuilib/AltosUIImage.java b/altosuilib/AltosUIImage.java index 1907e155..700e095f 100644 --- a/altosuilib/AltosUIImage.java +++ b/altosuilib/AltosUIImage.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altoslib_10; +package org.altusmetrum.altoslib_11;  import javax.swing.*;  import javax.imageio.ImageIO; diff --git a/altosuilib/AltosUIIndicator.java b/altosuilib/AltosUIIndicator.java index 819123a7..a91a7e66 100644 --- a/altosuilib/AltosUIIndicator.java +++ b/altosuilib/AltosUIIndicator.java @@ -15,11 +15,11 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public abstract class AltosUIIndicator implements AltosFontListener, AltosUnitsListener {  	JLabel		label; diff --git a/altosuilib/AltosUILib.java b/altosuilib/AltosUILib.java index ff9fd72a..5eefdc98 100644 --- a/altosuilib/AltosUILib.java +++ b/altosuilib/AltosUILib.java @@ -15,12 +15,12 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import libaltosJNI.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosUILib extends AltosLib { diff --git a/altosuilib/AltosUIListener.java b/altosuilib/AltosUIListener.java index 98d7452f..581711ad 100644 --- a/altosuilib/AltosUIListener.java +++ b/altosuilib/AltosUIListener.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  public interface AltosUIListener {  	public void ui_changed(String look_and_feel); diff --git a/altosuilib/AltosUIMapNew.java b/altosuilib/AltosUIMap.java index a90e8c91..8c90bcd8 100644 --- a/altosuilib/AltosUIMapNew.java +++ b/altosuilib/AltosUIMap.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import java.awt.event.*; @@ -27,9 +27,9 @@ import java.awt.geom.*;  import java.util.*;  import java.util.concurrent.*;  import javax.imageio.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*; -public class AltosUIMapNew extends JComponent implements AltosFlightDisplay, AltosMapInterface { +public class AltosUIMap extends JComponent implements AltosFlightDisplay, AltosMapInterface {  	AltosMap	map;  	Graphics2D	g; @@ -52,10 +52,10 @@ public class AltosUIMapNew extends JComponent implements AltosFlightDisplay, Alt  					   RenderingHints.VALUE_ANTIALIAS_ON);  			g.setStroke(new BasicStroke(stroke_width, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); -			if (0 <= state && state < AltosUIMapNew.stateColors.length) -				g.setColor(AltosUIMapNew.stateColors[state]); +			if (0 <= state && state < AltosUIMap.stateColors.length) +				g.setColor(AltosUIMap.stateColors[state]);  			else -				g.setColor(AltosUIMapNew.stateColors[AltosLib.ao_flight_invalid]); +				g.setColor(AltosUIMap.stateColors[AltosLib.ao_flight_invalid]);  			g.drawOval((int)pt.x-5, (int)pt.y-5, 10, 10);  			g.drawOval((int)pt.x-20, (int)pt.y-20, 40, 40); @@ -227,10 +227,10 @@ public class AltosUIMapNew extends JComponent implements AltosFlightDisplay, Alt  					Rectangle	bounds = line.getBounds();  					if (g.hitClip(bounds.x, bounds.y, bounds.width, bounds.height)) { -						if (0 <= point.state && point.state < AltosUIMapNew.stateColors.length) -							g.setColor(AltosUIMapNew.stateColors[point.state]); +						if (0 <= point.state && point.state < AltosUIMap.stateColors.length) +							g.setColor(AltosUIMap.stateColors[point.state]);  						else -							g.setColor(AltosUIMapNew.stateColors[AltosLib.ao_flight_invalid]); +							g.setColor(AltosUIMap.stateColors[AltosLib.ao_flight_invalid]);  						g.draw(line);  					} @@ -241,8 +241,8 @@ public class AltosUIMapNew extends JComponent implements AltosFlightDisplay, Alt  	}  	class MapTile extends AltosMapTile { -		public MapTile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size) { -			super(cache, upper_left, center, zoom, maptype, px_size); +		public MapTile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size, int scale) { +			super(cache, upper_left, center, zoom, maptype, px_size, scale);  		}  		public void paint(AltosMapTransform t) { @@ -332,8 +332,8 @@ public class AltosUIMapNew extends JComponent implements AltosFlightDisplay, Alt  		return new MapMark(lat, lon, state);  	} -	public AltosMapTile new_tile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size) { -		return new MapTile(cache, upper_left, center, zoom, maptype, px_size); +	public AltosMapTile new_tile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size, int scale) { +		return new MapTile(cache, upper_left, center, zoom, maptype, px_size, scale);  	}  	public int width() { @@ -361,7 +361,8 @@ public class AltosUIMapNew extends JComponent implements AltosFlightDisplay, Alt  	}  	public void debug(String format, Object ... arguments) { -		System.out.printf(format, arguments); +		if (AltosUIPreferences.serial_debug()) +			System.out.printf(format, arguments);  	} @@ -427,7 +428,7 @@ public class AltosUIMapNew extends JComponent implements AltosFlightDisplay, Alt  	MapView	view; -	public AltosUIMapNew() { +	public AltosUIMap() {  		set_font(); diff --git a/altosuilib/AltosUIMapPreloadNew.java b/altosuilib/AltosUIMapPreload.java index 3269bbdd..32690037 100644 --- a/altosuilib/AltosUIMapPreloadNew.java +++ b/altosuilib/AltosUIMapPreload.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import java.awt.event.*; @@ -26,9 +26,10 @@ import java.text.*;  import java.lang.Math;  import java.net.URL;  import java.net.URLConnection; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*; -class AltosUIMapPos extends Box { +class AltosUIMapPos extends Box implements ActionListener { +	AltosUIMapPreload	preload;  	AltosUIFrame	owner;  	JLabel		label;  	JComboBox	hemi; @@ -37,6 +38,11 @@ class AltosUIMapPos extends Box {  	JTextField	min;  	JLabel		min_label; +	/* ActionListener interface */ +	public void actionPerformed(ActionEvent e) { +		preload.center_map(); +	} +  	public void set_value(double new_value) {  		double	d, m;  		int	h; @@ -88,19 +94,23 @@ class AltosUIMapPos extends Box {  	}  	public AltosUIMapPos(AltosUIFrame in_owner, -			   String label_value, -			   String[] hemi_names, -			   double default_value) { +			     AltosUIMapPreload preload, +			     String label_value, +			     String[] hemi_names, +			     double default_value) {  		super(BoxLayout.X_AXIS);  		owner = in_owner; +		this.preload = preload;  		label = new JLabel(label_value);  		hemi = new JComboBox<String>(hemi_names);  		hemi.setEditable(false);  		deg = new JTextField(5); +		deg.addActionListener(this);  		deg.setMinimumSize(deg.getPreferredSize());  		deg.setHorizontalAlignment(JTextField.RIGHT);  		deg_label = new JLabel("°");  		min = new JTextField(9); +		min.addActionListener(this);  		min.setMinimumSize(min.getPreferredSize());  		min_label = new JLabel("'");  		set_value(default_value); @@ -118,9 +128,9 @@ class AltosUIMapPos extends Box {  	}  } -public class AltosUIMapPreloadNew extends AltosUIFrame implements ActionListener, ItemListener, AltosLaunchSiteListener, AltosMapLoaderListener  { +public class AltosUIMapPreload extends AltosUIFrame implements ActionListener, ItemListener, AltosLaunchSiteListener, AltosMapLoaderListener, AltosUnitsListener, AltosFontListener  {  	AltosUIFrame	owner; -	AltosUIMapNew	map; +	AltosUIMap	map;  	AltosUIMapPos	lat;  	AltosUIMapPos	lon; @@ -131,14 +141,15 @@ public class AltosUIMapPreloadNew extends AltosUIFrame implements ActionListener  	JComboBox<AltosLaunchSite>	site_list;  	JToggleButton	load_button; -	boolean		loading;  	JButton		close_button;  	JCheckBox[]	maptypes = new JCheckBox[AltosMap.maptype_terrain - AltosMap.maptype_hybrid + 1];  	JComboBox<Integer>	min_zoom;  	JComboBox<Integer>	max_zoom; +	JLabel			radius_label;  	JComboBox<Double>	radius; +	int scale = 1;  	Integer[]		zooms = { -12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6 }; @@ -147,26 +158,36 @@ public class AltosUIMapPreloadNew extends AltosUIFrame implements ActionListener  	Double[]	radius_km = { 2.0, 5.0, 10.0, 20.0, 30.0 };  	Double		radius_def_km = 10.0; +	AltosMapLoader	loader;  	static final String[]	lat_hemi_names = { "N", "S" };  	static final String[]	lon_hemi_names = { "E", "W" };  	double	latitude, longitude; +	long	loader_notify_time; +  	/* AltosMapLoaderListener interfaces */  	public void loader_start(final int max) { +		loader_notify_time = System.currentTimeMillis(); +  		SwingUtilities.invokeLater(new Runnable() {  				public void run() {  					pbar.setMaximum(max);  					pbar.setValue(0);  					pbar.setString(""); -					map.clear_marks(); -					map.add_mark(latitude, longitude, AltosLib.ao_flight_boost);  				}  			});  	}  	public void loader_notify(final int cur, final int max, final String name) { +		long	now = System.currentTimeMillis(); + +		if (now - loader_notify_time < 100) +			return; + +		loader_notify_time = now; +  		SwingUtilities.invokeLater(new Runnable() {  				public void run() {  					pbar.setValue(cur); @@ -176,12 +197,12 @@ public class AltosUIMapPreloadNew extends AltosUIFrame implements ActionListener  	}  	public void loader_done(int max) { +		loader = null;  		SwingUtilities.invokeLater(new Runnable() {  				public void run() {  					pbar.setValue(0);  					pbar.setString("");  					load_button.setSelected(false); -					loading = false;  				}  			});  	} @@ -200,6 +221,19 @@ public class AltosUIMapPreloadNew extends AltosUIFrame implements ActionListener  		return all_types;  	} +	void center_map(double latitude, double longitude) { +		map.map.centre(new AltosLatLon(latitude, longitude)); +		map.clear_marks(); +		map.add_mark(latitude, longitude, AltosLib.ao_flight_boost); +	} + +	void center_map() { +		try { +			center_map(lat.get_value(), lon.get_value()); +		} catch (ParseException pe) { +		} +	} +  	public void itemStateChanged(ItemEvent e) {  		int		state = e.getStateChange(); @@ -209,6 +243,7 @@ public class AltosUIMapPreloadNew extends AltosUIFrame implements ActionListener  				AltosLaunchSite	site = (AltosLaunchSite) o;  				lat.set_value(site.latitude);  				lon.set_value(site.longitude); +				center_map(site.latitude, site.longitude);  			}  		}  	} @@ -216,11 +251,14 @@ public class AltosUIMapPreloadNew extends AltosUIFrame implements ActionListener  	public void actionPerformed(ActionEvent e) {  		String	cmd = e.getActionCommand(); -		if (cmd.equals("close")) +		if (cmd.equals("close")) { +			if (loader != null) +				loader.abort();  			setVisible(false); +		}  		if (cmd.equals("load")) { -			if (!loading) { +			if (loader == null) {  				try {  					latitude = lat.get_value();  					longitude = lon.get_value(); @@ -231,14 +269,16 @@ public class AltosUIMapPreloadNew extends AltosUIFrame implements ActionListener  					Double r = (Double) radius.getSelectedItem();  					if (AltosPreferences.imperial_units()) -						r = AltosConvert.distance.inverse(r); +						r = AltosConvert.miles_to_meters(r);  					else  						r = r * 1000; -					loading = true; -					new AltosMapLoader(map.map, this, -							   latitude, longitude, -							   min_z, max_z, r, all_types()); +					center_map(latitude, longitude); + +					loader = new AltosMapLoader(this, +								    latitude, longitude, +								    min_z, max_z, r, +								    all_types(), scale);  				} catch (ParseException pe) {  					load_button.setSelected(false); @@ -259,7 +299,35 @@ public class AltosUIMapPreloadNew extends AltosUIFrame implements ActionListener  			});  	} -	public AltosUIMapPreloadNew(AltosUIFrame in_owner) { +	private void set_radius_values() { +		radius_label.setText(String.format("Map Radius (%s)", +						   AltosPreferences.imperial_units() ? "mi" : "km")); + +		Double[]	radii; + +		if (AltosPreferences.imperial_units()) +			radii = radius_mi; +		else +			radii = radius_km; + +		radius.removeAllItems(); +		for (Double r : radii) { +			radius.addItem(r); +		} +		radius.setSelectedItem(radii[2]); +		radius.setMaximumRowCount(radii.length); +	} + +	public void units_changed(boolean imperial_units) { +		map.units_changed(imperial_units); +		set_radius_values(); +	} + +	public void font_size_changed(int font_size) { +		map.font_size_changed(font_size); +	} + +	public AltosUIMapPreload(AltosUIFrame in_owner) {  		owner = in_owner;  		Container		pane = getContentPane(); @@ -270,7 +338,19 @@ public class AltosUIMapPreloadNew extends AltosUIFrame implements ActionListener  		pane.setLayout(new GridBagLayout()); -		map = new AltosUIMapNew(); +		addWindowListener(new WindowAdapter() { +				@Override +				public void windowClosing(WindowEvent e) { +					AltosUIPreferences.unregister_font_listener(AltosUIMapPreload.this); +					AltosPreferences.unregister_units_listener(AltosUIMapPreload.this); +				} +			}); + + +		AltosPreferences.register_units_listener(this); +		AltosUIPreferences.register_font_listener(this); + +		map = new AltosUIMap();  		c.fill = GridBagConstraints.BOTH;  		c.anchor = GridBagConstraints.CENTER; @@ -335,7 +415,7 @@ public class AltosUIMapPreloadNew extends AltosUIFrame implements ActionListener  		pane.add(site_list, c); -		lat = new AltosUIMapPos(owner, +		lat = new AltosUIMapPos(owner, this,  					"Latitude:",  					lat_hemi_names,  					37.167833333); @@ -352,7 +432,7 @@ public class AltosUIMapPreloadNew extends AltosUIFrame implements ActionListener  		pane.add(lat, c); -		lon = new AltosUIMapPos(owner, +		lon = new AltosUIMapPos(owner, this,  					"Longitude:",  					lon_hemi_names,  					-97.73975); @@ -445,26 +525,20 @@ public class AltosUIMapPreloadNew extends AltosUIFrame implements ActionListener  		c.gridy = 3;  		pane.add(max_zoom, c); -		JLabel radius_label = new JLabel(String.format("Map Radius (%s)", -							       AltosPreferences.imperial_units() ? "miles" : "km")); +		radius_label = new JLabel(); +  		c.gridx = 4;  		c.gridy = 4;  		pane.add(radius_label, c); -		Double[]	radii; -		Double		radius_default; - -		if (AltosPreferences.imperial_units()) -			radii = radius_mi; -		else -			radii = radius_km; -		radius = new JComboBox<Double>(radii); -		radius.setSelectedItem(radii[2]); +		radius = new JComboBox<Double>();  		radius.setEditable(true);  		c.gridx = 5;  		c.gridy = 4;  		pane.add(radius, c); +		set_radius_values(); +  		pack();  		setLocationRelativeTo(owner);  		setVisible(true); diff --git a/altosuilib/AltosUIMarker.java b/altosuilib/AltosUIMarker.java index dc96357a..84130562 100644 --- a/altosuilib/AltosUIMarker.java +++ b/altosuilib/AltosUIMarker.java @@ -15,14 +15,14 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.io.*;  import java.util.ArrayList;  import java.awt.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import org.jfree.ui.*;  import org.jfree.chart.*; diff --git a/altosuilib/AltosUIPreferences.java b/altosuilib/AltosUIPreferences.java index 5fc5f15e..84172711 100644 --- a/altosuilib/AltosUIPreferences.java +++ b/altosuilib/AltosUIPreferences.java @@ -15,13 +15,13 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.io.*;  import java.util.*;  import java.awt.Component;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosUIPreferences extends AltosPreferences { diff --git a/altosuilib/AltosUIPreferencesBackend.java b/altosuilib/AltosUIPreferencesBackend.java index d232edf7..3d212dc5 100644 --- a/altosuilib/AltosUIPreferencesBackend.java +++ b/altosuilib/AltosUIPreferencesBackend.java @@ -15,11 +15,11 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.io.File;  import java.util.prefs.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import javax.swing.filechooser.FileSystemView;  public class AltosUIPreferencesBackend extends AltosPreferencesBackend { diff --git a/altosuilib/AltosUIRateList.java b/altosuilib/AltosUIRateList.java index 5a18b32f..8919804e 100644 --- a/altosuilib/AltosUIRateList.java +++ b/altosuilib/AltosUIRateList.java @@ -15,10 +15,10 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosUIRateList extends JComboBox<String> { diff --git a/altosuilib/AltosUISeries.java b/altosuilib/AltosUISeries.java index b16f046b..3a1dde03 100644 --- a/altosuilib/AltosUISeries.java +++ b/altosuilib/AltosUISeries.java @@ -15,14 +15,14 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.io.*;  import java.util.ArrayList;  import java.awt.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  import org.jfree.ui.*;  import org.jfree.chart.*; @@ -69,7 +69,7 @@ public class AltosUISeries extends XYSeries implements AltosUIGrapher {  		String  example = units.graph_format(7);  		ttg = new StandardXYToolTipGenerator(String.format("{1}s: {2}%s ({0})", -								   units.show_units()), +								   units.graph_units()),  						     new java.text.DecimalFormat(time_example),  						     new java.text.DecimalFormat(example));  		renderer.setBaseToolTipGenerator(ttg); @@ -85,7 +85,7 @@ public class AltosUISeries extends XYSeries implements AltosUIGrapher {  	public void add(AltosUIDataPoint dataPoint) {  		try { -			super.add(dataPoint.x(), units.value(dataPoint.y(fetch))); +			super.add(dataPoint.x(), units.graph_value(dataPoint.y(fetch)));  		} catch (AltosUIDataMissing dm) {  		}  	} diff --git a/altosuilib/AltosUITelemetryList.java b/altosuilib/AltosUITelemetryList.java index bba14678..a2599acd 100644 --- a/altosuilib/AltosUITelemetryList.java +++ b/altosuilib/AltosUITelemetryList.java @@ -15,11 +15,11 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.util.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class AltosUITelemetryList extends JComboBox<String> { diff --git a/altosuilib/AltosUIUnitsIndicator.java b/altosuilib/AltosUIUnitsIndicator.java index a84bd0b2..63af5725 100644 --- a/altosuilib/AltosUIUnitsIndicator.java +++ b/altosuilib/AltosUIUnitsIndicator.java @@ -15,11 +15,11 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public abstract class AltosUIUnitsIndicator extends AltosUIIndicator { @@ -46,10 +46,10 @@ public abstract class AltosUIUnitsIndicator extends AltosUIIndicator {  	public double[] last_values; -	public void show(double... v) { +	private void show(boolean force, double... v) {  		show();  		for (int i = 0; i < values.length; i++) { -			if (v[i] != last_values[i]) { +			if (force || v[i] != last_values[i]) {  				String	value_text;  				boolean	good = false; @@ -68,13 +68,19 @@ public abstract class AltosUIUnitsIndicator extends AltosUIIndicator {  		}  	} +	boolean hide = false; + +	public void show(double... v) { +		show(false, v); +	} +  	public void units_changed(boolean imperial_units) { -		show(last_values); +		if (!hide) +			show(true, last_values);  	}  	public void show (AltosState state, AltosListenerState listener_state) {  		double[] v = new double[values.length]; -		boolean hide = false;  		for (int i = 0; i < values.length; i++) {  			if (state != null) @@ -93,7 +99,7 @@ public abstract class AltosUIUnitsIndicator extends AltosUIIndicator {  	public void reset() {  		for (int i = 0; i < last_values.length; i++) -			last_values[i] = AltosLib.MISSING - 1; +			last_values[i] = AltosLib.MISSING;  	}  	public AltosUIUnitsIndicator (Container container, int x, int y, int label_width, AltosUnits units, String name, int number_values, boolean has_lights, int width) { @@ -101,7 +107,7 @@ public abstract class AltosUIUnitsIndicator extends AltosUIIndicator {  		this.units = units;  		last_values = new double[values.length];  		for (int i = 0; i < last_values.length; i++) -			last_values[i] = AltosLib.MISSING - 1; +			last_values[i] = AltosLib.MISSING;  	}  	public AltosUIUnitsIndicator (Container container, int x, int y, AltosUnits units, String name, int number_values, boolean has_lights, int width) { diff --git a/altosuilib/AltosUIVoltageIndicator.java b/altosuilib/AltosUIVoltageIndicator.java index d753b759..852b594d 100644 --- a/altosuilib/AltosUIVoltageIndicator.java +++ b/altosuilib/AltosUIVoltageIndicator.java @@ -15,11 +15,11 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public abstract class AltosUIVoltageIndicator extends AltosUIUnitsIndicator { @@ -30,7 +30,7 @@ public abstract class AltosUIVoltageIndicator extends AltosUIUnitsIndicator {  		return voltage(state);  	} -	double last_voltage = -1; +	double last_voltage = AltosLib.MISSING;  	public AltosUIVoltageIndicator (Container container, int x, int y, String name, int width) {  		super(container, x, y, AltosConvert.voltage, name, 1, true, width); diff --git a/altosuilib/AltosUSBDevice.java b/altosuilib/AltosUSBDevice.java index c93a3211..ea4f9f3c 100644 --- a/altosuilib/AltosUSBDevice.java +++ b/altosuilib/AltosUSBDevice.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.util.*;  import libaltosJNI.*; diff --git a/altosuilib/AltosVoice.java b/altosuilib/AltosVoice.java index 1b65acdc..33a06a4e 100644 --- a/altosuilib/AltosVoice.java +++ b/altosuilib/AltosVoice.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import com.sun.speech.freetts.Voice;  import com.sun.speech.freetts.VoiceManager; diff --git a/altosuilib/GrabNDrag.java b/altosuilib/GrabNDrag.java index 725bbab6..804425a3 100644 --- a/altosuilib/GrabNDrag.java +++ b/altosuilib/GrabNDrag.java @@ -15,7 +15,7 @@   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.   */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.awt.*;  import java.awt.event.*; diff --git a/altosuilib/Makefile.am b/altosuilib/Makefile.am index a00e4a12..d18006b5 100644 --- a/altosuilib/Makefile.am +++ b/altosuilib/Makefile.am @@ -57,8 +57,8 @@ altosuilib_JAVA = \  	AltosBTDeviceIterator.java \  	AltosBTManage.java \  	AltosBTKnown.java \ -	AltosUIMapNew.java \ -	AltosUIMapPreloadNew.java \ +	AltosUIMap.java \ +	AltosUIMapPreload.java \  	AltosUIFlightTab.java \  	AltosUIIndicator.java \  	AltosUIUnitsIndicator.java \ diff --git a/altosuilib/OSXAdapter.java b/altosuilib/OSXAdapter.java index c2915081..de5d5836 100755 --- a/altosuilib/OSXAdapter.java +++ b/altosuilib/OSXAdapter.java @@ -55,7 +55,7 @@ Copyright © 2003-2007 Apple, Inc., All Rights Reserved  */ -package org.altusmetrum.altosuilib_10; +package org.altusmetrum.altosuilib_11;  import java.lang.reflect.*;  import java.util.HashMap; diff --git a/ao-tools/ao-test-baro/ao-test-baro.c b/ao-tools/ao-test-baro/ao-test-baro.c index e883de4a..b3058b80 100644 --- a/ao-tools/ao-test-baro/ao-test-baro.c +++ b/ao-tools/ao-test-baro/ao-test-baro.c @@ -169,7 +169,7 @@ do_baro(struct cc_usb *usb) {  		return 0;  	} -	if (temperature < 20 || 35 < temperature) { +	if (temperature < 20 || 40 < temperature) {  		printf ("weird temperature %f\n", temperature);  		free_baro(b);  		return 0; diff --git a/configure.ac b/configure.ac index ee3d4225..6745b012 100644 --- a/configure.ac +++ b/configure.ac @@ -18,8 +18,8 @@ dnl  dnl Process this file with autoconf to create configure.  AC_PREREQ(2.57) -AC_INIT([altos], 1.6.3) -ANDROID_VERSION=11 +AC_INIT([altos], 1.6.4) +ANDROID_VERSION=12  AC_CONFIG_SRCDIR([src/kernel/ao.h])  AM_INIT_AUTOMAKE([foreign dist-bzip2])  AM_MAINTAINER_MODE @@ -31,8 +31,8 @@ AC_SUBST(ANDROID_VERSION)  dnl ==========================================================================  dnl Java library versions -ALTOSUILIB_VERSION=10 -ALTOSLIB_VERSION=10 +ALTOSUILIB_VERSION=11 +ALTOSLIB_VERSION=11  AC_SUBST(ALTOSLIB_VERSION)  AC_DEFINE(ALTOSLIB_VERSION,$ALTOSLIB_VERSION,[Version of the AltosLib package]) diff --git a/doc/Makefile b/doc/Makefile index ed06006a..31bc08d8 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -3,6 +3,7 @@  #  RELNOTES_INC=\ +	release-notes-1.6.4.inc \  	release-notes-1.6.3.inc \  	release-notes-1.6.2.inc \  	release-notes-1.6.1.inc \ diff --git a/doc/altusmetrum-docinfo.xml b/doc/altusmetrum-docinfo.xml index 5473dd66..1b8ff68d 100644 --- a/doc/altusmetrum-docinfo.xml +++ b/doc/altusmetrum-docinfo.xml @@ -47,6 +47,14 @@  <revhistory>    <?dbhtml filename="altusmetrum-revhistory.html"?>    <revision> +    <revnumber>1.6.4</revnumber> +    <date>10 May 2016</date> +    <revremark> +      Minor release fixing TeleBT v1.0 flow control and a few minor +      application bugs. +    </revremark> +  </revision> +  <revision>      <revnumber>1.6.3</revnumber>      <date>21 April 2016</date>      <revremark> diff --git a/doc/release-notes-1.6.4.inc b/doc/release-notes-1.6.4.inc new file mode 100644 index 00000000..f976a69d --- /dev/null +++ b/doc/release-notes-1.6.4.inc @@ -0,0 +1,42 @@ += Release Notes for Version 1.6.4 +:toc!: +:doctype: article + +	Version 1.6.4 fixes a bluetooth communication problem with +	TeleBT v1.0 devices, along with some altosui and altosdroid +	minor nits. It also now ships firmware for some newer devices. + +	== AltOS + +	AltOS fixes: + +	* Fix hardware flow control on TeleBT v1.0. Hardware RTS/CTS +	  doesn't seem to work, switch from using the hardware to +	  driving these pins with software. + +	* Fix ARM USB drivers to deal with OS restarts. Needed to +	  reset all USB-related state when the USB bus is reset. These +	  fixes affect all STM32L, STM32F0 and LPC11U14 based devices. + +	== AltosUI, TeleGPS and AltosDroid Applications + +	AltosUI, TeleGPS and AltosDroid New Features: + +	* Automatically switch from meters or feet to kilometers or +          miles for distance units. + +	* Add Monitor Idle mode to TeleGPS application. + +	AltosUI, TeleGPS and AltosDroid Fixes: + +	* Abort map preloading when the preload map dialog is closed. + +	* In AltosDroid, Don't reconnect to last device if the user +          had disconnected it the last time the application was +          active. + +	== Documentation + +	* Mention TeleMega v2.0 in hardware specs table. + +	* Document TeleGPS RF output in telegps manual. diff --git a/doc/release-notes.inc b/doc/release-notes.inc index 35ffa0d1..6ac90cfd 100644 --- a/doc/release-notes.inc +++ b/doc/release-notes.inc @@ -2,6 +2,11 @@  == Release Notes  	:leveloffset: 2 +	include::release-notes-1.6.4.raw[] + +	<<<< + +	:leveloffset: 2  	include::release-notes-1.6.3.raw[]  	<<<< diff --git a/doc/specs.inc b/doc/specs.inc index a6c7b69a..c335b081 100644 --- a/doc/specs.inc +++ b/doc/specs.inc @@ -79,6 +79,15 @@  	|8MB  	|40mW  	|3.7V + +	|TeleMega v2.0 +	|MS5607 30km (100k') +	|MMA6555 102g +	|uBlox Max-7Q +	|MPU6000 HMC5883 +	|8MB +	|40mW +	|3.7V  	endif::telemega[]  	ifdef::easymega[] diff --git a/doc/telegps-docinfo.xml b/doc/telegps-docinfo.xml index 4ba3f73c..1ef088fe 100644 --- a/doc/telegps-docinfo.xml +++ b/doc/telegps-docinfo.xml @@ -38,6 +38,14 @@  <revhistory>    <?dbhtml filename="telegps-revhistory.html"?>    <revision> +    <revnumber>1.6.4</revnumber> +    <date>10 May 2016</date> +    <revremark> +      Minor release fixing TeleBT v1.0 flow control and a few minor +      application bugs. +    </revremark> +  </revision> +  <revision>      <revnumber>1.6.1</revnumber>      <date>15 July 2015</date>      <revremark> diff --git a/doc/telegps-specs.inc b/doc/telegps-specs.inc index 6ff8c76f..417a9708 100644 --- a/doc/telegps-specs.inc +++ b/doc/telegps-specs.inc @@ -5,6 +5,11 @@  		TeleGPS uses the u-Blox Max-7Q GPS receiver. +	=== 70cm Transmitter + +		TeleGPS uses a TI CC115L transmitter. This radio +		produces 10mW of RF output. +  	=== Micro-controller  		TeleGPS uses an NXP LPC11U14 micro-controller. This diff --git a/doc/usage.inc b/doc/usage.inc index 25fdd6d3..29587b7e 100644 --- a/doc/usage.inc +++ b/doc/usage.inc @@ -167,13 +167,15 @@  		 signals, but no record of the flight will be  		 stored in on-board flash. +		ifdef::easymega,telemega[]  		|Additional Igniters  		|four very short beeps  		|Continuity indication for the four additional pyro -		|channels on TeleMega and EasyMega. One high tone for -		|no continuity, one low tone for continuity. These are -		|produced after the continuity indicators for the two -		|primary igniter channels. +		 channels on TeleMega and EasyMega. One high tone for +		 no continuity, one low tone for continuity. These are +		 produced after the continuity indicators for the two +		 primary igniter channels. +		endif::easymega,telemega[]  		|==== diff --git a/micropeak/Makefile.am b/micropeak/Makefile.am index a8834a66..7ad2c102 100644 --- a/micropeak/Makefile.am +++ b/micropeak/Makefile.am @@ -40,8 +40,14 @@ JAR=micropeak.jar  FATJAR=micropeak-fat.jar +if MULTI_ARCH +LIBALTOS_LINUX=libaltos32.so libaltos64.so +else +LIBALTOS_LINUX=libaltos.so +endif +  LIBALTOS= \ -	libaltos.so \ +	$(LIBALTOS_LINUX) \  	libaltos.dylib \  	altos64.dll \  	altos.dll @@ -98,8 +104,7 @@ all-local: micropeak-test micropeak-jdb $(JAR)  clean-local:  	-rm -rf classes $(JAR) $(FATJAR) \  		MicroPeak-Linux-*.tar.bz2 MicroPeak-Mac-*.dmg MicroPeak-Windows-*.exe \ -		$(ALTOSLIB_CLASS) \ -		$(ALTOSUILIB_CLASS) \ +		altoslib_*.jar altosuilib_*.jar \  		$(JFREECHART_CLASS) $(JCOMMON_CLASS) $(LIBALTOS) Manifest.txt Manifest-fat.txt \  		micropeak micropeak-test micropeak-jdb macosx linux windows micropeak-windows.log \  		micropeak-windows.nsi *.desktop @@ -121,7 +126,7 @@ DOC=$(MICROPEAK_DOC)  FAT_FILES=$(FATJAR) $(ALTOSLIB_CLASS) $(ALTOSUILIB_CLASS) $(FREETTS_CLASS) $(JFREECHART_CLASS) $(JCOMMON_CLASS) -LINUX_FILES=$(FAT_FILES) libaltos.so $(FIRMWARE) $(DOC) $(desktop_file).in $(LINUX_ICONS) $(LINUX_MIMETYPE) +LINUX_FILES=$(FAT_FILES) $(LIBALTOS_LINUX) $(FIRMWARE) $(DOC) $(desktop_file).in $(LINUX_ICONS) $(LINUX_MIMETYPE)  LINUX_EXTRA=micropeak-fat $(desktop_file).in  MACOSX_DRIVER_0_URL=http://www.ftdichip.com/Drivers/VCP/MacOSX/FTDIUSBSerialDriver_v2_2_18.dmg @@ -220,6 +225,14 @@ libaltos.so: build-libaltos  	-rm -f "$@"  	$(LN_S) ../libaltos/.libs/"$@" . +libaltos32.so: build-libaltos +	-rm -f "$@" +	$(LN_S) ../libaltos/.libs/"$@" . + +libaltos64.so: build-libaltos +	-rm -f "$@" +	$(LN_S) ../libaltos/.libs/"$@" . +  libaltos.dylib:  	-rm -f "$@"  	$(LN_S) ../libaltos/"$@" . @@ -232,6 +245,10 @@ altos64.dll: ../libaltos/altos64.dll  	-rm -f "$@"  	$(LN_S) ../libaltos/"$@" . +../libaltos/.libs/libaltos64.so: ../libaltos/.libs/libaltos32.so + +../libaltos/.libs/libaltos32.so: build-libaltos +  ../libaltos/.libs/libaltos.so: build-libaltos  ../libaltos/altos.dll: build-altos-dll diff --git a/micropeak/MicroData.java b/micropeak/MicroData.java index 60bf8ad7..e763be27 100644 --- a/micropeak/MicroData.java +++ b/micropeak/MicroData.java @@ -20,8 +20,8 @@ package org.altusmetrum.micropeak;  import java.lang.*;  import java.io.*;  import java.util.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  class MicroIterator implements Iterator<MicroDataPoint> {  	int		i; diff --git a/micropeak/MicroDataPoint.java b/micropeak/MicroDataPoint.java index 2775165f..fd6b4a8b 100644 --- a/micropeak/MicroDataPoint.java +++ b/micropeak/MicroDataPoint.java @@ -17,7 +17,7 @@  package org.altusmetrum.micropeak; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altosuilib_11.*;  public class MicroDataPoint implements AltosUIDataPoint {  	public double		time; diff --git a/micropeak/MicroDeviceDialog.java b/micropeak/MicroDeviceDialog.java index 005e154e..8b2c747f 100644 --- a/micropeak/MicroDeviceDialog.java +++ b/micropeak/MicroDeviceDialog.java @@ -21,7 +21,7 @@ import javax.swing.*;  import java.awt.*;  import java.awt.event.*;  import java.util.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altosuilib_11.*;  public class MicroDeviceDialog extends AltosDeviceDialog { diff --git a/micropeak/MicroDownload.java b/micropeak/MicroDownload.java index 49bcaf54..9e0299b0 100644 --- a/micropeak/MicroDownload.java +++ b/micropeak/MicroDownload.java @@ -23,8 +23,8 @@ import javax.swing.*;  import java.io.*;  import java.util.concurrent.*;  import java.util.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class MicroDownload extends AltosUIDialog implements Runnable, ActionListener, MicroSerialLog, WindowListener {  	MicroPeak	owner; diff --git a/micropeak/MicroExport.java b/micropeak/MicroExport.java index 1c48a0d3..406f7286 100644 --- a/micropeak/MicroExport.java +++ b/micropeak/MicroExport.java @@ -23,8 +23,8 @@ import java.util.ArrayList;  import java.awt.*;  import javax.swing.*;  import javax.swing.filechooser.FileNameExtensionFilter; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class MicroExport extends JFileChooser { diff --git a/micropeak/MicroFile.java b/micropeak/MicroFile.java index 0ef021a1..00c59931 100644 --- a/micropeak/MicroFile.java +++ b/micropeak/MicroFile.java @@ -19,8 +19,8 @@ package org.altusmetrum.micropeak;  import java.io.*;  import java.util.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class MicroFile { diff --git a/micropeak/MicroFileChooser.java b/micropeak/MicroFileChooser.java index 013d1128..394b4317 100644 --- a/micropeak/MicroFileChooser.java +++ b/micropeak/MicroFileChooser.java @@ -20,8 +20,8 @@ package org.altusmetrum.micropeak;  import javax.swing.*;  import javax.swing.filechooser.FileNameExtensionFilter;  import java.io.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class MicroFileChooser extends JFileChooser {  	JFrame	frame; diff --git a/micropeak/MicroFrame.java b/micropeak/MicroFrame.java index 9f3c0426..618c839e 100644 --- a/micropeak/MicroFrame.java +++ b/micropeak/MicroFrame.java @@ -21,7 +21,7 @@ import java.awt.*;  import java.awt.event.*;  import javax.swing.*;  import java.util.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altosuilib_11.*;  public class MicroFrame extends AltosUIFrame {  	static String[] micro_icon_names = { diff --git a/micropeak/MicroGraph.java b/micropeak/MicroGraph.java index 4941070c..bc9fb0dc 100644 --- a/micropeak/MicroGraph.java +++ b/micropeak/MicroGraph.java @@ -22,8 +22,8 @@ import java.util.ArrayList;  import java.awt.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  import org.jfree.ui.*;  import org.jfree.chart.*; diff --git a/micropeak/MicroPeak.java b/micropeak/MicroPeak.java index fb4fe1cb..c624246f 100644 --- a/micropeak/MicroPeak.java +++ b/micropeak/MicroPeak.java @@ -23,8 +23,8 @@ import javax.swing.*;  import java.io.*;  import java.util.concurrent.*;  import java.util.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class MicroPeak extends MicroFrame implements ActionListener, ItemListener { diff --git a/micropeak/MicroRaw.java b/micropeak/MicroRaw.java index 767ff9e1..8857958f 100644 --- a/micropeak/MicroRaw.java +++ b/micropeak/MicroRaw.java @@ -20,8 +20,8 @@ package org.altusmetrum.micropeak;  import java.awt.*;  import java.io.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class MicroRaw extends JTextArea { diff --git a/micropeak/MicroSave.java b/micropeak/MicroSave.java index a38e2b46..6822a961 100644 --- a/micropeak/MicroSave.java +++ b/micropeak/MicroSave.java @@ -24,8 +24,8 @@ import javax.swing.filechooser.FileNameExtensionFilter;  import java.io.*;  import java.util.concurrent.*;  import java.util.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class MicroSave extends JFileChooser { diff --git a/micropeak/MicroSerial.java b/micropeak/MicroSerial.java index ea68aa1a..93c40d71 100644 --- a/micropeak/MicroSerial.java +++ b/micropeak/MicroSerial.java @@ -20,7 +20,7 @@ package org.altusmetrum.micropeak;  import java.util.*;  import java.io.*;  import libaltosJNI.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altosuilib_11.*;  public class MicroSerial extends InputStream {  	SWIGTYPE_p_altos_file	file; diff --git a/micropeak/MicroSerialLog.java b/micropeak/MicroSerialLog.java index e8accaeb..55d759e5 100644 --- a/micropeak/MicroSerialLog.java +++ b/micropeak/MicroSerialLog.java @@ -20,7 +20,7 @@ package org.altusmetrum.micropeak;  import java.util.*;  import java.io.*;  import libaltosJNI.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altosuilib_11.*;  public interface MicroSerialLog { diff --git a/micropeak/MicroStats.java b/micropeak/MicroStats.java index d2f80a8f..75480445 100644 --- a/micropeak/MicroStats.java +++ b/micropeak/MicroStats.java @@ -18,8 +18,8 @@  package org.altusmetrum.micropeak;  import java.io.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class MicroStats {  	double		coast_height; diff --git a/micropeak/MicroStatsTable.java b/micropeak/MicroStatsTable.java index 1adef54a..7ffae2f2 100644 --- a/micropeak/MicroStatsTable.java +++ b/micropeak/MicroStatsTable.java @@ -19,8 +19,8 @@ package org.altusmetrum.micropeak;  import java.awt.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class MicroStatsTable extends JComponent implements AltosFontListener {  	GridBagLayout	layout; diff --git a/micropeak/MicroUSB.java b/micropeak/MicroUSB.java index 9ceae1cb..4a72ba58 100644 --- a/micropeak/MicroUSB.java +++ b/micropeak/MicroUSB.java @@ -19,8 +19,8 @@ package org.altusmetrum.micropeak;  import java.util.*;  import libaltosJNI.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class MicroUSB extends altos_device implements AltosDevice { diff --git a/src/cc1111/ao_serial.c b/src/cc1111/ao_serial.c index 81727836..b4f57908 100644 --- a/src/cc1111/ao_serial.c +++ b/src/cc1111/ao_serial.c @@ -42,6 +42,18 @@ const __code struct ao_serial_speed ao_serial_speeds[] = {  #define AO_SERIAL_SPEED_MAX	AO_SERIAL_SPEED_115200 +#if HAS_SERIAL_1_ALT_1 +#define SERIAL_1_RTS P0_3 +#else +#define SERIAL_1_RTS P1_5 +#endif + +#if HAS_SERIAL_0_ALT_1 +#define SERIAL_0_RTS P0_5 +#else +#define SERIAL_0_RTS P1_3 +#endif +  #if HAS_SERIAL_0  volatile __xdata struct ao_fifo	ao_serial0_rx_fifo; @@ -56,6 +68,10 @@ ao_serial0_rx_isr(void) __interrupt 2  #if USE_SERIAL_0_STDIN  	ao_wakeup(&ao_stdin_ready);  #endif +#if HAS_SERIAL_0_HW_FLOW +	if (ao_fifo_mostly(ao_serial0_rx_fifo)) +		SERIAL_0_RTS = 1; +#endif  }  static __xdata uint8_t ao_serial0_tx_started; @@ -87,6 +103,10 @@ ao_serial0_getchar(void) __critical  	while (ao_fifo_empty(ao_serial0_rx_fifo))  		ao_sleep(&ao_serial0_rx_fifo);  	ao_fifo_remove(ao_serial0_rx_fifo, c); +#if HAS_SERIAL_0_HW_FLOW +	if (ao_fifo_barely(ao_serial0_rx_fifo)) +		SERIAL_0_RTS = 0; +#endif  	return c;  } @@ -98,6 +118,10 @@ _ao_serial0_pollchar(void)  	if (ao_fifo_empty(ao_serial0_rx_fifo))  		return AO_READ_AGAIN;  	ao_fifo_remove(ao_serial0_rx_fifo,c); +#if HAS_SERIAL_0_HW_FLOW +	if (ao_fifo_barely(ao_serial0_rx_fifo)) +		SERIAL_0_RTS = 0; +#endif  	return c;  }  #endif @@ -144,6 +168,10 @@ ao_serial1_rx_isr(void) __interrupt 3  #if USE_SERIAL_1_STDIN  	ao_wakeup(&ao_stdin_ready);  #endif +#if HAS_SERIAL_1_HW_FLOW +	if (ao_fifo_mostly(ao_serial1_rx_fifo)) +		SERIAL_1_RTS = 1; +#endif  }  static __xdata uint8_t ao_serial1_tx_started; @@ -175,6 +203,10 @@ ao_serial1_getchar(void) __critical  	while (ao_fifo_empty(ao_serial1_rx_fifo))  		ao_sleep(&ao_serial1_rx_fifo);  	ao_fifo_remove(ao_serial1_rx_fifo, c); +#if HAS_SERIAL_1_HW_FLOW +	if (ao_fifo_barely(ao_serial1_rx_fifo)) +		SERIAL_1_RTS = 0; +#endif  	return c;  } @@ -186,6 +218,10 @@ _ao_serial1_pollchar(void)  	if (ao_fifo_empty(ao_serial1_rx_fifo))  		return AO_READ_AGAIN;  	ao_fifo_remove(ao_serial1_rx_fifo,c); +#if HAS_SERIAL_1_HW_FLOW +	if (ao_fifo_barely(ao_serial1_rx_fifo)) +		SERIAL_1_RTS = 0; +#endif  	return c;  }  #endif @@ -232,7 +268,11 @@ ao_serial_init(void)  	/* Make the USART pins be controlled by the USART */  	P0SEL |= (1 << 2) | (1 << 3);  #if HAS_SERIAL_0_HW_FLOW -	P0SEL |= (1 << 4) | (1 << 5); +	SERIAL_0_RTS = 0; +	P0DIR |= (1 << 5); + +	P0SEL |= (1 << 4); +	P0INP |= (1 << 4);  #endif  #else  	/* Set up the USART pin assignment */ @@ -244,7 +284,11 @@ ao_serial_init(void)  	/* Make the USART pins be controlled by the USART */  	P1SEL |= (1 << 5) | (1 << 4);  #if HAS_SERIAL_0_HW_FLOW -	P1SEL |= (1 << 3) | (1 << 2); +	SERIAL_0_RTS = 0; +	P1DIR |= (1 << 3); + +	P1SEL |= (1 << 2); +	P1INP |= (1 << 2);  #endif  #endif @@ -287,7 +331,13 @@ ao_serial_init(void)  	/* Make the USART pins be controlled by the USART */  	P0SEL |= (1 << 5) | (1 << 4);  #if HAS_SERIAL_1_HW_FLOW -	P0SEL |= (1 << 3) | (1 << 2); +	/* SW RTS control (hw doesn't work) */ +	SERIAL_1_RTS = 0; +	P0DIR |= 1 << 3; + +	/* HW CTS. Maybe this works? */ +	P0SEL |= 1 << 2; +	P0INP |= 1 << 2;  #endif  #else  	/* Set up the USART pin assignment */ @@ -299,7 +349,13 @@ ao_serial_init(void)  	/* Make the USART pins be controlled by the USART */  	P1SEL |= (1 << 6) | (1 << 7);  #if HAS_SERIAL_1_HW_FLOW -	P1SEL |= (1 << 5) | (1 << 4); +	/* SW RTS control (hw doesn't work) */ +	SERIAL_1_RTS = 0; +	P1DIR |= (1 << 5); + +	/* HW CTS. Maybe this works? */ +	P1SEL |= (1 << 4); +	P1INP |= (1 << 4);  #endif  #endif diff --git a/src/drivers/ao_cc115l.c b/src/drivers/ao_cc115l.c index 0246ba02..24180f34 100644 --- a/src/drivers/ao_cc115l.c +++ b/src/drivers/ao_cc115l.c @@ -70,7 +70,7 @@ struct ao_cc115l_trace {  	const char			*comment;  }; -#define NUM_TRACE	256 +#define NUM_TRACE	32  static struct ao_cc115l_trace	trace[NUM_TRACE];  static int			trace_i; diff --git a/src/drivers/ao_trng_send.c b/src/drivers/ao_trng_send.c index 171a345f..4ac6ee5e 100644 --- a/src/drivers/ao_trng_send.c +++ b/src/drivers/ao_trng_send.c @@ -22,7 +22,7 @@  #include <ao_exti.h>  #include <ao_power.h> -static struct ao_task	ao_trng_send_task, ao_trng_send_raw_task; +static struct ao_task	ao_trng_send_task;  static uint8_t		trng_running;  static AO_TICK_TYPE	trng_power_time; @@ -30,6 +30,10 @@ static AO_TICK_TYPE	trng_power_time;  static uint8_t		random_mutex; +#if AO_USB_HAS_IN2 + +static struct ao_task	ao_trng_send_raw_task; +  static void  ao_trng_get_raw(uint16_t *buf)  { @@ -90,6 +94,8 @@ ao_trng_send_raw(void)  	}  } +#endif +  /* Make sure there's at least 8 bits of variance in the samples */  #define MIN_VARIANCE		(128 * 128) @@ -181,7 +187,9 @@ ao_trng_send(void)  	if (failed > AO_TRNG_START_CHECK / 4)  		ao_panic(AO_PANIC_DMA); +#if AO_USB_HAS_IN2  	ao_add_task(&ao_trng_send_raw_task, ao_trng_send_raw, "trng_send_raw"); +#endif  #ifdef AO_USB_START_DISABLED  	ao_usb_enable(); diff --git a/src/lpc/ao_usb_lpc.c b/src/lpc/ao_usb_lpc.c index 0dfaece4..3b3226ad 100644 --- a/src/lpc/ao_usb_lpc.c +++ b/src/lpc/ao_usb_lpc.c @@ -269,13 +269,10 @@ ao_usb_epn_in_count(uint8_t n)  	return ao_usb_ep_count(ao_usb_epn_in(n, 0));  } -static uint8_t * -ao_usb_enable_ep(vuint32_t *ep, uint16_t nbytes, uint16_t set_nbytes) +static void +ao_usb_enable_ep(vuint32_t *ep, uint8_t *addr, uint16_t set_nbytes)  { -	uint8_t	*addr = ao_usb_alloc_sram(nbytes); -  	ao_usb_set_ep(ep, addr, set_nbytes); -	return addr;  }  static void @@ -293,23 +290,13 @@ ao_usb_disable_ep(vuint32_t *ep)  static void  ao_usb_enable_epn(uint8_t n, -		  uint16_t out_bytes, uint8_t *out_addrs[2], -		  uint16_t in_bytes, uint8_t *in_addrs[2]) +		  uint16_t out_bytes, uint8_t *out_addr, +		  uint8_t *in_addr)  { -	uint8_t	*addr; - -	addr = ao_usb_enable_ep(ao_usb_epn_out(n, 0), out_bytes * 2, out_bytes); -	if (out_addrs) { -		out_addrs[0] = addr; -		out_addrs[1] = addr + out_bytes; -	} +	ao_usb_enable_ep(ao_usb_epn_out(n, 0), out_addr, out_bytes);  	ao_usb_disable_ep(ao_usb_epn_out(n, 1)); -	addr = ao_usb_enable_ep(ao_usb_epn_in(n, 0), in_bytes * 2, 0); -	if (in_addrs) { -		in_addrs[0] = addr; -		in_addrs[1] = addr + in_bytes; -	} +	ao_usb_enable_ep(ao_usb_epn_in(n, 0), in_addr, 0);  	ao_usb_disable_ep(ao_usb_epn_in(n, 1));  } @@ -327,6 +314,14 @@ ao_usb_reset(void)  {  	ao_usb_set_address(0);  	ao_usb_configuration = 0; + +	ao_usb_ep0_state = AO_USB_EP0_IDLE; +	ao_usb_ep0_in_data = NULL; +	ao_usb_ep0_in_len = 0; +	ao_usb_ep0_in_max = 0; + +	ao_usb_ep0_out_data = NULL; +	ao_usb_ep0_out_len = 0;  }  static void @@ -341,17 +336,14 @@ ao_usb_set_ep0(void)  	lpc_usb.intstat = 0xc00003ff; -	ao_usb_sram = lpc_usb_sram; -  	lpc_usb.epliststart = (uint32_t) (intptr_t) &lpc_usb_endpoint;  	lpc_usb.databufstart = ((uint32_t) (intptr_t) ao_usb_sram) & 0xffc00000;  	/* Set up EP 0 - a Control end point with 32 bytes of in and out buffers */ -	ao_usb_ep0_rx_buffer = ao_usb_enable_ep(ao_usb_ep0_out(), AO_USB_CONTROL_SIZE, AO_USB_CONTROL_SIZE); -	ao_usb_ep0_setup_buffer = ao_usb_alloc_sram(AO_USB_CONTROL_SIZE); +	ao_usb_enable_ep(ao_usb_ep0_out(), ao_usb_ep0_rx_buffer, AO_USB_CONTROL_SIZE);  	lpc_usb_endpoint.setup = ao_usb_sram_offset(ao_usb_ep0_setup_buffer); -	ao_usb_ep0_tx_buffer = ao_usb_enable_ep(ao_usb_ep0_in(), AO_USB_CONTROL_SIZE, 0); +	ao_usb_enable_ep(ao_usb_ep0_in(), ao_usb_ep0_tx_buffer, 0);  	/* Clear all of the other endpoints */  	for (e = 1; e <= 4; e++) @@ -365,10 +357,10 @@ ao_usb_set_configuration(void)  	debug ("ao_usb_set_configuration\n");  	/* Set up the INT end point */ -	ao_usb_enable_epn(AO_USB_INT_EP, 0, NULL, 0, NULL); +	ao_usb_enable_epn(AO_USB_INT_EP, 0, NULL, NULL);  	/* Set up the OUT end point */ -	ao_usb_enable_epn(AO_USB_OUT_EP, AO_USB_OUT_SIZE, ao_usb_out_rx_buffer, 0, NULL); +	ao_usb_enable_epn(AO_USB_OUT_EP, AO_USB_OUT_SIZE, ao_usb_out_rx_buffer[0], NULL);  	/* Set the current RX pointer to the *other* buffer so that when buffer 0 gets  	 * data, we'll switch to it and pull bytes from there @@ -376,10 +368,18 @@ ao_usb_set_configuration(void)  	ao_usb_out_rx_cur = 1;  	/* Set up the IN end point */ -	ao_usb_enable_epn(AO_USB_IN_EP, 0, NULL, AO_USB_IN_SIZE, ao_usb_in_tx_buffer); +	ao_usb_enable_epn(AO_USB_IN_EP, 0, NULL, ao_usb_in_tx_buffer[0]);  	ao_usb_in_tx_cur = 0; +	ao_usb_in_flushed = 0; +	ao_usb_in_pending = 0; +	ao_wakeup(&ao_usb_in_pending); + +	ao_usb_out_avail = 0; +	ao_usb_configuration = 0; +  	ao_usb_running = 1; +	ao_wakeup(&ao_usb_running);  }  /* Send an IN data packet */ @@ -481,7 +481,7 @@ static struct ao_usb_line_coding ao_usb_line_coding = {115200, 0, 0, 8};  /* Walk through the list of descriptors and find a match   */  static void -ao_usb_get_descriptor(uint16_t value) +ao_usb_get_descriptor(uint16_t value, uint16_t length)  {  	const uint8_t		*descriptor;  	uint8_t		type = value >> 8; @@ -495,6 +495,8 @@ ao_usb_get_descriptor(uint16_t value)  				len = descriptor[2];  			else  				len = descriptor[0]; +			if (len > length) +				len = length;  			ao_usb_ep0_in_set(descriptor, len);  			break;  		} @@ -539,7 +541,7 @@ ao_usb_ep0_setup(void)  				break;  			case AO_USB_REQ_GET_DESCRIPTOR:  				debug ("get descriptor %d\n", ao_usb_setup.value); -				ao_usb_get_descriptor(ao_usb_setup.value); +				ao_usb_get_descriptor(ao_usb_setup.value, ao_usb_setup.length);  				break;  			case AO_USB_REQ_GET_CONFIGURATION:  				debug ("get configuration %d\n", ao_usb_configuration); @@ -958,6 +960,17 @@ ao_usb_enable(void)  	for (t = 0; t < 1000; t++)  		ao_arch_nop(); +	ao_usb_sram = lpc_usb_sram; + +	ao_usb_ep0_rx_buffer    = ao_usb_alloc_sram(AO_USB_CONTROL_SIZE); +	ao_usb_ep0_tx_buffer    = ao_usb_alloc_sram(AO_USB_CONTROL_SIZE); +	ao_usb_ep0_setup_buffer = ao_usb_alloc_sram(AO_USB_CONTROL_SIZE); + +	ao_usb_out_rx_buffer[0] = ao_usb_alloc_sram(AO_USB_OUT_SIZE); +	ao_usb_out_rx_buffer[1] = ao_usb_alloc_sram(AO_USB_OUT_SIZE); +	ao_usb_in_tx_buffer[0]  = ao_usb_alloc_sram(AO_USB_IN_SIZE); +	ao_usb_in_tx_buffer[1]  = ao_usb_alloc_sram(AO_USB_IN_SIZE); +  	ao_usb_set_ep0();  #if HAS_USB_PULLUP @@ -1001,7 +1014,6 @@ ao_usb_init(void)  #if HAS_USB_PULLUP  	ao_enable_output(AO_USB_PULLUP_PORT, AO_USB_PULLUP_PIN, AO_USB_PULLUP, 0);  #endif -  	ao_usb_enable();  	debug ("ao_usb_init\n"); diff --git a/src/stm/ao_usb_stm.c b/src/stm/ao_usb_stm.c index 4e9d1f14..3d26466b 100644 --- a/src/stm/ao_usb_stm.c +++ b/src/stm/ao_usb_stm.c @@ -349,6 +349,19 @@ ao_usb_set_ep0(void)  	}  	ao_usb_set_address(0); + +	ao_usb_running = 0; + +	/* Reset our internal state +	 */ + +	ao_usb_ep0_state = AO_USB_EP0_IDLE; + +	ao_usb_ep0_in_data = NULL; +	ao_usb_ep0_in_len = 0; + +	ao_usb_ep0_out_data = 0; +	ao_usb_ep0_out_len = 0;  }  static void @@ -393,7 +406,15 @@ ao_usb_set_configuration(void)  		       STM_USB_EPR_STAT_RX_DISABLED,  		       STM_USB_EPR_STAT_TX_NAK); +	ao_usb_in_flushed = 0; +	ao_usb_in_pending = 0; +	ao_wakeup(&ao_usb_in_pending); + +	ao_usb_out_avail = 0; +	ao_usb_configuration = 0; +  	ao_usb_running = 1; +	ao_wakeup(&ao_usb_running);  }  static uint16_t	control_count; @@ -581,7 +602,7 @@ static struct ao_usb_line_coding ao_usb_line_coding = {115200, 0, 0, 8};  /* Walk through the list of descriptors and find a match   */  static void -ao_usb_get_descriptor(uint16_t value) +ao_usb_get_descriptor(uint16_t value, uint16_t length)  {  	const uint8_t		*descriptor;  	uint8_t		type = value >> 8; @@ -595,6 +616,8 @@ ao_usb_get_descriptor(uint16_t value)  				len = descriptor[2];  			else  				len = descriptor[0]; +			if (len > length) +				len = length;  			ao_usb_ep0_in_set(descriptor, len);  			break;  		} @@ -639,7 +662,7 @@ ao_usb_ep0_setup(void)  				break;  			case AO_USB_REQ_GET_DESCRIPTOR:  				debug ("get descriptor %d\n", ao_usb_setup.value); -				ao_usb_get_descriptor(ao_usb_setup.value); +				ao_usb_get_descriptor(ao_usb_setup.value, ao_usb_setup.length);  				break;  			case AO_USB_REQ_GET_CONFIGURATION:  				debug ("get configuration %d\n", ao_usb_configuration); diff --git a/src/stmf0/ao_arch_funcs.h b/src/stmf0/ao_arch_funcs.h index ccfa3fc7..64311b23 100644 --- a/src/stmf0/ao_arch_funcs.h +++ b/src/stmf0/ao_arch_funcs.h @@ -409,9 +409,6 @@ uint16_t *  ao_usb_alloc(void);  void -ao_usb_free(uint16_t *buffer); - -void  ao_usb_write(uint16_t *buffer, uint16_t len);  void diff --git a/src/stmf0/ao_usb_stm.c b/src/stmf0/ao_usb_stm.c index 253506d5..fb3d8c85 100644 --- a/src/stmf0/ao_usb_stm.c +++ b/src/stmf0/ao_usb_stm.c @@ -83,7 +83,9 @@ static uint8_t 	ao_usb_ep0_out_len;  /* Buffer description tables */  static union stm_usb_bdt	*ao_usb_bdt;  /* USB address of end of allocated storage */ +#if AO_USB_DIRECTIO  static uint16_t	ao_usb_sram_addr; +#endif  /* Pointer to ep0 tx/rx buffers in USB memory */  static uint16_t	*ao_usb_ep0_tx_buffer; @@ -362,39 +364,43 @@ ao_usb_init_ep(uint8_t ep, uint32_t addr, uint32_t type, uint32_t stat_rx, uint3  static void  ao_usb_alloc_buffers(void)  { -	ao_usb_sram_addr = 0; +	uint16_t sram_addr = 0;  	ao_usb_bdt = (void *) stm_usb_sram; -	ao_usb_sram_addr += 8 * STM_USB_BDT_SIZE; +	sram_addr += 8 * STM_USB_BDT_SIZE; -	ao_usb_ep0_tx_buffer = ao_usb_packet_buffer_addr(ao_usb_sram_addr); -	ao_usb_sram_addr += AO_USB_CONTROL_SIZE; +	ao_usb_ep0_tx_buffer = ao_usb_packet_buffer_addr(sram_addr); +	sram_addr += AO_USB_CONTROL_SIZE; -	ao_usb_ep0_rx_buffer = ao_usb_packet_buffer_addr(ao_usb_sram_addr); -	ao_usb_sram_addr += AO_USB_CONTROL_SIZE; +	ao_usb_ep0_rx_buffer = ao_usb_packet_buffer_addr(sram_addr); +	sram_addr += AO_USB_CONTROL_SIZE;  #if AO_USB_HAS_INT -	ao_usb_int_tx_offset = ao_usb_sram_addr; -	ao_usb_sram_addr += AO_USB_INT_SIZE; +	ao_usb_int_tx_offset = sram_addr; +	sram_addr += AO_USB_INT_SIZE;  #endif  #if AO_USB_HAS_OUT -	ao_usb_out_rx_buffer = ao_usb_packet_buffer_addr(ao_usb_sram_addr); -	ao_usb_out_rx_offset = ao_usb_sram_addr; -	ao_usb_sram_addr += AO_USB_OUT_SIZE; +	ao_usb_out_rx_buffer = ao_usb_packet_buffer_addr(sram_addr); +	ao_usb_out_rx_offset = sram_addr; +	sram_addr += AO_USB_OUT_SIZE;  #endif  #if AO_USB_HAS_IN -	ao_usb_in_tx_buffer = ao_usb_packet_buffer_addr(ao_usb_sram_addr); -	ao_usb_in_tx_offset = ao_usb_sram_addr; -	ao_usb_sram_addr += AO_USB_IN_SIZE; +	ao_usb_in_tx_buffer = ao_usb_packet_buffer_addr(sram_addr); +	ao_usb_in_tx_offset = sram_addr; +	sram_addr += AO_USB_IN_SIZE;  #endif  #if AO_USB_HAS_IN2 -	ao_usb_in2_tx_buffer = ao_usb_packet_buffer_addr(ao_usb_sram_addr); -	ao_usb_in2_tx_offset = ao_usb_sram_addr; -	ao_usb_sram_addr += AO_USB_IN_SIZE; +	ao_usb_in2_tx_buffer = ao_usb_packet_buffer_addr(sram_addr); +	ao_usb_in2_tx_offset = sram_addr; +	sram_addr += AO_USB_IN_SIZE; +#endif + +#if AO_USB_DIRECTIO +	ao_usb_sram_addr = sram_addr;  #endif  } @@ -437,6 +443,17 @@ ao_usb_set_ep0(void)  	ao_usb_set_address(0);  	ao_usb_running = 0; + +	/* Reset our internal state +	 */ + +	ao_usb_ep0_state = AO_USB_EP0_IDLE; + +	ao_usb_ep0_in_data = NULL; +	ao_usb_ep0_in_len = 0; + +	ao_usb_ep0_out_data = 0; +	ao_usb_ep0_out_len = 0;  }  static void @@ -493,6 +510,20 @@ ao_usb_set_configuration(void)  		       STM_USB_EPR_STAT_TX_NAK);  #endif +	ao_usb_in_flushed = 0; +	ao_usb_in_pending = 0; +	ao_wakeup(&ao_usb_in_pending); +#if AO_USB_HAS_IN2 +	ao_usb_in2_flushed = 0; +	ao_usb_in2_pending = 0; +	ao_wakeup(&ao_usb_in2_pending); +#endif + +	ao_usb_out_avail = 0; +	ao_usb_configuration = 0; + +	ao_wakeup(AO_USB_OUT_SLEEP_ADDR); +  	ao_usb_running = 1;  #if AO_USB_DIRECTIO  	ao_wakeup(&ao_usb_running); @@ -658,7 +689,7 @@ ao_usb_serial_init(void)  /* Walk through the list of descriptors and find a match   */  static void -ao_usb_get_descriptor(uint16_t value) +ao_usb_get_descriptor(uint16_t value, uint16_t length)  {  	const uint8_t		*descriptor;  	uint8_t		type = value >> 8; @@ -679,6 +710,8 @@ ao_usb_get_descriptor(uint16_t value)  				len = sizeof (ao_usb_serial);  			}  #endif +			if (len > length) +				len = length;  			ao_usb_ep0_in_set(descriptor, len);  			break;  		} @@ -723,7 +756,7 @@ ao_usb_ep0_setup(void)  				break;  			case AO_USB_REQ_GET_DESCRIPTOR:  				debug ("get descriptor %d\n", ao_usb_setup.value); -				ao_usb_get_descriptor(ao_usb_setup.value); +				ao_usb_get_descriptor(ao_usb_setup.value, ao_usb_setup.length);  				break;  			case AO_USB_REQ_GET_CONFIGURATION:  				debug ("get configuration %d\n", ao_usb_configuration); @@ -1159,14 +1192,6 @@ ao_usb_alloc(void)  }  void -ao_usb_free(uint16_t *addr) -{ -	uint16_t	offset = ao_usb_packet_buffer_offset(addr); -	if (offset < ao_usb_sram_addr) -		ao_usb_sram_addr = offset; -} - -void  ao_usb_write(uint16_t *buffer, uint16_t len)  {  	ao_arch_block_interrupts(); diff --git a/src/telegps-v1.0/ao_pins.h b/src/telegps-v1.0/ao_pins.h index d2382a56..eb1033da 100644 --- a/src/telegps-v1.0/ao_pins.h +++ b/src/telegps-v1.0/ao_pins.h @@ -105,6 +105,16 @@  #define AO_CC115L_DONE_INT_PORT		0  #define AO_CC115L_DONE_INT_PIN		2 +/* SN 1959, owned by J. Patrick Bowers, had a hard landing and appears to have broken the + * internal connection between pin 8 and the chip. This board + * has been fixed by jumpering pin 8 to pin 10, which means that + * the DONE_INT_PIN is now 4 instead of 2. When building custom firmware for + * this board, just adjust the ao_pins.h value before compiling + + #define AO_CC115L_DONE_INT_PIN_SN_1959	4 + + */ +  /*   * Flash (M25)   */ diff --git a/telegps/Makefile.am b/telegps/Makefile.am index 4caf43f4..3484b951 100644 --- a/telegps/Makefile.am +++ b/telegps/Makefile.am @@ -42,8 +42,14 @@ JAR=telegps.jar  FATJAR=telegps-fat.jar +if MULTI_ARCH +LIBALTOS_LINUX=libaltos32.so libaltos64.so +else +LIBALTOS_LINUX=libaltos.so +endif +  LIBALTOS= \ -	libaltos.so \ +	$(LIBALTOS_LINUX) \  	libaltos.dylib \  	altos64.dll \  	altos.dll @@ -101,7 +107,8 @@ FIRMWARE_TD_3_0=$(top_srcdir)/src/teledongle-v3.0/teledongle-v3.0-$(VERSION).ihx  FIRMWARE_TD=$(FIRMWARE_TD_0_2) $(FIRMWARE_TD_3_0)  FIRMWARE_TBT_1_0=$(top_srcdir)/src/telebt-v1.0/telebt-v1.0-$(VERSION).ihx -FIRMWARE_TBT=$(FIRMWARE_TBT_1_0) +FIRMWARE_TBT_3_0=$(top_srcdir)/src/telebt-v3.0/telebt-v3.0-$(VERSION).ihx +FIRMWARE_TBT=$(FIRMWARE_TBT_1_0) $(FIRMWARE_TBT_3_0)  FIRMWARE_TG_1_0=$(top_srcdir)/src/telegps-v1.0/telegps-v1.0-$(VERSION).ihx  FIRMWARE_TG=$(FIRMWARE_TG_1_0) @@ -117,9 +124,8 @@ all-local: telegps-test telegps-jdb $(JAR)  clean-local:  	-rm -rf classes $(JAR) $(FATJAR) \  		TeleGPS-Linux-*.tar.bz2 TeleGPS-Mac-*.dmg TeleGPS-Windows-*.exe \ -		$(ALTOSLIB_CLASS) \ -		$(ALTOSUILIB_CLASS) \ -		$(JFREECHART_CLASS) $(JCOMMON_CLASS) $(LIBALTOS) Manifest.txt Manifest-fat.txt \ +		altoslib_*.jar altosuilib_*.jar \ +		$(JFREECHART_CLASS) $(JCOMMON_CLASS) $(FREETTS_CLASS) $(LIBALTOS) Manifest.txt Manifest-fat.txt \  		telegps telegps-test telegps-jdb macosx linux windows telegps-windows.log \  		telegps-windows.nsi *.desktop @@ -140,7 +146,7 @@ DOC=$(TELEGPS_DOC)  FAT_FILES=$(FATJAR) $(ALTOSLIB_CLASS) $(ALTOSUILIB_CLASS) $(FREETTS_CLASS) $(JFREECHART_CLASS) $(JCOMMON_CLASS) -LINUX_FILES=$(FAT_FILES) libaltos.so $(FIRMWARE) $(DOC) $(desktop_file).in $(LINUX_ICONS) $(LINUX_MIMETYPE) +LINUX_FILES=$(FAT_FILES) $(LIBALTOS_LINUX) $(FIRMWARE) $(DOC) $(desktop_file).in $(LINUX_ICONS) $(LINUX_MIMETYPE)  LINUX_EXTRA=telegps-fat $(desktop_file).in  MACOSX_INFO_PLIST=Info.plist @@ -218,6 +224,14 @@ libaltos.so: build-libaltos  	-rm -f "$@"  	$(LN_S) ../libaltos/.libs/"$@" . +libaltos32.so: build-libaltos +	-rm -f "$@" +	$(LN_S) ../libaltos/.libs/"$@" . + +libaltos64.so: build-libaltos +	-rm -f "$@" +	$(LN_S) ../libaltos/.libs/"$@" . +  libaltos.dylib:  	-rm -f "$@"  	$(LN_S) ../libaltos/"$@" . @@ -230,6 +244,10 @@ altos64.dll: ../libaltos/altos64.dll  	-rm -f "$@"  	$(LN_S) ../libaltos/"$@" . +../libaltos/.libs/libaltos64.so: ../libaltos/.libs/libaltos32.so + +../libaltos/.libs/libaltos32.so: build-libaltos +  ../libaltos/.libs/libaltos.so: build-libaltos  ../libaltos/altos.dll: build-altos-dll diff --git a/telegps/TeleGPS.java b/telegps/TeleGPS.java index 122b1182..2897e06a 100644 --- a/telegps/TeleGPS.java +++ b/telegps/TeleGPS.java @@ -24,8 +24,8 @@ import java.io.*;  import java.util.concurrent.*;  import java.util.*;  import java.text.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class TeleGPS  	extends AltosUIFrame @@ -53,6 +53,7 @@ public class TeleGPS  	AltosFlightReader	reader;  	TeleGPSDisplayThread	thread; +	boolean			idle_mode;  	JMenuBar		menu_bar; @@ -71,7 +72,7 @@ public class TeleGPS  	JTabbedPane		pane; -	AltosUIMapNew  		map; +	AltosUIMap  		map;  	TeleGPSInfo		gps_info;  	TeleGPSState		gps_state;  	AltosInfoTable		info_table; @@ -173,7 +174,7 @@ public class TeleGPS  	}  	void load_maps() { -		new AltosUIMapPreloadNew(this); +		new AltosUIMapPreload(this);  	}  	void disconnect() { @@ -186,12 +187,43 @@ public class TeleGPS  		disable_rate_menu();  	} -	void connect(AltosDevice device) { -		if (reader != null) -			disconnect(); +	void connect_flight(AltosDevice device) {  		try {  			AltosFlightReader	reader = new AltosTelemetryReader(new AltosSerial(device)); -			set_reader(reader, device); +			set_reader(reader, device, false); +		} catch (FileNotFoundException ee) { +			JOptionPane.showMessageDialog(this, +						      ee.getMessage(), +						      String.format ("Cannot open %s", device.toShortString()), +						      JOptionPane.ERROR_MESSAGE); +		} catch (AltosSerialInUseException si) { +			JOptionPane.showMessageDialog(this, +						      String.format("Device \"%s\" already in use", +								    device.toShortString()), +						      "Device in use", +						      JOptionPane.ERROR_MESSAGE); +		} catch (IOException ee) { +			JOptionPane.showMessageDialog(this, +						      String.format ("Unknown I/O error on %s", device.toShortString()), +						      "Unknown I/O error", +						      JOptionPane.ERROR_MESSAGE); +		} catch (TimeoutException te) { +			JOptionPane.showMessageDialog(this, +						      String.format ("Timeout on %s", device.toShortString()), +						      "Timeout error", +						      JOptionPane.ERROR_MESSAGE); +		} catch (InterruptedException ie) { +			JOptionPane.showMessageDialog(this, +						      String.format("Interrupted %s", device.toShortString()), +						      "Interrupted exception", +						      JOptionPane.ERROR_MESSAGE); +		} +	} + +	void connect_idle(AltosDevice device) { +		try { +       			AltosFlightReader	reader = new AltosIdleReader(new AltosSerial(device), false); +			set_reader(reader, device, true);  		} catch (FileNotFoundException ee) {  			JOptionPane.showMessageDialog(this,  						      ee.getMessage(), @@ -221,9 +253,18 @@ public class TeleGPS  		}  	} +	void connect(AltosDevice device) { +		if (reader != null) +			disconnect(); +		if (device.matchProduct(AltosLib.product_basestation)) +			connect_flight(device); +		else +			connect_idle(device); +	} +  	void connect() {  		AltosDevice	device = AltosDeviceUIDialog.show(this, -								  AltosLib.product_basestation); +								  AltosLib.product_any);  		if (device == null)  			return;  		connect(device); @@ -397,7 +438,8 @@ public class TeleGPS  	} -	public void set_reader(AltosFlightReader reader, AltosDevice device) { +	public void set_reader(AltosFlightReader reader, AltosDevice device, boolean idle_mode) { +		this.idle_mode = idle_mode;  		status_update = new TeleGPSStatusUpdate(telegps_status);  		telegps_status.start(status_update); @@ -407,8 +449,13 @@ public class TeleGPS  		thread.start();  		if (device != null) { -			enable_frequency_menu(device.getSerial(), reader); -			enable_rate_menu(device.getSerial(), reader); +			if (idle_mode) { +				disable_frequency_menu(); +				disable_rate_menu(); +			} else { +				enable_frequency_menu(device.getSerial(), reader); +				enable_rate_menu(device.getSerial(), reader); +			}  		}  	} @@ -520,7 +567,7 @@ public class TeleGPS  		/* Make the tabbed pane use the rest of the window space */  		bag.add(pane, constraints(0, 3, GridBagConstraints.BOTH)); -		map = new AltosUIMapNew(); +		map = new AltosUIMap();  		pane.add(map.getName(), map);  		displays.add(map); @@ -554,9 +601,9 @@ public class TeleGPS  		add_window();  	} -	public TeleGPS(AltosFlightReader reader) { +	public TeleGPS(AltosFlightReader reader, boolean idle_mode) {  		this(); -		set_reader(reader, null); +		set_reader(reader, null, idle_mode);  	}  	public TeleGPS(AltosDevice device) { @@ -602,7 +649,7 @@ public class TeleGPS  		if (new_reader == null)  			return false; -		new TeleGPS(new_reader); +		new TeleGPS(new_reader, true);  		return true;  	} diff --git a/telegps/TeleGPSConfig.java b/telegps/TeleGPSConfig.java index daef1cac..f8bb1cf1 100644 --- a/telegps/TeleGPSConfig.java +++ b/telegps/TeleGPSConfig.java @@ -22,8 +22,8 @@ import javax.swing.*;  import java.io.*;  import java.util.concurrent.*;  import java.text.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class TeleGPSConfig implements ActionListener { diff --git a/telegps/TeleGPSConfigUI.java b/telegps/TeleGPSConfigUI.java index 0f8a3d25..fcba6195 100644 --- a/telegps/TeleGPSConfigUI.java +++ b/telegps/TeleGPSConfigUI.java @@ -22,8 +22,8 @@ import java.awt.*;  import java.awt.event.*;  import javax.swing.*;  import javax.swing.event.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class TeleGPSConfigUI  	extends AltosUIDialog @@ -854,7 +854,7 @@ public class TeleGPSConfigUI  	}  	String get_tracker_motion_label() { -		return String.format("Logging Trigger Motion (%s):", AltosConvert.height.show_units()); +		return String.format("Logging Trigger Motion (%s):", AltosConvert.height.parse_units());  	}  	void set_tracker_tool_tip() { diff --git a/telegps/TeleGPSDisplayThread.java b/telegps/TeleGPSDisplayThread.java index e44b4fed..0daccc20 100644 --- a/telegps/TeleGPSDisplayThread.java +++ b/telegps/TeleGPSDisplayThread.java @@ -21,8 +21,8 @@ import java.awt.*;  import javax.swing.*;  import java.io.*;  import java.text.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class TeleGPSDisplayThread extends Thread { diff --git a/telegps/TeleGPSGraphUI.java b/telegps/TeleGPSGraphUI.java index 233c8c1a..8e2f6627 100644 --- a/telegps/TeleGPSGraphUI.java +++ b/telegps/TeleGPSGraphUI.java @@ -26,8 +26,8 @@ import javax.swing.*;  import java.io.*;  import java.util.concurrent.*;  import java.util.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  import org.jfree.chart.ChartPanel;  import org.jfree.chart.JFreeChart; @@ -38,7 +38,7 @@ public class TeleGPSGraphUI extends AltosUIFrame  	JTabbedPane		pane;  	AltosGraph		graph;  	AltosUIEnable		enable; -	AltosUIMapNew		map; +	AltosUIMap		map;  	AltosState		state;  	AltosFlightStats	stats;  	AltosGraphDataSet	graphDataSet; @@ -69,7 +69,7 @@ public class TeleGPSGraphUI extends AltosUIFrame  		graph = new AltosGraph(enable, stats, graphDataSet);  		statsTable = new AltosFlightStatsTable(stats); -		map = new AltosUIMapNew(); +		map = new AltosUIMap();  		pane.add("Graph", graph.panel);  		pane.add("Configure Graph", enable); diff --git a/telegps/TeleGPSInfo.java b/telegps/TeleGPSInfo.java index 590f1d1a..e17bdbaa 100644 --- a/telegps/TeleGPSInfo.java +++ b/telegps/TeleGPSInfo.java @@ -21,8 +21,8 @@ import java.util.*;  import java.awt.*;  import java.awt.event.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class TeleGPSInfo extends AltosUIFlightTab { diff --git a/telegps/TeleGPSPreferences.java b/telegps/TeleGPSPreferences.java index c03b42d3..2a5b2b69 100644 --- a/telegps/TeleGPSPreferences.java +++ b/telegps/TeleGPSPreferences.java @@ -22,7 +22,7 @@ import java.awt.event.*;  import java.beans.*;  import javax.swing.*;  import javax.swing.event.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altosuilib_11.*;  public class TeleGPSPreferences  	extends AltosUIConfigure diff --git a/telegps/TeleGPSState.java b/telegps/TeleGPSState.java index 46e48fc4..e01ef47e 100644 --- a/telegps/TeleGPSState.java +++ b/telegps/TeleGPSState.java @@ -21,8 +21,8 @@ import java.util.*;  import java.awt.*;  import java.awt.event.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class TeleGPSState extends AltosUIFlightTab { @@ -136,10 +136,13 @@ public class TeleGPSState extends AltosUIFlightTab {  	class FlightLogMax extends AltosUIIndicator {  		public void show(AltosState state, AltosListenerState listener_state) { -			if (state.flight_log_max == AltosLib.MISSING) +			int storage = state.flight_log_max; +			if (storage == AltosLib.MISSING) +				storage = state.log_space >> 10; +			if (storage == AltosLib.MISSING)  				show("Missing");  			else -				show(String.format("%dkB", state.flight_log_max)); +				show(String.format("%dkB", storage));  		}  		public FlightLogMax(Container container, int y) { diff --git a/telegps/TeleGPSStatus.java b/telegps/TeleGPSStatus.java index 81a1b305..765a8ce4 100644 --- a/telegps/TeleGPSStatus.java +++ b/telegps/TeleGPSStatus.java @@ -19,8 +19,8 @@ package org.altusmetrum.telegps;  import java.awt.*;  import javax.swing.*; -import org.altusmetrum.altoslib_10.*; -import org.altusmetrum.altosuilib_10.*; +import org.altusmetrum.altoslib_11.*; +import org.altusmetrum.altosuilib_11.*;  public class TeleGPSStatus extends JComponent implements AltosFlightDisplay {  	GridBagLayout	layout; diff --git a/telegps/TeleGPSStatusUpdate.java b/telegps/TeleGPSStatusUpdate.java index 6740ff70..6cd440c5 100644 --- a/telegps/TeleGPSStatusUpdate.java +++ b/telegps/TeleGPSStatusUpdate.java @@ -18,7 +18,7 @@  package org.altusmetrum.telegps;  import java.awt.event.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_11.*;  public class TeleGPSStatusUpdate implements ActionListener { | 
