From 803203197e51e71e9c77b3610047fd5bf9a56c56 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 27 Sep 2010 18:52:30 -0700 Subject: [PATCH] altosui: Deal with eeprom dates going backwards across wrap 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 --- ao-tools/altosui/AltosEepromIterable.java | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/ao-tools/altosui/AltosEepromIterable.java b/ao-tools/altosui/AltosEepromIterable.java index d4ac3f3e..2f1e7e90 100644 --- a/ao-tools/altosui/AltosEepromIterable.java +++ b/ao-tools/altosui/AltosEepromIterable.java @@ -44,15 +44,19 @@ class AltosOrderedRecord extends AltosEepromRecord implements Comparable 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; } @@ -340,7 +344,7 @@ public class AltosEepromIterable extends AltosRecordIterable { int index = 0; int prev_tick = 0; - + boolean prev_tick_valid = false; boolean missing_time = false; try { @@ -348,12 +352,14 @@ public class AltosEepromIterable extends AltosRecordIterable { 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.cmd < Altos.AO_LOG_CONFIG_VERSION) + prev_tick_valid = true; if (record.cmd == Altos.AO_LOG_FLIGHT) { flight_record = record; continue; -- 2.30.2