diff options
Diffstat (limited to 'altosdroid')
9 files changed, 73 insertions, 37 deletions
diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java index c9ce46a0..b1d080db 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroid.java @@ -47,6 +47,7 @@ import android.widget.TabHost;  import android.widget.TextView;  import android.widget.Toast;  import android.app.AlertDialog; +import android.location.Location;  import org.altusmetrum.altoslib_1.*; @@ -59,6 +60,8 @@ public class AltosDroid extends FragmentActivity {  	public static final int MSG_STATE_CHANGE    = 1;  	public static final int MSG_TELEMETRY       = 2;  	public static final int MSG_UPDATE_AGE      = 3; +	public static final int MSG_LOCATION	    = 4; +	public static final int MSG_CRC_ERROR	    = 5;  	// Intent request codes  	private static final int REQUEST_CONNECT_DEVICE = 1; @@ -87,6 +90,7 @@ public class AltosDroid extends FragmentActivity {  	// Timer and Saved flight state for Age calculation  	private Timer timer = new Timer();  	AltosState saved_state; +	Location saved_location;  	// Service  	private boolean mIsBound   = false; @@ -137,6 +141,10 @@ public class AltosDroid extends FragmentActivity {  			case MSG_TELEMETRY:  				ad.update_ui((AltosState) msg.obj);  				break; +			case MSG_LOCATION: +				ad.set_location((Location) msg.obj); +				break; +			case MSG_CRC_ERROR:  			case MSG_UPDATE_AGE:  				if (ad.saved_state != null) {  					ad.mAgeView.setText(String.format("%d", (System.currentTimeMillis() - ad.saved_state.report_time + 500) / 1000)); @@ -196,6 +204,13 @@ public class AltosDroid extends FragmentActivity {  		mTabs.remove(mTab);  	} +	void set_location(Location location) { +		saved_location = location; +		if (saved_state != null) { +			update_ui(saved_state); +		} +	} +  	void update_ui(AltosState state) {  		if (saved_state != null) {  			if (saved_state.state != state.state) { @@ -215,6 +230,17 @@ public class AltosDroid extends FragmentActivity {  		}  		saved_state = state; +		AltosGreatCircle from_receiver = null; + +		if (saved_location != null && state.gps != null && state.gps.locked) { +			from_receiver = new AltosGreatCircle(saved_location.getLatitude(), +							     saved_location.getLongitude(), +							     saved_location.getAltitude(), +							     state.gps.lat, +							     state.gps.lon, +							     state.gps.alt); +		} +  		mCallsignView.setText(state.data.callsign);  		mSerialView.setText(String.format("%d", state.data.serial));  		mFlightView.setText(String.format("%d", state.data.flight)); @@ -222,7 +248,7 @@ public class AltosDroid extends FragmentActivity {  		mRSSIView.setText(String.format("%d", state.data.rssi));  		for (AltosDroidTab mTab : mTabs) -			mTab.update_ui(state); +			mTab.update_ui(state, from_receiver);  		mAltosVoice.tell(state);  	} diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java index 68bbe593..2b5cdae7 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/AltosDroidTab.java @@ -17,8 +17,8 @@  package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_1.AltosState; +import org.altusmetrum.altoslib_1.*;  public interface AltosDroidTab { -	public void update_ui(AltosState state); +	public void update_ui(AltosState state, AltosGreatCircle from_receiver);  } diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java index bda6b1fd..ce677c57 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabAscent.java @@ -17,7 +17,7 @@  package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_1.AltosState; +import org.altusmetrum.altoslib_1.*;  import android.app.Activity;  import android.os.Bundle; @@ -84,7 +84,7 @@ public class TabAscent extends Fragment implements AltosDroidTab {  		mAltosDroid = null;  	} -	public void update_ui(AltosState state) { +	public void update_ui(AltosState state, AltosGreatCircle from_receiver) {  		mHeightView.setText(String.format("%6.0f m", state.height));  		mMaxHeightView.setText(String.format("%6.0f m", state.max_height));  		mSpeedView.setText(String.format("%6.0f m/s", state.speed())); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java index 3805b7e7..b0c6539c 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabDescent.java @@ -17,8 +17,7 @@  package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_1.AltosGreatCircle; -import org.altusmetrum.altoslib_1.AltosState; +import org.altusmetrum.altoslib_1.*;  import android.app.Activity;  import android.os.Bundle; @@ -89,16 +88,22 @@ public class TabDescent extends Fragment implements AltosDroidTab {  		mAltosDroid = null;  	} -	public void update_ui(AltosState state) { +	public void update_ui(AltosState state, AltosGreatCircle from_receiver) {  		mSpeedView.setText(String.format("%6.0f m/s", state.speed()));  		mHeightView.setText(String.format("%6.0f m", state.height)); -		mElevationView.setText(String.format("%3.0f°", state.elevation)); -		mRangeView.setText(String.format("%6.0f m", state.range)); -		if (state.from_pad != null) { -			mBearingView.setText(String.format("%3.0f°", state.from_pad.bearing)); -			mCompassView.setText(state.from_pad.bearing_words(AltosGreatCircle.BEARING_LONG)); +		if (from_receiver != null) { +			mElevationView.setText(String.format("%3.0f°", from_receiver.elevation)); +			mRangeView.setText(String.format("%6.0f m", from_receiver.range)); +			mBearingView.setText(String.format("%3.0f°", from_receiver.bearing)); +			mCompassView.setText(from_receiver.bearing_words(AltosGreatCircle.BEARING_LONG)); +			mDistanceView.setText(String.format("%6.0f m", from_receiver.distance)); +		} else {  +			mElevationView.setText("<unknown>"); +			mRangeView.setText("<unknown>"); +			mBearingView.setText("<unknown>"); +			mCompassView.setText("<unknown>"); +			mDistanceView.setText("<unknown>");  		} -		mDistanceView.setText(String.format("%6.0f m", state.range));  		mLatitudeView.setText(AltosDroid.pos(state.gps.lat, "N", "S"));  		mLongitudeView.setText(AltosDroid.pos(state.gps.lon, "W", "E")); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java index a95e9145..93a42334 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabLanded.java @@ -17,7 +17,7 @@  package org.altusmetrum.AltosDroid; -import org.altusmetrum.altoslib_1.AltosState; +import org.altusmetrum.altoslib_1.*;  import android.app.Activity;  import android.os.Bundle; @@ -68,10 +68,10 @@ public class TabLanded extends Fragment implements AltosDroidTab {  		mAltosDroid = null;  	} -	public void update_ui(AltosState state) { -		if (state.from_pad != null) { -			mBearingView.setText(String.format("%3.0f°", state.from_pad.bearing)); -			mDistanceView.setText(String.format("%6.0f m", state.from_pad.distance)); +	public void update_ui(AltosState state, AltosGreatCircle from_receiver) { +		if (from_receiver != null) { +			mBearingView.setText(String.format("%3.0f°", from_receiver.bearing)); +			mDistanceView.setText(String.format("%6.0f m", from_receiver.distance));  		}  		mLatitudeView.setText(AltosDroid.pos(state.gps.lat, "N", "S"));  		mLongitudeView.setText(AltosDroid.pos(state.gps.lon, "W", "E")); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java index 8fc8f592..607ded46 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabMap.java @@ -139,7 +139,7 @@ public class TabMap extends Fragment implements AltosDroidTab {  		}  	} -	public void update_ui(AltosState state) { +	public void update_ui(AltosState state, AltosGreatCircle from_receiver) {  		if (state.from_pad != null) {  			mDistanceView.setText(String.format("%6.0f m", state.from_pad.distance));  			mBearingView.setText(String.format("%3.0f°", state.from_pad.bearing)); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java index 41776c10..6906324d 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TabPad.java @@ -100,7 +100,7 @@ public class TabPad extends Fragment implements AltosDroidTab {  		mAltosDroid = null;  	} -	public void update_ui(AltosState state) { +	public void update_ui(AltosState state, AltosGreatCircle from_receiver) {  		mBatteryVoltageView.setText(String.format("%4.2f V", state.battery));  		mBatteryLights.set(state.battery > 3.7); diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java index fb07442e..716ec589 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java @@ -36,7 +36,6 @@ public class TelemetryReader extends Thread {  	Handler     handler;
 -	TelemetryService service;
  	AltosLink   link;
  	AltosRecord previous;
 @@ -69,12 +68,12 @@ public class TelemetryReader extends Thread {  					if (record == null)
  						break;
  					state = new AltosState(record, state);
 -					service.sendTelemetry(state);
 +					handler.obtainMessage(TelemetryService.MSG_TELEMETRY, state).sendToTarget();
  				} catch (ParseException pp) {
  					Log.e(TAG, String.format("Parse error: %d \"%s\"", pp.getErrorOffset(), pp.getMessage()));
  				} catch (AltosCRCException ce) {
  					++crc_errors;
 -					service.sendCrcErrors(crc_errors);
 +					handler.obtainMessage(TelemetryService.MSG_CRC_ERROR, new Integer(crc_errors)).sendToTarget();
  				}
  			}
  		} catch (InterruptedException ee) {
 @@ -84,8 +83,7 @@ public class TelemetryReader extends Thread {  		}
  	}
 -	public TelemetryReader (TelemetryService in_service, AltosLink in_link, Handler in_handler) {
 -		service = in_service;
 +	public TelemetryReader (AltosLink in_link, Handler in_handler) {
  		link    = in_link;
  		handler = in_handler;
 diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java index e6854585..0ddfdfc3 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java @@ -45,10 +45,10 @@ import android.location.LocationListener;  import org.altusmetrum.altoslib_1.*;  class AltosLocationListener implements LocationListener { -	TelemetryService service; +	Handler handler;  	public void onLocationChanged(Location location) { -		service.sendLocation(location); +		handler.obtainMessage(TelemetryService.MSG_LOCATION, location).sendToTarget();  	}  	public void onStatusChanged(String provider, int status, Bundle extras) { @@ -60,8 +60,8 @@ class AltosLocationListener implements LocationListener {  	public void onProviderDisabled(String provider) {  	} -	public AltosLocationListener(TelemetryService service) { -		this.service = service; +	public AltosLocationListener(Handler handler) { +		this.handler = handler;  	}  } @@ -169,8 +169,20 @@ public class TelemetryService extends Service {  				}  				break;  			case MSG_TELEMETRY: +				// forward telemetry messages +				s.last_state = (AltosState) msg.obj;  				s.sendMessageToClients(Message.obtain(null, AltosDroid.MSG_TELEMETRY, msg.obj));  				break; +			case MSG_LOCATION: +				// forward location messages +				s.last_location = (Location) msg.obj; +				s.sendMessageToClients(Message.obtain(null, AltosDroid.MSG_LOCATION, msg.obj)); +				break; +			case MSG_CRC_ERROR: +				// forward crc error messages +				s.last_crc_errors = (Integer) msg.obj; +				s.sendMessageToClients(Message.obtain(null, AltosDroid.MSG_CRC_ERROR, msg.obj)); +				break;  			case MSG_SETFREQUENCY:  				if (s.state == STATE_CONNECTED) {  					try { @@ -187,18 +199,13 @@ public class TelemetryService extends Service {  	}  	public void sendTelemetry(AltosState state) { -		last_state = state; -		mHandler.obtainMessage(MSG_TELEMETRY, state).sendToTarget();  	}  	public void sendLocation(Location location) { -		last_location = location;  		mHandler.obtainMessage(MSG_LOCATION, location).sendToTarget();  	}  	public void sendCrcErrors(int crc_errors) { -		last_crc_errors = crc_errors; -		mHandler.obtainMessage(MSG_CRC_ERROR, new Integer(crc_errors)).sendToTarget();  	}  	private void sendMessageToClients(Message m) { @@ -278,7 +285,7 @@ public class TelemetryService extends Service {  		setState(STATE_CONNECTED); -		mTelemetryReader = new TelemetryReader(this, mAltosBluetooth, mHandler); +		mTelemetryReader = new TelemetryReader(mAltosBluetooth, mHandler);  		mTelemetryReader.start();  		mTelemetryLogger = new TelemetryLogger(this, mAltosBluetooth); @@ -308,7 +315,7 @@ public class TelemetryService extends Service {  		timer.scheduleAtFixedRate(new TimerTask(){ public void run() {onTimerTick();}}, 10000L, 10000L);  		// Listen for GPS and Network position updates -		locationListener = new AltosLocationListener(this); +		locationListener = new AltosLocationListener(mHandler);  		LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);  | 
