summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2014-09-06 00:14:26 -0700
committerKeith Packard <keithp@keithp.com>2014-09-06 00:37:57 -0700
commit18671803d078aa798b603c67b741c3ba4374f41d (patch)
treebe3f576695b1f0bc0691aa2038b82cc60433ec1a
parent2b2ebd2fee46158abd1ae050cd6d1040ead849a0 (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/Notebook2
-rw-r--r--altosdroid/res/menu/option_menu.xml3
-rw-r--r--altosdroid/res/values/strings.xml1
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java19
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidPreferences.java3
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java27
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/AltosVoice.java18
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java13
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java8
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java11
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java2
-rw-r--r--altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java4
-rw-r--r--altoslib/AltosPreferences.java4
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 */