altosui: Fix telemetry file reader to handle tick count wrapping
[fw/altos] / ao-tools / altosui / AltosTelemetryReader.java
index f1f6788c0afbc17973574a0b98c5459647d153a8..ae9682ab323ccb43a45e31959dbdec9c88fcca30 100644 (file)
@@ -41,26 +41,45 @@ public class AltosTelemetryReader extends AltosReader {
 
        public AltosTelemetryReader (FileInputStream input) {
                boolean saw_boost = false;
+               int     current_tick = 0;
 
                records = new LinkedList<AltosRecord> ();
 
                try {
                        for (;;) {
                                String line = AltosRecord.gets(input);
-                               if (line == null)
+                               if (line == null) {
                                        break;
-                               AltosTelemetry record = new AltosTelemetry(line);
-                               if (record == null)
-                                       break;
-                               if (!saw_boost && record.state >= Altos.ao_flight_boost)
-                               {
-                                       saw_boost = true;
-                                       boost_tick = record.tick;
                                }
-                               records.add(record);
+                               try {
+                                       System.out.printf("%s\n", line);
+                                       AltosTelemetry record = new AltosTelemetry(line);
+                                       if (record == null)
+                                               break;
+                                       if (records.isEmpty()) {
+                                               current_tick = record.tick;
+                                       } else {
+                                               int tick = record.tick | (current_tick & ~ 0xffff);
+                                               if (tick < current_tick - 0x1000)
+                                                       tick += 0x10000;
+                                               current_tick = tick;
+                                               record.tick = current_tick;
+                                       }
+                                       System.out.printf("\tRSSI %d tick %d\n", record.rssi, record.tick);
+                                       if (!saw_boost && record.state >= Altos.ao_flight_boost)
+                                       {
+                                               saw_boost = true;
+                                               boost_tick = record.tick;
+                                       }
+                                       records.add(record);
+                               } catch (ParseException pe) {
+                                       System.out.printf("parse exception %s\n", pe.getMessage());
+                               } catch (AltosCRCException ce) {
+                                       System.out.printf("crc error\n");
+                               }
                        }
                } catch (IOException io) {
-               } catch (ParseException pe) {
+                       System.out.printf("io exception\n");
                }
                record_iterator = records.iterator();
                try {