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>
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.gps.locked = (flags & AltosLib.AO_GPS_VALID) != 0;
state.gps.nsat = (flags & AltosLib.AO_GPS_NUM_SAT_MASK) >>
AltosLib.AO_GPS_NUM_SAT_SHIFT;
has_gps = true;
break;
case AltosLib.AO_LOG_GPS_LAT:
has_gps = true;
break;
case AltosLib.AO_LOG_GPS_LAT:
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.gps.locked = (flags & AltosLib.AO_GPS_VALID) != 0;
state.gps.nsat = (flags & AltosLib.AO_GPS_NUM_SAT_MASK) >>
AltosLib.AO_GPS_NUM_SAT_SHIFT;
has_gps = true;
eeprom.seen |= seen_gps_time | seen_gps_lat | seen_gps_lon;
break;
has_gps = true;
eeprom.seen |= seen_gps_time | seen_gps_lat | seen_gps_lon;
break;
record.status = 0;
record.state = AltosLib.ao_flight_idle;
record.gps = gps;
record.status = 0;
record.state = AltosLib.ao_flight_idle;
record.gps = gps;
state = new AltosState (record, state);
} finally {
if (remote) {
state = new AltosState (record, state);
} finally {
if (remote) {
public int tick;
public AltosGPS gps;
public int tick;
public AltosGPS gps;
- public boolean new_gps;
+ public int gps_sequence;
public double time; /* seconds since boost */
public double time; /* seconds since boost */
state = old.state;
tick = old.tick;
gps = new AltosGPS(old.gps);
state = old.state;
tick = old.tick;
gps = new AltosGPS(old.gps);
+ gps_sequence = old.gps_sequence;
companion = old.companion;
kalman_acceleration = old.kalman_acceleration;
kalman_speed = old.kalman_speed;
companion = old.companion;
kalman_acceleration = old.kalman_acceleration;
kalman_speed = old.kalman_speed;
state = AltosLib.ao_flight_startup;
tick = 0;
gps = null;
state = AltosLib.ao_flight_startup;
tick = 0;
gps = null;
companion = null;
kalman_acceleration = MISSING;
companion = null;
kalman_acceleration = MISSING;
public double max_baro_speed;
public AltosGPS gps;
public double max_baro_speed;
public AltosGPS gps;
+ public int gps_sequence;
public AltosIMU imu;
public AltosMag mag;
public AltosIMU imu;
public AltosMag mag;
npad = prev_state.npad;
ngps = prev_state.ngps;
gps = prev_state.gps;
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;
pad_lat = prev_state.pad_lat;
pad_lon = prev_state.pad_lon;
pad_alt = prev_state.pad_alt;
npad = 0;
ngps = 0;
gps = null;
npad = 0;
ngps = 0;
gps = null;
baro_speed = AltosRecord.MISSING;
accel_speed = AltosRecord.MISSING;
pad_alt = AltosRecord.MISSING;
baro_speed = AltosRecord.MISSING;
accel_speed = AltosRecord.MISSING;
pad_alt = AltosRecord.MISSING;
- 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)
/* Track consecutive 'good' gps reports, waiting for 10 of them */
if (data.gps != null && data.gps.locked && data.gps.nsat >= 4)
pad_alt = ground_altitude;
}
pad_alt = ground_altitude;
}
+ gps_sequence = data.gps_sequence;
gps_waiting = MIN_PAD_SAMPLES - npad;
if (gps_waiting < 0)
gps_waiting = MIN_PAD_SAMPLES - npad;
if (gps_waiting < 0)
if (map.has(AO_TELEM_GPS_STATE)) {
record.gps = new AltosGPS(map);
if (map.has(AO_TELEM_GPS_STATE)) {
record.gps = new AltosGPS(map);
}
else
record.gps = null;
}
else
record.gps = null;
}
record.gps = new AltosGPS(words, i, record.version);
}
record.gps = new AltosGPS(words, i, record.version);
}
public AltosTelemetryRecordLegacy(String line) throws ParseException, AltosCRCException {
}
public AltosTelemetryRecordLegacy(String line) throws ParseException, AltosCRCException {
if ((gps_flags & (AO_GPS_VALID|AO_GPS_RUNNING)) != 0) {
record.gps = new AltosGPS();
if ((gps_flags & (AO_GPS_VALID|AO_GPS_RUNNING)) != 0) {
record.gps = new AltosGPS();
record.seen |= AltosRecord.seen_gps_time | AltosRecord.seen_gps_lat | AltosRecord.seen_gps_lon;
record.gps.nsat = (gps_flags & AO_GPS_NUM_SAT_MASK);
record.seen |= AltosRecord.seen_gps_time | AltosRecord.seen_gps_lat | AltosRecord.seen_gps_lon;
record.gps.nsat = (gps_flags & AO_GPS_NUM_SAT_MASK);
next.gps.hdop = hdop;
next.gps.vdop = vdop;
next.seen |= AltosRecord.seen_gps_time | AltosRecord.seen_gps_lat | AltosRecord.seen_gps_lon;
next.gps.hdop = hdop;
next.gps.vdop = vdop;
next.seen |= AltosRecord.seen_gps_time | AltosRecord.seen_gps_lat | AltosRecord.seen_gps_lon;