diff options
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java | 8 | ||||
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java | 40 | 
2 files changed, 41 insertions, 7 deletions
| diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java index 9460bdbc..fb07442e 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java @@ -36,6 +36,7 @@ public class TelemetryReader extends Thread {  	Handler     handler;
 +	TelemetryService service;
  	AltosLink   link;
  	AltosRecord previous;
 @@ -68,12 +69,12 @@ public class TelemetryReader extends Thread {  					if (record == null)
  						break;
  					state = new AltosState(record, state);
 -
 -					handler.obtainMessage(TelemetryService.MSG_TELEMETRY, state).sendToTarget();
 +					service.sendTelemetry(state);
  				} 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);
  				}
  			}
  		} catch (InterruptedException ee) {
 @@ -83,7 +84,8 @@ public class TelemetryReader extends Thread {  		}
  	}
 -	public TelemetryReader (AltosLink in_link, Handler in_handler) {
 +	public TelemetryReader (TelemetryService in_service, AltosLink in_link, Handler in_handler) {
 +		service = in_service;
  		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 e1a5ada8..98b7d32f 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryService.java @@ -45,9 +45,11 @@ import android.location.LocationListener;  import org.altusmetrum.altoslib_1.*;  class AltosLocationListener implements LocationListener { +	TelemetryService service;  	boolean	fine;  	public void onLocationChanged(Location location) { +		service.sendLocation(location);  	}  	public void onStatusChanged(String provider, int status, Bundle extras) { @@ -59,8 +61,9 @@ class AltosLocationListener implements LocationListener {  	public void onProviderDisabled(String provider) {  	} -	public AltosLocationListener(boolean fine) { +	public AltosLocationListener(TelemetryService service, boolean fine) {  		this.fine = fine; +		this.service = service;  	}  } @@ -77,6 +80,8 @@ public class TelemetryService extends Service {  	static final int MSG_DISCONNECTED      = 6;  	static final int MSG_TELEMETRY         = 7;  	static final int MSG_SETFREQUENCY      = 8; +	static final int MSG_LOCATION	       = 9; +	static final int MSG_CRC_ERROR	       = 10;  	public static final int STATE_NONE       = 0;  	public static final int STATE_READY      = 1; @@ -110,6 +115,12 @@ public class TelemetryService extends Service {  	private AltosLocationListener gpsListener;  	private AltosLocationListener netListener; +	// Last data seen; send to UI when it starts + +	private AltosState last_state; +	private Location last_location; +	private int last_crc_errors; +  	// Handler of incoming messages from clients.  	static class IncomingHandler extends Handler {  		private final WeakReference<TelemetryService> service; @@ -129,6 +140,12 @@ public class TelemetryService extends Service {  					s.mClients.remove(msg.replyTo);  				}  				if (D) Log.d(TAG, "Client bound to service"); +				if (s.last_state != null) +					s.sendTelemetry(s.last_state); +				if (s.last_location != null) +					s.sendLocation(s.last_location); +				if (s.last_crc_errors != 0) +					s.sendCrcErrors(s.last_crc_errors);  				break;  			case MSG_UNREGISTER_CLIENT:  				s.mClients.remove(msg.replyTo); @@ -172,6 +189,21 @@ 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) {  		for (int i=mClients.size()-1; i>=0; i--) {  			try { @@ -249,7 +281,7 @@ public class TelemetryService extends Service {  		setState(STATE_CONNECTED); -		mTelemetryReader = new TelemetryReader(mAltosBluetooth, mHandler); +		mTelemetryReader = new TelemetryReader(this, mAltosBluetooth, mHandler);  		mTelemetryReader.start();  		mTelemetryLogger = new TelemetryLogger(this, mAltosBluetooth); @@ -279,8 +311,8 @@ public class TelemetryService extends Service {  		timer.scheduleAtFixedRate(new TimerTask(){ public void run() {onTimerTick();}}, 10000L, 10000L);  		// Listen for GPS and Network position updates -		gpsListener = new AltosLocationListener(true); -		netListener = new AltosLocationListener(false); +		gpsListener = new AltosLocationListener(this, true); +		netListener = new AltosLocationListener(this, false);  		LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); | 
