* 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 AltosOrderedMegaRecord extends AltosEepromMega implements Comparable<AltosOrderedMegaRecord> {
-
- public int index;
-
- public AltosOrderedMegaRecord(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 AltosOrderedMegaRecord(int in_cmd, int in_tick, int in_a, int in_b, int in_index) {
- super(in_cmd, in_tick);
- a = in_a;
- b = in_b;
- index = in_index;
- }
-
- public String toString() {
- return String.format("%d.%d %04x %04x %04x",
- cmd, index, tick, a, b);
- }
-
- public int compareTo(AltosOrderedMegaRecord o) {
- int tick_diff = tick - o.tick;
- if (tick_diff != 0)
- return tick_diff;
- return index - o.index;
- }
-}
public class AltosEepromMegaIterable extends AltosRecordIterable {
}
}
- void update_state(AltosRecord state, AltosEepromMega record, EepromState eeprom) {
+ void update_state(AltosRecordMM state, AltosEepromMega record, EepromState eeprom) {
state.tick = record.tick;
switch (record.cmd) {
case AltosLib.AO_LOG_FLIGHT:
break;
case AltosLib.AO_LOG_SENSOR:
state.accel = record.accel();
- state.pres = baro.set(record.pres(), record.temp());
+ baro.set(record.pres(), record.temp());
+ state.pres = baro.pa;
state.temp = baro.cc;
state.imu = new AltosIMU();
state.imu.accel_x = record.accel_x();
eeprom.sensor_tick = record.tick;
has_accel = true;
break;
- case AltosLib.AO_LOG_PRESSURE:
- state.pres = record.b;
- state.flight_pres = state.pres;
- if (eeprom.n_pad_samples == 0) {
- eeprom.n_pad_samples++;
- state.ground_pres = state.pres;
- }
- eeprom.seen |= seen_sensor;
- break;
case AltosLib.AO_LOG_TEMP_VOLT:
- state.batt = record.v_batt();
+ state.v_batt = record.v_batt();
+ state.v_pyro = record.v_pbatt();
+ for (int i = 0; i < record.nsense(); i++)
+ state.sense[i] = record.sense(i);
eeprom.seen |= seen_temp_volt;
break;
- case AltosLib.AO_LOG_DEPLOY:
- state.drogue = record.a;
- state.main = record.b;
- eeprom.seen |= seen_deploy;
- has_ignite = true;
- break;
case AltosLib.AO_LOG_STATE:
state.state = record.state();
break;
case AltosLib.AO_LOG_GPS_TIME:
eeprom.gps_tick = state.tick;
- AltosGPS old = state.gps;
state.gps = new AltosGPS();
- /* GPS date doesn't get repeated through the file */
- if (old != null) {
- state.gps.year = old.year;
- state.gps.month = old.month;
- state.gps.day = old.day;
- }
- state.gps.hour = (record.a & 0xff);
- state.gps.minute = (record.a >> 8);
- state.gps.second = (record.b & 0xff);
+ state.gps.lat = record.latitude() / 1e7;
+ state.gps.lon = record.longitude() / 1e7;
+ state.gps.alt = record.altitude();
+ state.gps.year = record.year() + 2000;
+ state.gps.month = record.month();
+ state.gps.day = record.day();
+
+ state.gps.hour = record.hour();
+ state.gps.minute = record.minute();
+ state.gps.second = record.second();
- int flags = (record.b >> 8);
+ int flags = record.flags();
state.gps.connected = (flags & AltosLib.AO_GPS_RUNNING) != 0;
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;
has_gps = true;
- break;
- case AltosLib.AO_LOG_GPS_LAT:
- int lat32 = record.a | (record.b << 16);
- state.gps.lat = (double) lat32 / 1e7;
- break;
- case AltosLib.AO_LOG_GPS_LON:
- int lon32 = record.a | (record.b << 16);
- state.gps.lon = (double) lon32 / 1e7;
- break;
- case AltosLib.AO_LOG_GPS_ALT:
- state.gps.alt = record.a;
+ eeprom.seen |= seen_gps_time | seen_gps_lat | seen_gps_lon;
break;
case AltosLib.AO_LOG_GPS_SAT:
if (state.tick == eeprom.gps_tick) {
- int svid = record.a;
- int c_n0 = record.b >> 8;
- state.gps.add_sat(svid, c_n0);
+ int nsat = record.nsat();
+ for (int i = 0; i < nsat; i++)
+ state.gps.add_sat(record.svid(i), record.c_n(i));
}
break;
- case AltosLib.AO_LOG_GPS_DATE:
- state.gps.year = (record.a & 0xff) + 2000;
- state.gps.month = record.a >> 8;
- state.gps.day = record.b & 0xff;
- break;
-
case AltosLib.AO_LOG_CONFIG_VERSION:
break;
case AltosLib.AO_LOG_MAIN_DEPLOY:
state.callsign = record.data;
break;
case AltosLib.AO_LOG_ACCEL_CAL:
- state.accel_plus_g = record.a;
- state.accel_minus_g = record.b;
+ state.accel_plus_g = record.config_a;
+ state.accel_minus_g = record.config_b;
break;
case AltosLib.AO_LOG_RADIO_CAL:
break;
case AltosLib.AO_LOG_PRODUCT:
break;
case AltosLib.AO_LOG_SERIAL_NUMBER:
- state.serial = record.a;
+ state.serial = record.config_a;
break;
case AltosLib.AO_LOG_SOFTWARE_VERSION:
break;
case AltosLib.AO_LOG_BARO_RESERVED:
- baro.reserved = record.a;
+ baro.reserved = record.config_a;
break;
case AltosLib.AO_LOG_BARO_SENS:
- baro.sens =record.a;
+ baro.sens =record.config_a;
break;
case AltosLib.AO_LOG_BARO_OFF:
- baro.off =record.a;
+ baro.off =record.config_a;
break;
case AltosLib.AO_LOG_BARO_TCS:
- baro.tcs =record.a;
+ baro.tcs =record.config_a;
break;
case AltosLib.AO_LOG_BARO_TCO:
- baro.tco =record.a;
+ baro.tco =record.config_a;
break;
case AltosLib.AO_LOG_BARO_TREF:
- baro.tref =record.a;
+ baro.tref =record.config_a;
break;
case AltosLib.AO_LOG_BARO_TEMPSENS:
- baro.tempsens =record.a;
+ baro.tempsens =record.config_a;
break;
case AltosLib.AO_LOG_BARO_CRC:
- baro.crc =record.a;
+ baro.crc =record.config_a;
break;
}
state.seen |= eeprom.seen;
LinkedList<AltosRecord> list = new LinkedList<AltosRecord>();
Iterator<AltosOrderedMegaRecord> iterator = records.iterator();
AltosOrderedMegaRecord record = null;
- AltosRecord state = new AltosRecord();
- boolean last_reported = false;
+ AltosRecordMM state = new AltosRecordMM();
+ //boolean last_reported = false;
EepromState eeprom = new EepromState();
state.state = AltosLib.ao_flight_pad;
while (iterator.hasNext()) {
record = iterator.next();
if ((eeprom.seen & seen_basic) == seen_basic && record.tick != state.tick) {
- AltosRecord r = new AltosRecord(state);
+ AltosRecordMM 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);
+ AltosRecordMM r = state.clone();
r.time = (r.tick - eeprom.boost_tick) / 100.0;
list.add(r);
return list;
out.printf("# Config version: %s\n", record.data);
break;
case AltosLib.AO_LOG_MAIN_DEPLOY:
- out.printf("# Main deploy: %s\n", record.a);
+ out.printf("# Main deploy: %s\n", record.config_a);
break;
case AltosLib.AO_LOG_APOGEE_DELAY:
- out.printf("# Apogee delay: %s\n", record.a);
+ out.printf("# Apogee delay: %s\n", record.config_a);
break;
case AltosLib.AO_LOG_RADIO_CHANNEL:
- out.printf("# Radio channel: %s\n", record.a);
+ out.printf("# Radio channel: %s\n", record.config_a);
break;
case AltosLib.AO_LOG_CALLSIGN:
out.printf("# Callsign: %s\n", record.data);
break;
case AltosLib.AO_LOG_ACCEL_CAL:
- out.printf ("# Accel cal: %d %d\n", record.a, record.b);
+ out.printf ("# Accel cal: %d %d\n", record.config_a, record.config_b);
break;
case AltosLib.AO_LOG_RADIO_CAL:
- out.printf ("# Radio cal: %d\n", record.a);
+ out.printf ("# Radio cal: %d\n", record.config_a);
break;
case AltosLib.AO_LOG_MAX_FLIGHT_LOG:
- out.printf ("# Max flight log: %d\n", record.a);
+ out.printf ("# Max flight log: %d\n", record.config_a);
break;
case AltosLib.AO_LOG_MANUFACTURER:
out.printf ("# Manufacturer: %s\n", record.data);
out.printf ("# Product: %s\n", record.data);
break;
case AltosLib.AO_LOG_SERIAL_NUMBER:
- out.printf ("# Serial number: %d\n", record.a);
+ out.printf ("# Serial number: %d\n", record.config_a);
break;
case AltosLib.AO_LOG_SOFTWARE_VERSION:
out.printf ("# Software version: %s\n", record.data);
break;
case AltosLib.AO_LOG_BARO_RESERVED:
- out.printf ("# Baro reserved: %d\n", record.a);
+ out.printf ("# Baro reserved: %d\n", record.config_a);
break;
case AltosLib.AO_LOG_BARO_SENS:
- out.printf ("# Baro sens: %d\n", record.a);
+ out.printf ("# Baro sens: %d\n", record.config_a);
break;
case AltosLib.AO_LOG_BARO_OFF:
- out.printf ("# Baro off: %d\n", record.a);
+ out.printf ("# Baro off: %d\n", record.config_a);
break;
case AltosLib.AO_LOG_BARO_TCS:
- out.printf ("# Baro tcs: %d\n", record.a);
+ out.printf ("# Baro tcs: %d\n", record.config_a);
break;
case AltosLib.AO_LOG_BARO_TCO:
- out.printf ("# Baro tco: %d\n", record.a);
+ out.printf ("# Baro tco: %d\n", record.config_a);
break;
case AltosLib.AO_LOG_BARO_TREF:
- out.printf ("# Baro tref: %d\n", record.a);
+ out.printf ("# Baro tref: %d\n", record.config_a);
break;
case AltosLib.AO_LOG_BARO_TEMPSENS:
- out.printf ("# Baro tempsens: %d\n", record.a);
+ out.printf ("# Baro tempsens: %d\n", record.config_a);
break;
case AltosLib.AO_LOG_BARO_CRC:
- out.printf ("# Baro crc: %d\n", record.a);
+ out.printf ("# Baro crc: %d\n", record.config_a);
break;
}
}
}
- /*
- * Given an AO_LOG_GPS_TIME record with correct time, and one
- * missing time, rewrite the missing time values with the good
- * ones, assuming that the difference between them is 'diff' seconds
- */
- void update_time(AltosOrderedMegaRecord good, AltosOrderedMegaRecord bad) {
-
- int diff = (bad.tick - good.tick + 50) / 100;
-
- int hour = (good.a & 0xff);
- int minute = (good.a >> 8);
- int second = (good.b & 0xff);
- int flags = (good.b >> 8);
- int seconds = hour * 3600 + minute * 60 + second;
-
- /* Make sure this looks like a good GPS value */
- if ((flags & AltosLib.AO_GPS_NUM_SAT_MASK) >> AltosLib.AO_GPS_NUM_SAT_SHIFT < 4)
- flags = (flags & ~AltosLib.AO_GPS_NUM_SAT_MASK) | (4 << AltosLib.AO_GPS_NUM_SAT_SHIFT);
- flags |= AltosLib.AO_GPS_RUNNING;
- flags |= AltosLib.AO_GPS_VALID;
-
- int new_seconds = seconds + diff;
- if (new_seconds < 0)
- new_seconds += 24 * 3600;
- int new_second = (new_seconds % 60);
- int new_minutes = (new_seconds / 60);
- int new_minute = (new_minutes % 60);
- int new_hours = (new_minutes / 60);
- int new_hour = (new_hours % 24);
-
- bad.a = new_hour + (new_minute << 8);
- bad.b = new_second + (flags << 8);
- }
-
/*
* Read the whole file, dumping records into a RB tree so
* we can enumerate them in time order -- the eeprom data
try {
for (;;) {
- String line = AltosRecord.gets(input);
+ String line = AltosLib.gets(input);
if (line == null)
break;
AltosOrderedMegaRecord record = new AltosOrderedMegaRecord(line, index++, prev_tick, prev_tick_valid);
- if (record == null)
- break;
if (record.cmd == AltosLib.AO_LOG_INVALID)
continue;
prev_tick = record.tick;
continue;
}
- /* Two firmware bugs caused the loss of some GPS data.
- * The flight date would never be recorded, and often
- * the flight time would get overwritten by another
- * record. Detect the loss of the GPS date and fix up the
- * missing time records
- */
- if (record.cmd == AltosLib.AO_LOG_GPS_DATE) {
- gps_date_record = record;
- continue;
- }
-
- /* go back and fix up any missing time values */
- if (record.cmd == AltosLib.AO_LOG_GPS_TIME) {
- last_gps_time = record;
- if (missing_time) {
- Iterator<AltosOrderedMegaRecord> iterator = records.iterator();
- while (iterator.hasNext()) {
- AltosOrderedMegaRecord old = iterator.next();
- if (old.cmd == AltosLib.AO_LOG_GPS_TIME &&
- old.a == -1 && old.b == -1)
- {
- update_time(record, old);
- }
- }
- missing_time = false;
- }
- }
-
- if (record.cmd == AltosLib.AO_LOG_GPS_LAT) {
- if (last_gps_time == null || last_gps_time.tick != record.tick) {
- AltosOrderedMegaRecord add_gps_time = new AltosOrderedMegaRecord(AltosLib.AO_LOG_GPS_TIME,
- record.tick,
- -1, -1, index-1);
- if (last_gps_time != null)
- update_time(last_gps_time, add_gps_time);
- else
- missing_time = true;
-
- records.add(add_gps_time);
- record.index = index++;
- }
- }
records.add(record);
/* Bail after reading the 'landed' record; we're all done */
if (record.cmd == AltosLib.AO_LOG_STATE &&
- record.a == AltosLib.ao_flight_landed)
+ record.state() == AltosLib.ao_flight_landed)
break;
}
} catch (IOException io) {