eeprom timestamps can go backwards as the GPS time stamps are
recorded when the first GPS character is received, but not placed into
the eeprom log until the last GPS packet is complete. If this happens
at the same time the tick count is wrapping, then the tick count will
wrap backwards across the 0 boundary causing time to jump forwards.
Fix this by letting time go backwards across the tick boundary, which
requires that we know when the first 'real' tick is read from the
eeprom file.
Signed-off-by: Keith Packard <keithp@keithp.com>
- public AltosOrderedRecord(String line, int in_index, int prev_tick)
+ public AltosOrderedRecord(String line, int in_index, int prev_tick, boolean prev_tick_valid)
throws ParseException {
super(line);
throws ParseException {
super(line);
- int new_tick = tick | (prev_tick & ~0xffff);
- if (new_tick < prev_tick) {
- if (prev_tick - new_tick > 0x8000)
- new_tick += 0x10000;
+ if (prev_tick_valid) {
+ tick |= (prev_tick & ~0xffff);
+ if (tick < prev_tick) {
+ if (prev_tick - tick > 0x8000)
+ tick += 0x10000;
+ } else {
+ if (tick - prev_tick > 0x8000)
+ tick -= 0x10000;
+ }
int index = 0;
int prev_tick = 0;
int index = 0;
int prev_tick = 0;
+ boolean prev_tick_valid = false;
boolean missing_time = false;
try {
boolean missing_time = false;
try {
String line = AltosRecord.gets(input);
if (line == null)
break;
String line = AltosRecord.gets(input);
if (line == null)
break;
- AltosOrderedRecord record = new AltosOrderedRecord(line, index++, prev_tick);
+ AltosOrderedRecord record = new AltosOrderedRecord(line, index++, prev_tick, prev_tick_valid);
if (record == null)
break;
if (record.cmd == Altos.AO_LOG_INVALID)
continue;
prev_tick = record.tick;
if (record == null)
break;
if (record.cmd == Altos.AO_LOG_INVALID)
continue;
prev_tick = record.tick;
+ if (record.cmd < Altos.AO_LOG_CONFIG_VERSION)
+ prev_tick_valid = true;
if (record.cmd == Altos.AO_LOG_FLIGHT) {
flight_record = record;
continue;
if (record.cmd == Altos.AO_LOG_FLIGHT) {
flight_record = record;
continue;