diff options
| author | Keith Packard <keithp@keithp.com> | 2014-09-06 00:14:26 -0700 | 
|---|---|---|
| committer | Keith Packard <keithp@keithp.com> | 2014-09-06 00:37:57 -0700 | 
| commit | 18671803d078aa798b603c67b741c3ba4374f41d (patch) | |
| tree | be3f576695b1f0bc0691aa2038b82cc60433ec1a | |
| parent | 2b2ebd2fee46158abd1ae050cd6d1040ead849a0 (diff) | |
altosdroid: Add imperial unit support
Provides a menu entry to switch units, changes all value displays to
use the AltosLib units conversion code.
Signed-off-by: Keith Packard <keithp@keithp.com>
| -rw-r--r-- | altosdroid/Notebook | 2 | ||||
| -rw-r--r-- | altosdroid/res/menu/option_menu.xml | 3 | ||||
| -rw-r--r-- | altosdroid/res/values/strings.xml | 1 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java | 19 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java | 3 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java | 27 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java | 18 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java | 13 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java | 8 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java | 11 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java | 2 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java | 4 | ||||
| -rw-r--r-- | altoslib/AltosPreferences.java | 4 | 
13 files changed, 79 insertions, 36 deletions
| diff --git a/altosdroid/Notebook b/altosdroid/Notebook index ebb3578d..e6116836 100644 --- a/altosdroid/Notebook +++ b/altosdroid/Notebook @@ -29,4 +29,6 @@ Desired AltosDroid feature list   *) Imperial Units mode +	Done +   *) TeleBT battery voltage diff --git a/altosdroid/res/menu/option_menu.xml b/altosdroid/res/menu/option_menu.xml index 4321d6e7..3bd5a54e 100644 --- a/altosdroid/res/menu/option_menu.xml +++ b/altosdroid/res/menu/option_menu.xml @@ -26,4 +26,7 @@      <item android:id="@+id/select_rate"            android:icon="@android:drawable/ic_menu_preferences"            android:title="@string/select_rate" /> +    <item android:id="@+id/change_units" +	  android:icon="@android:drawable/ic_menu_view" +	  android:title="@string/change_units" />  </menu> diff --git a/altosdroid/res/values/strings.xml b/altosdroid/res/values/strings.xml index 6ea9fec2..0cc99349 100644 --- a/altosdroid/res/values/strings.xml +++ b/altosdroid/res/values/strings.xml @@ -30,6 +30,7 @@  	<string name="quit">Quit</string>  	<string name="select_freq">Select radio frequency</string>  	<string name="select_rate">Select data rate</string> +	<string name="change_units">Change units</string>  	<!-- DeviceListActivity -->  	<string name="scanning">scanning for devices…</string> diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java index d276798e..f6cceac9 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java @@ -54,7 +54,7 @@ import android.location.Location;  import org.altusmetrum.altoslib_5.*; -public class AltosDroid extends FragmentActivity { +public class AltosDroid extends FragmentActivity implements AltosUnitsListener {  	// Debugging  	static final String TAG = "AltosDroid";  	static final boolean D = true; @@ -187,6 +187,11 @@ public class AltosDroid extends FragmentActivity {  		mTabs.remove(mTab);  	} +	public void units_changed(boolean imperial_units) { +		for (AltosDroidTab mTab : mTabs) +			mTab.units_changed(imperial_units); +	} +  	void update_title(TelemetryState telemetry_state) {  		switch (telemetry_state.connect) {  		case TelemetryState.CONNECT_CONNECTED: @@ -226,7 +231,15 @@ public class AltosDroid extends FragmentActivity {  		}  	} +	boolean	registered_units_listener; +  	void update_state(TelemetryState telemetry_state) { + +		if (!registered_units_listener) { +			registered_units_listener = true; +			AltosPreferences.register_units_listener(this); +		} +  		update_title(telemetry_state);  		update_ui(telemetry_state.state, telemetry_state.location);  		if (telemetry_state.connect == TelemetryState.CONNECT_CONNECTED) @@ -656,6 +669,10 @@ public class AltosDroid extends FragmentActivity {  			AlertDialog alert_rate = builder_rate.create();  			alert_rate.show();  			return true; +		case R.id.change_units: +			boolean	imperial = AltosPreferences.imperial_units(); +			AltosPreferences.set_imperial_units(!imperial); +			return true;  		}  		return false;  	} diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java index 72b8488b..9cef1319 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java @@ -27,6 +27,9 @@ public class AltosDroidPreferences extends AltosPreferences {  	static String active_device_address;  	public static void init(Context context) { +		if (backend != null) +			return; +  		AltosPreferences.init(new AltosDroidPreferencesBackend(context));  		active_device_address = backend.getString(activeDevicePreference, null); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java index 7b5b01b3..8e625da6 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java @@ -27,8 +27,9 @@ import android.support.v4.app.FragmentTransaction;  import android.support.v4.app.FragmentManager;  import android.location.Location;  import android.util.Log; +import android.widget.TextView; -public abstract class AltosDroidTab extends Fragment { +public abstract class AltosDroidTab extends Fragment implements AltosUnitsListener {  	AltosState		last_state;  	AltosGreatCircle	last_from_receiver;  	Location		last_receiver; @@ -37,6 +38,21 @@ public abstract class AltosDroidTab extends Fragment {  	public abstract String tab_name(); +	public void units_changed(boolean imperial_units) { +		if (!isHidden() && last_state != null) +			show(last_state, last_from_receiver, last_receiver); +	} + +	public void set_value(TextView text_view, +			      AltosUnits units, +			      int width, +			      double value) { +		if (value == AltosLib.MISSING) +			text_view.setText(""); +		else +			text_view.setText(units.show(width, value)); +	} +  	public void set_visible(boolean visible) {  		FragmentTransaction	ft = AltosDroid.fm.beginTransaction();  		if (visible) { @@ -44,9 +60,6 @@ public abstract class AltosDroidTab extends Fragment {  			AltosGreatCircle	from_receiver = last_from_receiver;  			Location		receiver = last_receiver; -			last_state = null; -			last_from_receiver = null; -			last_receiver = null;  			show(state, from_receiver, receiver);  			ft.show(this);  		} else @@ -55,15 +68,15 @@ public abstract class AltosDroidTab extends Fragment {  	}  	public void update_ui(AltosState state, AltosGreatCircle from_receiver, Location receiver, boolean is_current) { +		last_state = state; +		last_from_receiver = from_receiver; +		last_receiver = receiver;  		if (is_current) {  			if (AltosDroid.D) Log.d(AltosDroid.TAG, String.format("%s: visible, performing update", tab_name()));  			show(state, from_receiver, receiver);  		} else {  			if (AltosDroid.D) Log.d(AltosDroid.TAG, String.format("%s: not visible, skipping update", tab_name())); -			last_state = state; -			last_from_receiver = from_receiver; -			last_receiver = receiver;  			return;  		}  	} diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java index b8def367..969992d3 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java @@ -68,12 +68,14 @@ public class AltosVoice {  			if ((old_state == null || old_state.state <= AltosLib.ao_flight_boost) &&  			    state.state > AltosLib.ao_flight_boost) {  				if (state.max_speed() != AltosLib.MISSING) -					speak(String.format("max speed: %d meters per second.", (int) (state.max_speed() + 0.5))); +					speak(String.format("Max speed: %s.", +							    AltosConvert.speed.say_units(state.max_speed())));  				spoke = true;  			} else if ((old_state == null || old_state.state < AltosLib.ao_flight_drogue) &&  			           state.state >= AltosLib.ao_flight_drogue) {  				if (state.max_height() != AltosLib.MISSING) -					speak(String.format("max height: %d meters.", (int) (state.max_height() + 0.5))); +					speak(String.format("Max height: %s.", +							    AltosConvert.height.say_units(state.max_height())));  				spoke = true;  			}  		} @@ -126,17 +128,17 @@ public class AltosVoice {  					position = state.from_pad;  				if (position != null) { -					speak(String.format("Height %d, bearing %s %d, elevation %d, range %d.\n", -							    (int) (state.height() + 0.5), +					speak(String.format("Height %s, bearing %s %d, elevation %d, range %s.\n", +							    AltosConvert.height.say_units(state.height()),  							    position.bearing_words(  								    AltosGreatCircle.BEARING_VOICE),  							    (int) (position.bearing + 0.5),  							    (int) (position.elevation + 0.5), -							    (int) (position.range + 0.5))); +							    AltosConvert.distance.say_units(position.range)));  				}  			} else if (state.state > AltosLib.ao_flight_pad) {  				if (state.height() != AltosLib.MISSING) -					speak(String.format("%d meters", (int) (state.height() + 0.5))); +					speak(AltosConvert.height.say_units(state.height()));  			} else {  				reported_landing = 0;  			} @@ -155,9 +157,9 @@ public class AltosVoice {  				else  					speak("rocket may have crashed");  				if (state.from_pad != null) -					speak(String.format("Bearing %d degrees, range %d meters.", +					speak(String.format("Bearing %d degrees, range %s.",  					                    (int) (state.from_pad.bearing + 0.5), -					                    (int) (state.from_pad.distance + 0.5))); +							    AltosConvert.distance.say_units(state.from_pad.distance)));  				++reported_landing;  			}  		} diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java index c146c277..fa4e3c8b 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java @@ -91,12 +91,13 @@ public class TabAscent extends AltosDroidTab {  	public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) {  		if (state != null) { -			mHeightView.setText(AltosDroid.number("%6.0f m", state.height())); -			mMaxHeightView.setText(AltosDroid.number("%6.0f m", state.max_height())); -			mSpeedView.setText(AltosDroid.number("%6.0f m/s", state.speed())); -			mMaxSpeedView.setText(AltosDroid.number("%6.0f m/s", state.max_speed())); -			mAccelView.setText(AltosDroid.number("%6.0f m/s²", state.acceleration())); -			mMaxAccelView.setText(AltosDroid.number("%6.0f m/s²", state.max_acceleration())); +			set_value(mHeightView, AltosConvert.height, 6, state.height()); +			set_value(mHeightView, AltosConvert.height, 6, state.height()); +			set_value(mMaxHeightView, AltosConvert.height, 6, state.max_height()); +			set_value(mSpeedView, AltosConvert.speed, 6, state.speed()); +			set_value(mMaxSpeedView, AltosConvert.speed, 6, state.max_speed()); +			set_value(mAccelView, AltosConvert.accel, 6, state.acceleration()); +			set_value(mMaxAccelView, AltosConvert.accel, 6, state.max_acceleration());  			if (state.gps != null) {  				mLatitudeView.setText(AltosDroid.pos(state.gps.lat, "N", "S")); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java index 6d781efd..28068666 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java @@ -93,14 +93,14 @@ public class TabDescent extends AltosDroidTab {  	public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) {  		if (state != null) { -			mSpeedView.setText(AltosDroid.number("%6.0f m/s", state.speed())); -			mHeightView.setText(AltosDroid.number("%6.0f m", state.height())); +			set_value(mSpeedView, AltosConvert.speed, 6, state.speed()); +			set_value(mHeightView, AltosConvert.height, 6, state.height());  			if (from_receiver != null) {  				mElevationView.setText(AltosDroid.number("%3.0f°", from_receiver.elevation)); -				mRangeView.setText(AltosDroid.number("%6.0f m", from_receiver.range)); +				set_value(mRangeView, AltosConvert.distance, 6, from_receiver.range);  				mBearingView.setText(AltosDroid.number("%3.0f°", from_receiver.bearing));  				mCompassView.setText(from_receiver.bearing_words(AltosGreatCircle.BEARING_LONG)); -				mDistanceView.setText(AltosDroid.number("%6.0f m", from_receiver.distance)); +				set_value(mDistanceView, AltosConvert.distance, 6, from_receiver.distance);  			} else {   				mElevationView.setText("<unknown>");  				mRangeView.setText("<unknown>"); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java index 32c235e1..b257b936 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java @@ -78,7 +78,7 @@ public class TabLanded extends AltosDroidTab {  	public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) {  		if (from_receiver != null) {  			mBearingView.setText(String.format("%3.0f°", from_receiver.bearing)); -			mDistanceView.setText(String.format("%6.0f m", from_receiver.distance)); +			set_value(mDistanceView, AltosConvert.distance, 6, from_receiver.distance);  		}  		if (state != null && state.gps != null) {  			mTargetLatitudeView.setText(AltosDroid.pos(state.gps.lat, "N", "S")); @@ -91,12 +91,9 @@ public class TabLanded extends AltosDroidTab {  		}  		if (state != null) { -			mMaxHeightView.setText(String.format("%6.0f m", state.max_height())); -			if (state.max_acceleration() != AltosLib.MISSING) -				mMaxAccelView.setText(String.format("%6.0f m/s²", state.max_acceleration())); -			else -				mMaxAccelView.setText("missing"); -			mMaxSpeedView.setText(String.format("%6.0f m/s", state.max_speed())); +			set_value(mMaxHeightView, AltosConvert.height, 6, state.max_height()); +			set_value(mMaxAccelView, AltosConvert.accel, 6, state.max_acceleration()); +			set_value(mMaxSpeedView, AltosConvert.speed, 6, state.max_speed());  		}  	}  } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java index 811e5482..ab338ac2 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java @@ -158,7 +158,7 @@ public class TabMap extends AltosDroidTab {  	public void show(AltosState state, AltosGreatCircle from_receiver, Location receiver) {  		if (from_receiver != null) {  			mBearingView.setText(String.format("%3.0f°", from_receiver.bearing)); -			mDistanceView.setText(String.format("%6.0f m", from_receiver.distance)); +			set_value(mDistanceView, AltosConvert.distance, 6, from_receiver.distance);  		}  		if (state != null) { diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java index 1068fa46..32df71d7 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java @@ -159,12 +159,12 @@ public class TabPad extends AltosDroidTab {  		}  		if (receiver != null) { -			double altitude = 0; +			double altitude = AltosLib.MISSING;  			if (receiver.hasAltitude())  				altitude = receiver.getAltitude();  			mPadLatitudeView.setText(AltosDroid.pos(receiver.getLatitude(), "N", "S"));  			mPadLongitudeView.setText(AltosDroid.pos(receiver.getLongitude(), "W", "E")); -			mPadAltitudeView.setText(AltosDroid.number("%4.0f m", altitude)); +			set_value(mPadAltitudeView, AltosConvert.height, 6, altitude);  		}  	} diff --git a/altoslib/AltosPreferences.java b/altoslib/AltosPreferences.java index af87b213..dba57dcb 100644 --- a/altoslib/AltosPreferences.java +++ b/altoslib/AltosPreferences.java @@ -157,6 +157,10 @@ public class AltosPreferences {  	public static int launcher_channel;  	public static void init(AltosPreferencesBackend in_backend) { + +		if (backend != null) +			return; +  		backend = in_backend;  		/* Initialize logdir from preferences */ | 
