From 8ac11767a1b8d3e2faf6f020f5161ed05b801070 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 13 Feb 2020 15:39:08 -0800 Subject: [PATCH] altoslib: Pass all flight records while reading telem file This makes sure we get complete GPS and setup information before the flight starts. To make this work, have data skipped when building time series instead, and have realtime replay fast-forward through the initial data Signed-off-by: Keith Packard --- altoslib/AltosReplayReader.java | 41 ++++++++++++-------------------- altoslib/AltosTelemetryFile.java | 15 ++++++------ altoslib/AltosTimeSeries.java | 7 ++++-- 3 files changed, 27 insertions(+), 36 deletions(-) diff --git a/altoslib/AltosReplayReader.java b/altoslib/AltosReplayReader.java index ec682bd4..6eec6c9a 100644 --- a/altoslib/AltosReplayReader.java +++ b/altoslib/AltosReplayReader.java @@ -35,13 +35,15 @@ class AltosReplay extends AltosDataListener implements Runnable { boolean done = false; public void set_time(double time) { - if (last_time != AltosLib.MISSING) { - semaphore.release(); - double delay = Math.min(time - last_time,10); - if (delay > 0) { - try { - Thread.sleep((int) (delay * 1000)); - } catch (InterruptedException ie) { + if (time > -2) { + if (last_time != AltosLib.MISSING) { + semaphore.release(); + double delay = Math.min(time - last_time,10); + if (delay > 0) { + try { + Thread.sleep((int) (delay * 1000)); + } catch (InterruptedException ie) { + } } } } @@ -108,31 +110,17 @@ public class AltosReplayReader extends AltosFlightReader { File file; AltosReplay replay; Thread t; - int reads; public AltosCalData cal_data() { return replay.state.cal_data(); } public AltosState read() { - switch (reads) { - case 0: - /* Tell the display that we're in pad mode */ - replay.state.set_state(AltosLib.ao_flight_pad); - break; - case 1: - t = new Thread(replay); - t.start(); - /* fall through */ - default: - /* Wait for something to change */ - try { - replay.semaphore.acquire(); - } catch (InterruptedException ie) { - } - break; + /* Wait for something to change */ + try { + replay.semaphore.acquire(); + } catch (InterruptedException ie) { } - reads++; /* When done, let the display know */ if (replay.done) @@ -149,9 +137,10 @@ public class AltosReplayReader extends AltosFlightReader { public File backing_file() { return file; } public AltosReplayReader(AltosRecordSet record_set, File in_file) { - reads = 0; file = in_file; name = file.getName(); replay = new AltosReplay(record_set); + t = new Thread(replay); + t.start(); } } diff --git a/altoslib/AltosTelemetryFile.java b/altoslib/AltosTelemetryFile.java index 01d82c24..1aa473ae 100644 --- a/altoslib/AltosTelemetryFile.java +++ b/altoslib/AltosTelemetryFile.java @@ -95,6 +95,7 @@ public class AltosTelemetryFile implements AltosRecordSet { AltosTelemetryIterable telems; AltosCalData cal_data; + int first_state; public void write_comments(PrintStream out) { } @@ -108,8 +109,11 @@ public class AltosTelemetryFile implements AltosRecordSet { cal_data = new AltosCalData(); AltosTelemetryNullListener l = new AltosTelemetryNullListener(cal_data); + first_state = AltosLib.ao_flight_startup; for (AltosTelemetry telem : telems) { telem.provide_data(l); + if (cal_data.state == AltosLib.ao_flight_pad) + first_state = cal_data.state; if (l.cal_data_complete()) break; } @@ -122,16 +126,11 @@ public class AltosTelemetryFile implements AltosRecordSet { } public void capture_series(AltosDataListener listener) { - AltosCalData cal_data = cal_data(); - + cal_data(); cal_data.reset(); + cal_data.state = first_state; for (AltosTelemetry telem : telems) { - int tick = telem.tick(); - cal_data.set_tick(tick); - - /* Try to pick up at least one pre-boost value */ - if (cal_data.time() >= -2) - telem.provide_data(listener); + telem.provide_data(listener); if (listener.state() == AltosLib.ao_flight_landed) break; } diff --git a/altoslib/AltosTimeSeries.java b/altoslib/AltosTimeSeries.java index 75225e15..9c6e936c 100644 --- a/altoslib/AltosTimeSeries.java +++ b/altoslib/AltosTimeSeries.java @@ -21,14 +21,17 @@ public class AltosTimeSeries implements Iterable, Comparable values; boolean data_changed; + double min_time = -2; public int compareTo(AltosTimeSeries other) { return label.compareTo(other.label); } public void add(AltosTimeValue tv) { - data_changed = true; - values.add(tv); + if (tv.time >= min_time) { + data_changed = true; + values.add(tv); + } } public void erase_values() { -- 2.30.2