From 18671803d078aa798b603c67b741c3ba4374f41d Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sat, 6 Sep 2014 00:14:26 -0700 Subject: [PATCH] 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 --- altosdroid/Notebook | 2 ++ altosdroid/res/menu/option_menu.xml | 3 +++ altosdroid/res/values/strings.xml | 1 + .../altusmetrum/AltosDroid/AltosDroid.java | 19 ++++++++++++- .../AltosDroid/AltosDroidPreferences.java | 3 +++ .../altusmetrum/AltosDroid/AltosDroidTab.java | 27 ++++++++++++++----- .../altusmetrum/AltosDroid/AltosVoice.java | 18 +++++++------ .../org/altusmetrum/AltosDroid/TabAscent.java | 13 ++++----- .../altusmetrum/AltosDroid/TabDescent.java | 8 +++--- .../org/altusmetrum/AltosDroid/TabLanded.java | 11 +++----- .../org/altusmetrum/AltosDroid/TabMap.java | 2 +- .../org/altusmetrum/AltosDroid/TabPad.java | 4 +-- 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 @@ + 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 @@ Quit Select radio frequency Select data rate + Change units scanning for devices… 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(""); mRangeView.setText(""); 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 */ -- 2.30.2