altosui: Deal with eeprom dates going backwards across wrap
authorKeith Packard <keithp@keithp.com>
Tue, 28 Sep 2010 01:52:30 +0000 (18:52 -0700)
committerKeith Packard <keithp@keithp.com>
Tue, 28 Sep 2010 01:52:30 +0000 (18:52 -0700)
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>
ao-tools/altosui/AltosEepromIterable.java

index d4ac3f3e14bedb8b5043af8bb26ae4f6bbc86333..2f1e7e9066db2e94f0a3d4bae33ccfd76c1764dc 100644 (file)
@@ -44,15 +44,19 @@ class AltosOrderedRecord extends AltosEepromRecord implements Comparable<AltosOr
 
        public int      index;
 
 
        public int      index;
 
-       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;
+                       }
                }
                }
-               tick = new_tick;
                index = in_index;
        }
 
                index = in_index;
        }
 
@@ -340,7 +344,7 @@ public class AltosEepromIterable extends AltosRecordIterable {
 
                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 {
@@ -348,12 +352,14 @@ public class AltosEepromIterable extends AltosRecordIterable {
                                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;