altoslib: Pass all flight records while reading telem file
authorKeith Packard <keithp@keithp.com>
Thu, 13 Feb 2020 23:39:08 +0000 (15:39 -0800)
committerKeith Packard <keithp@keithp.com>
Thu, 13 Feb 2020 23:43:35 +0000 (15:43 -0800)
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 <keithp@keithp.com>
altoslib/AltosReplayReader.java
altoslib/AltosTelemetryFile.java
altoslib/AltosTimeSeries.java

index ec682bd4757ea949c9dd402f9e5601e333a0568f..6eec6c9aeea6d317261ab01ee4e3e3d2932f50b8 100644 (file)
@@ -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();
        }
 }
index 01d82c242bd3ef7e1915269eee57ad1d40ac0db6..1aa473aee56325da0539787183ce54fafb2ddd0b 100644 (file)
@@ -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;
                }
index 75225e1558d236ae45bdd34e72509fcce48905ab..9c6e936cec1101222c0daac420d51d4b4682b16f 100644 (file)
@@ -21,14 +21,17 @@ public class AltosTimeSeries implements Iterable<AltosTimeValue>, Comparable<Alt
        public AltosUnits               units;
        ArrayList<AltosTimeValue>       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() {