altoslib: Update GPS seen_values in AltosEepromIterable
[fw/altos] / altoslib / AltosEepromIterable.java
index f1397c7bf5430136e92c6f241cdfa9c2ff6ae739..986b7a2cacf2f32f5e477b16a3933c43d42677e3 100644 (file)
@@ -20,62 +20,10 @@ package org.altusmetrum.AltosLib;
 import java.io.*;
 import java.util.*;
 import java.text.*;
-import java.util.prefs.*;
-import java.util.concurrent.LinkedBlockingQueue;
-
-/*
- * AltosRecords with an index field so they can be sorted by tick while preserving
- * the original ordering for elements with matching ticks
- */
-class AltosOrderedRecord extends AltosEepromRecord implements Comparable<AltosOrderedRecord> {
-
-       public int      index;
-
-       public AltosOrderedRecord(String line, int in_index, int prev_tick, boolean prev_tick_valid)
-               throws ParseException {
-               super(line);
-               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;
-                       }
-               }
-               index = in_index;
-       }
-
-       public AltosOrderedRecord(int in_cmd, int in_tick, int in_a, int in_b, int in_index) {
-               super(in_cmd, in_tick, in_a, in_b);
-               index = in_index;
-       }
-
-       public String toString() {
-               return String.format("%d.%d %04x %04x %04x",
-                                    cmd, index, tick, a, b);
-       }
-
-       public int compareTo(AltosOrderedRecord o) {
-               int     tick_diff = tick - o.tick;
-               if (tick_diff != 0)
-                       return tick_diff;
-               return index - o.index;
-       }
-}
 
 public class AltosEepromIterable extends AltosRecordIterable {
 
-       static final int        seen_flight = 1;
-       static final int        seen_sensor = 2;
-       static final int        seen_temp_volt = 4;
-       static final int        seen_deploy = 8;
-       static final int        seen_gps_time = 16;
-       static final int        seen_gps_lat = 32;
-       static final int        seen_gps_lon = 64;
-
-       static final int        seen_basic = seen_flight|seen_sensor;
+       static final int        seen_basic = AltosRecord.seen_flight|AltosRecord.seen_sensor;
 
        boolean                 has_accel;
        boolean                 has_gps;
@@ -104,11 +52,11 @@ public class AltosEepromIterable extends AltosRecordIterable {
                }
        }
 
-       void update_state(AltosRecord state, AltosEepromRecord record, EepromState eeprom) {
+       void update_state(AltosRecordTM state, AltosEepromRecord record, EepromState eeprom) {
                state.tick = record.tick;
                switch (record.cmd) {
                case AltosLib.AO_LOG_FLIGHT:
-                       eeprom.seen |= seen_flight;
+                       eeprom.seen |= AltosRecord.seen_flight;
                        state.ground_accel = record.a;
                        state.flight_accel = record.a;
                        state.flight = record.b;
@@ -126,10 +74,10 @@ public class AltosEepromIterable extends AltosRecordIterable {
                                state.flight_pres = (state.flight_pres * 15 + state.pres) / 16;
                        }
                        state.flight_accel = (state.flight_accel * 15 + state.accel) / 16;
-                       if ((eeprom.seen & seen_sensor) == 0)
+                       if ((eeprom.seen & AltosRecord.seen_sensor) == 0)
                                eeprom.sensor_tick = record.tick - 1;
                        state.flight_vel += (state.accel_plus_g - state.accel) * (record.tick - eeprom.sensor_tick);
-                       eeprom.seen |= seen_sensor;
+                       eeprom.seen |= AltosRecord.seen_sensor;
                        eeprom.sensor_tick = record.tick;
                        has_accel = true;
                        break;
@@ -140,17 +88,17 @@ public class AltosEepromIterable extends AltosRecordIterable {
                                eeprom.n_pad_samples++;
                                state.ground_pres = state.pres;
                        }
-                       eeprom.seen |= seen_sensor;
+                       eeprom.seen |= AltosRecord.seen_sensor;
                        break;
                case AltosLib.AO_LOG_TEMP_VOLT:
                        state.temp = record.a;
                        state.batt = record.b;
-                       eeprom.seen |= seen_temp_volt;
+                       eeprom.seen |= AltosRecord.seen_temp_volt;
                        break;
                case AltosLib.AO_LOG_DEPLOY:
                        state.drogue = record.a;
                        state.main = record.b;
-                       eeprom.seen |= seen_deploy;
+                       eeprom.seen |= AltosRecord.seen_deploy;
                        has_ignite = true;
                        break;
                case AltosLib.AO_LOG_STATE:
@@ -158,6 +106,7 @@ public class AltosEepromIterable extends AltosRecordIterable {
                        break;
                case AltosLib.AO_LOG_GPS_TIME:
                        eeprom.gps_tick = state.tick;
+                       eeprom.seen |= AltosRecord.seen_gps_time;
                        AltosGPS old = state.gps;
                        state.gps = new AltosGPS();
 
@@ -180,10 +129,12 @@ public class AltosEepromIterable extends AltosRecordIterable {
                        has_gps = true;
                        break;
                case AltosLib.AO_LOG_GPS_LAT:
+                       eeprom.seen |= AltosRecord.seen_gps_lat;
                        int lat32 = record.a | (record.b << 16);
                        state.gps.lat = (double) lat32 / 1e7;
                        break;
                case AltosLib.AO_LOG_GPS_LON:
+                       eeprom.seen |= AltosRecord.seen_gps_lon;
                        int lon32 = record.a | (record.b << 16);
                        state.gps.lon = (double) lon32 / 1e7;
                        break;
@@ -237,13 +188,14 @@ public class AltosEepromIterable extends AltosRecordIterable {
                LinkedList<AltosRecord>         list = new LinkedList<AltosRecord>();
                Iterator<AltosOrderedRecord>    iterator = records.iterator();
                AltosOrderedRecord              record = null;
-               AltosRecord                     state = new AltosRecord();
-               boolean                         last_reported = false;
+               AltosRecordTM                   state = new AltosRecordTM();
+               //boolean                               last_reported = false;
                EepromState                     eeprom = new EepromState();
 
                state.state = AltosLib.ao_flight_pad;
                state.accel_plus_g = 15758;
                state.accel_minus_g = 16294;
+               state.flight_vel = 0;
 
                /* Pull in static data from the flight and gps_date records */
                if (flight_record != null)
@@ -254,13 +206,13 @@ public class AltosEepromIterable extends AltosRecordIterable {
                while (iterator.hasNext()) {
                        record = iterator.next();
                        if ((eeprom.seen & seen_basic) == seen_basic && record.tick != state.tick) {
-                               AltosRecord r = new AltosRecord(state);
+                               AltosRecordTM r = state.clone();
                                r.time = (r.tick - eeprom.boost_tick) / 100.0;
                                list.add(r);
                        }
                        update_state(state, record, eeprom);
                }
-               AltosRecord r = new AltosRecord(state);
+               AltosRecordTM r = state.clone();
                r.time = (r.tick - eeprom.boost_tick) / 100.0;
                list.add(r);
        return list;
@@ -318,28 +270,28 @@ public class AltosEepromIterable extends AltosRecordIterable {
                        case AltosLib.AO_LOG_SOFTWARE_VERSION:
                                out.printf ("# Software version: %s\n", record.data);
                                break;
-                       case Altos.AO_LOG_BARO_RESERVED:
+                       case AltosLib.AO_LOG_BARO_RESERVED:
                                out.printf ("# Baro reserved: %d\n", record.a);
                                break;
-                       case Altos.AO_LOG_BARO_SENS:
+                       case AltosLib.AO_LOG_BARO_SENS:
                                out.printf ("# Baro sens: %d\n", record.a);
                                break;
-                       case Altos.AO_LOG_BARO_OFF:
+                       case AltosLib.AO_LOG_BARO_OFF:
                                out.printf ("# Baro off: %d\n", record.a);
                                break;
-                       case Altos.AO_LOG_BARO_TCS:
+                       case AltosLib.AO_LOG_BARO_TCS:
                                out.printf ("# Baro tcs: %d\n", record.a);
                                break;
-                       case Altos.AO_LOG_BARO_TCO:
+                       case AltosLib.AO_LOG_BARO_TCO:
                                out.printf ("# Baro tco: %d\n", record.a);
                                break;
-                       case Altos.AO_LOG_BARO_TREF:
+                       case AltosLib.AO_LOG_BARO_TREF:
                                out.printf ("# Baro tref: %d\n", record.a);
                                break;
-                       case Altos.AO_LOG_BARO_TEMPSENS:
+                       case AltosLib.AO_LOG_BARO_TEMPSENS:
                                out.printf ("# Baro tempsens: %d\n", record.a);
                                break;
-                       case Altos.AO_LOG_BARO_CRC:
+                       case AltosLib.AO_LOG_BARO_CRC:
                                out.printf ("# Baro crc: %d\n", record.a);
                                break;
                        }
@@ -399,12 +351,10 @@ public class AltosEepromIterable extends AltosRecordIterable {
 
                try {
                        for (;;) {
-                               String line = AltosRecord.gets(input);
+                               String line = AltosLib.gets(input);
                                if (line == null)
                                        break;
                                AltosOrderedRecord record = new AltosOrderedRecord(line, index++, prev_tick, prev_tick_valid);
-                               if (record == null)
-                                       break;
                                if (record.cmd == AltosLib.AO_LOG_INVALID)
                                        continue;
                                prev_tick = record.tick;