From 56146cd379e1319b7adcf8e22cdda55f771e11be Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 23 Jun 2015 21:35:43 -0700 Subject: [PATCH] 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 --- altosdroid/res/layout/tab_recover.xml | 22 +++++++++++++++- altosdroid/res/values/strings.xml | 1 + .../altusmetrum/AltosDroid/AltosDroid.java | 25 +++++++++++++++++++ .../altusmetrum/AltosDroid/TabRecover.java | 7 ++++++ 4 files changed, 54 insertions(+), 1 deletion(-) 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 @@ -40,6 +40,26 @@ android:textAppearance="?android:attr/textAppearanceSmall" /> + + + + + + + - \ No newline at end of file + 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 @@ Speed Acceleration Bearing + Direction Elevation Range Distance 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")); -- 2.30.2