diff options
Diffstat (limited to 'altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java')
| -rw-r--r-- | altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java | 55 | 
1 files changed, 52 insertions, 3 deletions
diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java index 5bc4b90d..971c3e80 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java @@ -25,12 +25,13 @@ import java.util.concurrent.*;  import android.util.Log;  import android.os.Handler; -import org.altusmetrum.altoslib_4.*; +import org.altusmetrum.altoslib_5.*;  public class TelemetryReader extends Thread {  	private static final String TAG = "TelemetryReader"; +	private static final boolean D = true;  	int         crc_errors; @@ -39,6 +40,8 @@ public class TelemetryReader extends Thread {  	AltosLink   link;  	AltosState  state = null; +	AltosFlightReader	stacked; +  	LinkedBlockingQueue<AltosLine> telemQueue;  	public AltosState read() throws ParseException, AltosCRCException, InterruptedException, IOException { @@ -56,6 +59,10 @@ public class TelemetryReader extends Thread {  	public void close() {  		state = null; +		if (stacked != null) { +			stacked.close(false); +			stacked = null; +		}  		link.remove_monitor(telemQueue);  		link = null;  		telemQueue.clear(); @@ -66,7 +73,27 @@ public class TelemetryReader extends Thread {  		AltosState  state = null;  		try { -			for (;;) { +			if (D) Log.d(TAG, "starting reader"); +			while (stacked != null) { +				AltosState	stacked_state = null; +				try { +					stacked_state = stacked.read(); +				} catch (ParseException pe) { +					continue; +				} catch (AltosCRCException ce) { +					continue; +				} +				if (stacked_state != null) +					state = stacked_state; +				else +					stacked = null; +			} +			if (state != null) { +				if (D) Log.d(TAG, "Send initial state"); +				handler.obtainMessage(TelemetryService.MSG_TELEMETRY, state).sendToTarget(); +			} +			if (D) Log.d(TAG, "starting loop"); +			while (telemQueue != null) {  				try {  					state = read();  					handler.obtainMessage(TelemetryService.MSG_TELEMETRY, state).sendToTarget(); @@ -84,12 +111,34 @@ public class TelemetryReader extends Thread {  		}  	} -	public TelemetryReader (AltosLink in_link, Handler in_handler) { +	public TelemetryReader (AltosLink in_link, Handler in_handler, AltosFlightReader in_stacked) { +		if (D) Log.d(TAG, "connected TelemetryReader create started");  		link    = in_link;  		handler = in_handler; +		stacked = in_stacked;  		state = null;  		telemQueue = new LinkedBlockingQueue<AltosLine>();  		link.add_monitor(telemQueue); +		link.set_telemetry(AltosLib.ao_telemetry_standard); + +		if (D) Log.d(TAG, "connected TelemetryReader created"); +	} + +	private static AltosFlightReader existing_data(AltosLink link) { +		if (link == null) +			return null; + +		File	file = AltosPreferences.logfile(link.serial); +		if (file != null) { +			AltosStateIterable	iterable = AltosStateIterable.iterable(file); +			if (iterable != null) +				return new AltosReplayReader(iterable.iterator(), file, false); +		} +		return null; +	} + +	public TelemetryReader(AltosLink link, Handler handler) { +		this(link, handler, existing_data(link));  	}  }  | 
