* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.AltosLib;
+package org.altusmetrum.altoslib_1;
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;
}
}
- 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;
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;
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:
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();
state.gps.locked = (flags & AltosLib.AO_GPS_VALID) != 0;
state.gps.nsat = (flags & AltosLib.AO_GPS_NUM_SAT_MASK) >>
AltosLib.AO_GPS_NUM_SAT_SHIFT;
- state.new_gps = true;
+ state.gps_sequence++;
has_gps = true;
break;
case AltosLib.AO_LOG_GPS_LAT:
+ eeprom.seen |= AltosRecord.seen_gps_lat;
int lat32 = record.a | (record.b << 16);
+ if (state.gps == null)
+ state.gps = new AltosGPS();
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);
+ if (state.gps == null)
+ state.gps = new AltosGPS();
state.gps.lon = (double) lon32 / 1e7;
break;
case AltosLib.AO_LOG_GPS_ALT:
+ if (state.gps == null)
+ state.gps = new AltosGPS();
state.gps.alt = record.a;
break;
case AltosLib.AO_LOG_GPS_SAT:
if (state.tick == eeprom.gps_tick) {
int svid = record.a;
int c_n0 = record.b >> 8;
+ if (state.gps == null)
+ state.gps = new AltosGPS();
state.gps.add_sat(svid, c_n0);
}
break;
case AltosLib.AO_LOG_GPS_DATE:
+ if (state.gps == null)
+ state.gps = new AltosGPS();
state.gps.year = (record.a & 0xff) + 2000;
state.gps.month = record.a >> 8;
state.gps.day = record.b & 0xff;
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)
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;
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;
}
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;