diff options
author | Keith Packard <keithp@keithp.com> | 2015-06-23 21:35:43 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2015-06-23 21:42:35 -0700 |
commit | 56146cd379e1319b7adcf8e22cdda55f771e11be (patch) | |
tree | 6417550c523318e3792167a947367bfd57a606c6 | |
parent | 60b8bea12edb954e6140a92c8412364c9581e3c2 (diff) |
altosdroid: Show direction to target in recover tab
This takes the bearing to target and current direction of motion (from
the Android API) and computes a turn amount and displays that so you
don't have to know which way is north when walking towards the rocket.
Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r-- | altosdroid/res/layout/tab_recover.xml | 22 | ||||
-rw-r--r-- | altosdroid/res/values/strings.xml | 1 | ||||
-rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java | 25 | ||||
-rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java | 7 |
4 files changed, 54 insertions, 1 deletions
diff --git a/altosdroid/res/layout/tab_recover.xml b/altosdroid/res/layout/tab_recover.xml index f27baa9e..c2806629 100644 --- a/altosdroid/res/layout/tab_recover.xml +++ b/altosdroid/res/layout/tab_recover.xml @@ -42,6 +42,26 @@ <RelativeLayout android:layout_width="wrap_content" + android:layout_height="wrap_content" > + + <TextView + android:id="@+id/direction_label" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/direction_label" /> + + <TextView + android:id="@+id/direction_value" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentRight="true" + android:layout_below="@+id/direction_label" + android:text="" + android:textAppearance="?android:attr/textAppearanceSmall" /> + </RelativeLayout> + + <RelativeLayout + android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="5dp" > @@ -208,4 +228,4 @@ android:textAppearance="?android:attr/textAppearanceSmall" /> </RelativeLayout> -</LinearLayout>
\ No newline at end of file +</LinearLayout> diff --git a/altosdroid/res/values/strings.xml b/altosdroid/res/values/strings.xml index 5a9d9629..8c299a35 100644 --- a/altosdroid/res/values/strings.xml +++ b/altosdroid/res/values/strings.xml @@ -69,6 +69,7 @@ <string name="speed_label">Speed</string> <string name="accel_label">Acceleration</string> <string name="bearing_label">Bearing</string> + <string name="direction_label">Direction</string> <string name="elevation_label">Elevation</string> <string name="range_label">Range</string> <string name="distance_label">Distance</string> diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java index 6cd9463a..f1da27d8 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java @@ -990,4 +990,29 @@ public class AltosDroid extends FragmentActivity implements AltosUnitsListener { } return false; } + + static String direction(AltosGreatCircle from_receiver, + Location receiver) { + if (!receiver.hasBearing()) + return null; + + float bearing = receiver.getBearing(); + float heading = (float) from_receiver.bearing - bearing; + + while (heading <= -180.0f) + heading += 360.0f; + while (heading > 180.0f) + heading -= 360.0f; + + int iheading = (int) (heading + 0.5f); + + if (-1 < iheading && iheading < 1) + return "ahead"; + else if (iheading < -179 || 179 < iheading) + return "backwards"; + else if (iheading < 0) + return String.format("left %d", -iheading); + else + return String.format("right %d", iheading); + } } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java index 0ab20f5f..cb394dbe 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabRecover.java @@ -30,6 +30,7 @@ import android.location.Location; public class TabRecover extends AltosDroidTab { private TextView mBearingView; + private TextView mDirectionView; private TextView mDistanceView; private TextView mTargetLatitudeView; private TextView mTargetLongitudeView; @@ -44,6 +45,7 @@ public class TabRecover extends AltosDroidTab { View v = inflater.inflate(R.layout.tab_recover, container, false); mBearingView = (TextView) v.findViewById(R.id.bearing_value); + mDirectionView = (TextView) v.findViewById(R.id.direction_value); mDistanceView = (TextView) v.findViewById(R.id.distance_value); mTargetLatitudeView = (TextView) v.findViewById(R.id.target_lat_value); mTargetLongitudeView = (TextView) v.findViewById(R.id.target_lon_value); @@ -62,6 +64,11 @@ public class TabRecover extends AltosDroidTab { if (from_receiver != null) { mBearingView.setText(String.format("%3.0f°", from_receiver.bearing)); set_value(mDistanceView, AltosConvert.distance, 6, from_receiver.distance); + String direction = AltosDroid.direction(from_receiver, receiver); + if (direction == null) + mDirectionView.setText(""); + else + mDirectionView.setText(direction); } if (state != null && state.gps != null) { mTargetLatitudeView.setText(AltosDroid.pos(state.gps.lat, "N", "S")); |