altoslib: Use sequence numbers to track GPS updates to AltosRecord
authorKeith Packard <keithp@keithp.com>
Tue, 14 May 2013 07:24:53 +0000 (00:24 -0700)
committerKeith Packard <keithp@keithp.com>
Tue, 14 May 2013 07:24:53 +0000 (00:24 -0700)
State objects now record what GPS sequence ID they have to know when
the GPS data has been updated. Record objects bump the GPS sequence
each time new GPS data is recorded. This way, record objects aren't
modified as they're iterated over to generate the list of state
objects which makes it possible to iterate multiple times and get the
same resulting set of states.

Signed-off-by: Keith Packard <keithp@keithp.com>
altoslib/AltosEepromIterable.java
altoslib/AltosEepromMegaIterable.java
altoslib/AltosIdleMonitor.java
altoslib/AltosRecord.java
altoslib/AltosState.java
altoslib/AltosTelemetryRecordLegacy.java
altoslib/AltosTelemetryRecordLocation.java

index 7a8bbdea2f4a055d90350c456afa33dbd8fbeba6..b84574ef9647261ea724d9510f0946f03469f544 100644 (file)
@@ -125,7 +125,7 @@ public class AltosEepromIterable extends AltosRecordIterable {
                        state.gps.locked = (flags & AltosLib.AO_GPS_VALID) != 0;
                        state.gps.nsat = (flags & AltosLib.AO_GPS_NUM_SAT_MASK) >>
                                AltosLib.AO_GPS_NUM_SAT_SHIFT;
-                       state.new_gps = true;
+                       state.gps_sequence++;
                        has_gps = true;
                        break;
                case AltosLib.AO_LOG_GPS_LAT:
index a127f435e3b2042d3a68c1d95ada50956b0aa968..5736f9372e99b83ab49e4c7fc8a5c80157960cd4 100644 (file)
@@ -136,7 +136,7 @@ public class AltosEepromMegaIterable extends AltosRecordIterable {
                        state.gps.locked = (flags & AltosLib.AO_GPS_VALID) != 0;
                        state.gps.nsat = (flags & AltosLib.AO_GPS_NUM_SAT_MASK) >>
                                AltosLib.AO_GPS_NUM_SAT_SHIFT;
-                       state.new_gps = true;
+                       state.gps_sequence++;
                        has_gps = true;
                        eeprom.seen |= seen_gps_time | seen_gps_lat | seen_gps_lon;
                        break;
index 2e4ddef25705d5ab2cf40778c860b6db321783eb..b3ce5b204a8774976f9764fb2d738d37de99fdf1 100644 (file)
@@ -112,7 +112,7 @@ public class AltosIdleMonitor extends Thread {
                        record.status = 0;
                        record.state = AltosLib.ao_flight_idle;
                        record.gps = gps;
-                       record.new_gps = true;
+                       record.gps_sequence++;
                        state = new AltosState (record, state);
                } finally {
                        if (remote) {
index 07e910eb726e53fb28471521035f7f0a68b7665b..5e4ed927a28dad427e648484f18e2286f25ddbbf 100644 (file)
@@ -44,7 +44,7 @@ public class AltosRecord implements Comparable <AltosRecord>, Cloneable {
        public int      tick;
 
        public AltosGPS gps;
-       public boolean  new_gps;
+       public int      gps_sequence;
 
        public double   time;   /* seconds since boost */
 
@@ -143,7 +143,7 @@ public class AltosRecord implements Comparable <AltosRecord>, Cloneable {
                state = old.state;
                tick = old.tick;
                gps = new AltosGPS(old.gps);
-               new_gps = old.new_gps;
+               gps_sequence = old.gps_sequence;
                companion = old.companion;
                kalman_acceleration = old.kalman_acceleration;
                kalman_speed = old.kalman_speed;
@@ -161,7 +161,7 @@ public class AltosRecord implements Comparable <AltosRecord>, Cloneable {
                state = AltosLib.ao_flight_startup;
                tick = 0;
                gps = null;
-               new_gps = false;
+               gps_sequence = 0;
                companion = null;
 
                kalman_acceleration = MISSING;
index ccbe498d5ca34dedaa3ee7be58512955f93e16d2..825306be998559373141bba449553019605fa18c 100644 (file)
@@ -54,6 +54,7 @@ public class AltosState {
        public double   max_baro_speed;
 
        public AltosGPS gps;
+       public int gps_sequence;
 
        public AltosIMU imu;
        public AltosMag mag;
@@ -133,6 +134,7 @@ public class AltosState {
                        npad = prev_state.npad;
                        ngps = prev_state.ngps;
                        gps = prev_state.gps;
+                       gps_sequence = prev_state.gps_sequence;
                        pad_lat = prev_state.pad_lat;
                        pad_lon = prev_state.pad_lon;
                        pad_alt = prev_state.pad_alt;
@@ -187,6 +189,7 @@ public class AltosState {
                        npad = 0;
                        ngps = 0;
                        gps = null;
+                       gps_sequence = 0;
                        baro_speed = AltosRecord.MISSING;
                        accel_speed = AltosRecord.MISSING;
                        pad_alt = AltosRecord.MISSING;
@@ -199,7 +202,7 @@ public class AltosState {
 
                time = tick / 100.0;
 
-               if (cur.new_gps && (state < AltosLib.ao_flight_boost)) {
+               if (data.gps != null && data.gps_sequence != gps_sequence && (state < AltosLib.ao_flight_boost)) {
 
                        /* Track consecutive 'good' gps reports, waiting for 10 of them */
                        if (data.gps != null && data.gps.locked && data.gps.nsat >= 4)
@@ -226,7 +229,7 @@ public class AltosState {
                                pad_alt = ground_altitude;
                }
 
-               data.new_gps = false;
+               gps_sequence = data.gps_sequence;
 
                gps_waiting = MIN_PAD_SAMPLES - npad;
                if (gps_waiting < 0)
index a734b188e852e1aaeeef5e0211beab9fac38abe9..f2d3f86877422afa79d8ff3b6b585f3e28047069 100644 (file)
@@ -267,7 +267,7 @@ public class AltosTelemetryRecordLegacy extends AltosTelemetryRecord {
 
                if (map.has(AO_TELEM_GPS_STATE)) {
                record.gps = new AltosGPS(map);
-               record.new_gps = true;
+               record.gps_sequence++;
                }
                else
                record.gps = null;
@@ -357,7 +357,7 @@ public class AltosTelemetryRecordLegacy extends AltosTelemetryRecord {
                }
 
                record.gps = new AltosGPS(words, i, record.version);
-               record.new_gps = true;
+               record.gps_sequence++;
        }
 
        public AltosTelemetryRecordLegacy(String line) throws ParseException, AltosCRCException {
@@ -476,7 +476,7 @@ public class AltosTelemetryRecordLegacy extends AltosTelemetryRecord {
 
                if ((gps_flags & (AO_GPS_VALID|AO_GPS_RUNNING)) != 0) {
                        record.gps = new AltosGPS();
-                       record.new_gps = true;
+                       record.gps_sequence++;
 
                        record.seen |= AltosRecord.seen_gps_time | AltosRecord.seen_gps_lat | AltosRecord.seen_gps_lon;
                        record.gps.nsat = (gps_flags & AO_GPS_NUM_SAT_MASK);
index 029996963b555f9a9f4b2648e463d48adb87b5e3..0236d29166b36a95373b6a9cba25d4707434b9b9 100644 (file)
@@ -85,7 +85,7 @@ public class AltosTelemetryRecordLocation extends AltosTelemetryRecordRaw {
                        next.gps.hdop = hdop;
                        next.gps.vdop = vdop;
                        next.seen |= AltosRecord.seen_gps_time | AltosRecord.seen_gps_lat | AltosRecord.seen_gps_lon;
-                       next.new_gps = true;
+                       next.gps_sequence++;
                }
 
                return next;