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")); | 
