Instead of re-parsing the old logfile, save the current state in the
preferences database and restore at restart of the
TelemetryService. This makes the state get restored even before the BT
connection is recovered.
Signed-off-by: Keith Packard <keithp@keithp.com>
AltosLink link;
AltosState state = null;
AltosLink link;
AltosState state = null;
- AltosFlightReader stacked;
-
LinkedBlockingQueue<AltosLine> telemQueue;
public AltosState read() throws ParseException, AltosCRCException, InterruptedException, IOException {
LinkedBlockingQueue<AltosLine> telemQueue;
public AltosState read() throws ParseException, AltosCRCException, InterruptedException, IOException {
public void close() {
state = null;
public void close() {
state = null;
- if (stacked != null) {
- stacked.close(false);
- stacked = null;
- }
link.remove_monitor(telemQueue);
link = null;
telemQueue.clear();
link.remove_monitor(telemQueue);
link = null;
telemQueue.clear();
AltosState state = null;
try {
AltosState state = null;
try {
- 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 {
if (D) Log.d(TAG, "starting loop");
while (telemQueue != null) {
try {
- public TelemetryReader (AltosLink in_link, Handler in_handler, AltosFlightReader in_stacked) {
+ public TelemetryReader (AltosLink in_link, Handler in_handler, AltosState in_state) {
if (D) Log.d(TAG, "connected TelemetryReader create started");
link = in_link;
handler = in_handler;
if (D) Log.d(TAG, "connected TelemetryReader create started");
link = in_link;
handler = in_handler;
telemQueue = new LinkedBlockingQueue<AltosLine>();
link.add_monitor(telemQueue);
link.set_telemetry(AltosLib.ao_telemetry_standard);
if (D) Log.d(TAG, "connected TelemetryReader created");
}
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));
- }
case MSG_TELEMETRY:
// forward telemetry messages
s.telemetry_state.state = (AltosState) msg.obj;
case MSG_TELEMETRY:
// forward telemetry messages
s.telemetry_state.state = (AltosState) msg.obj;
+ if (s.telemetry_state.state != null) {
+ if (D) Log.d(TAG, "Save state");
+ AltosPreferences.set_state(0, s.telemetry_state.state, null);
+ }
if (D) Log.d(TAG, "MSG_TELEMETRY");
s.sendMessageToClients();
break;
if (D) Log.d(TAG, "MSG_TELEMETRY");
s.sendMessageToClients();
break;
private Message message() {
if (telemetry_state == null)
Log.d(TAG, "telemetry_state null!");
private Message message() {
if (telemetry_state == null)
Log.d(TAG, "telemetry_state null!");
+ if (telemetry_state.state == null)
+ Log.d(TAG, "telemetry_state.state null!");
return Message.obtain(null, AltosDroid.MSG_STATE, telemetry_state);
}
return Message.obtain(null, AltosDroid.MSG_STATE, telemetry_state);
}
if (D) Log.d(TAG, "connected bluetooth configured");
telemetry_state.connect = TelemetryState.CONNECT_CONNECTED;
if (D) Log.d(TAG, "connected bluetooth configured");
telemetry_state.connect = TelemetryState.CONNECT_CONNECTED;
- mTelemetryReader = new TelemetryReader(mAltosBluetooth, mHandler);
+ mTelemetryReader = new TelemetryReader(mAltosBluetooth, mHandler, telemetry_state.state);
mTelemetryReader.start();
if (D) Log.d(TAG, "connected TelemetryReader started");
mTelemetryReader.start();
if (D) Log.d(TAG, "connected TelemetryReader started");
telemetry_state.connect = TelemetryState.CONNECT_READY;
telemetry_state.connect = TelemetryState.CONNECT_READY;
+ AltosSavedState saved_state = AltosPreferences.state(0);
+
+ if (saved_state != null) {
+ if (D) Log.d(TAG, String.format("recovered old state flight %d\n", saved_state.state.flight));
+ telemetry_state.state = saved_state.state;
+ }
+
// Start our timer - first event in 10 seconds, then every 10 seconds after that.
timer.scheduleAtFixedRate(new TimerTask(){ public void run() {onTimerTick();}}, 10000L, 10000L);
// Start our timer - first event in 10 seconds, then every 10 seconds after that.
timer.scheduleAtFixedRate(new TimerTask(){ public void run() {onTimerTick();}}, 10000L, 10000L);