X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosdroid%2Fsrc%2Forg%2Faltusmetrum%2FAltosDroid%2FTelemetryReader.java;h=bec518516f9113ac7b2c5749ba39fd872b97c947;hp=2a2cc4040de33ead81269752adbd99716a559e4a;hb=aa7dd289ee72f7a49a08ce0229c4e0e0404499d0;hpb=b89fb51a963635e2effe3a31f803bfc29c2c46b7 diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java index 2a2cc404..bec51851 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java @@ -25,7 +25,7 @@ import java.util.concurrent.*; import android.util.Log; import android.os.Handler; -import org.altusmetrum.altoslib_3.*; +import org.altusmetrum.altoslib_5.*; public class TelemetryReader extends Thread { @@ -39,9 +39,17 @@ public class TelemetryReader extends Thread { AltosLink link; AltosState state = null; + AltosFlightReader stacked; + LinkedBlockingQueue telemQueue; public AltosState read() throws ParseException, AltosCRCException, InterruptedException, IOException { + if (stacked != null) { + state = stacked.read(); + if (state != null) + return state; + stacked = null; + } AltosLine l = telemQueue.take(); if (l.line == null) throw new IOException("IO error"); @@ -56,6 +64,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 +78,7 @@ public class TelemetryReader extends Thread { AltosState state = null; try { - for (;;) { + while (telemQueue != null) { try { state = read(); handler.obtainMessage(TelemetryService.MSG_TELEMETRY, state).sendToTarget(); @@ -84,12 +96,39 @@ public class TelemetryReader extends Thread { } } - public TelemetryReader (AltosLink in_link, Handler in_handler) { + public TelemetryReader (AltosLink in_link, Handler in_handler, AltosFlightReader in_stacked) { link = in_link; handler = in_handler; + stacked = in_stacked; state = null; telemQueue = new LinkedBlockingQueue(); link.add_monitor(telemQueue); + try { + link.set_radio_frequency(AltosPreferences.frequency(link.serial)); + link.set_telemetry(AltosLib.ao_telemetry_standard); + link.set_telemetry_rate(AltosPreferences.telemetry_rate(link.serial)); + } catch (InterruptedException ee) { + close(); + } catch (TimeoutException te) { + close(); + } + } + + 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)); } }