summaryrefslogtreecommitdiff
path: root/altoslib
diff options
context:
space:
mode:
Diffstat (limited to 'altoslib')
-rw-r--r--altoslib/AltosConfigData.java17
-rw-r--r--altoslib/AltosEepromMega.java59
-rw-r--r--altoslib/AltosEepromMegaIterable.java195
-rw-r--r--altoslib/AltosIdleMonitor.java2
-rw-r--r--altoslib/AltosLib.java2
-rw-r--r--altoslib/AltosOrderedMegaRecord.java12
-rw-r--r--altoslib/AltosPyro.java293
-rw-r--r--altoslib/AltosRecord.java99
-rw-r--r--altoslib/AltosRecordMM.java14
-rw-r--r--altoslib/AltosRecordNone.java34
-rw-r--r--altoslib/AltosRecordTM.java21
-rw-r--r--altoslib/AltosState.java69
-rw-r--r--altoslib/AltosTelemetryRecordLegacy.java24
-rw-r--r--altoslib/AltosTelemetryRecordMegaData.java6
-rw-r--r--altoslib/AltosTelemetryRecordRaw.java2
-rw-r--r--altoslib/AltosTelemetryRecordSensor.java6
-rw-r--r--altoslib/Makefile.am4
17 files changed, 539 insertions, 320 deletions
diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java
index a962b105..45a88783 100644
--- a/altoslib/AltosConfigData.java
+++ b/altoslib/AltosConfigData.java
@@ -50,6 +50,8 @@ public class AltosConfigData implements Iterable<String> {
public int storage_size;
public int storage_erase_unit;
+ public AltosPyro[] pyros;
+
public static String get_string(String line, String label) throws ParseException {
if (line.startsWith(label)) {
String quoted = line.substring(label.length()).trim();
@@ -135,6 +137,10 @@ public class AltosConfigData implements Iterable<String> {
radio_frequency = 0;
stored_flight = 0;
serial = -1;
+ pyros = null;
+
+ int npyro = 0;
+ int pyro = 0;
for (;;) {
String line = link.get_reply();
if (line == null)
@@ -142,6 +148,16 @@ public class AltosConfigData implements Iterable<String> {
if (line.contains("Syntax error"))
continue;
lines.add(line);
+ if (pyro < npyro - 1) {
+ if (pyros == null)
+ pyros = new AltosPyro[npyro];
+ try {
+ pyros[pyro] = new AltosPyro(pyro, line);
+ } catch (ParseException e) {
+ }
+ ++pyro;
+ continue;
+ }
try { serial = get_int(line, "serial-number"); } catch (Exception e) {}
try { log_format = get_int(line, "log-format"); } catch (Exception e) {}
try { main_deploy = get_int(line, "Main deploy:"); } catch (Exception e) {}
@@ -173,6 +189,7 @@ public class AltosConfigData implements Iterable<String> {
try { get_int(line, "flight"); stored_flight++; } catch (Exception e) {}
try { storage_size = get_int(line, "Storage size:"); } catch (Exception e) {}
try { storage_erase_unit = get_int(line, "Storage erase unit"); } catch (Exception e) {}
+ try { npyro = get_int(line, "Pyro-count:"); pyro = 0; } catch (Exception e) {}
/* signals the end of the version info */
if (line.startsWith("software-version"))
diff --git a/altoslib/AltosEepromMega.java b/altoslib/AltosEepromMega.java
index 26bacf8d..af4f8aca 100644
--- a/altoslib/AltosEepromMega.java
+++ b/altoslib/AltosEepromMega.java
@@ -24,7 +24,7 @@ public class AltosEepromMega {
public int tick;
public boolean valid;
public String data;
- public int a, b;
+ public int config_a, config_b;
public int data8[];
@@ -66,12 +66,7 @@ public class AltosEepromMega {
public int mag_x() { return data16(20); }
public int mag_y() { return data16(22); }
public int mag_z() { return data16(24); }
- public int accel() {
- int a = data16(26);
- if (a != 0xffff)
- return a;
- return accel_y();
- }
+ public int accel() { return data16(26); }
/* AO_LOG_VOLT elements */
public int v_batt() { return data16(0); }
@@ -79,6 +74,22 @@ public class AltosEepromMega {
public int nsense() { return data16(4); }
public int sense(int i) { return data16(6 + i * 2); }
+ /* AO_LOG_GPS_TIME elements */
+ public int latitude() { return data32(0); }
+ public int longitude() { return data32(4); }
+ public int altitude() { return data16(8); }
+ public int hour() { return data8(10); }
+ public int minute() { return data8(11); }
+ public int second() { return data8(12); }
+ public int flags() { return data8(13); }
+ public int year() { return data8(14); }
+ public int month() { return data8(15); }
+ public int day() { return data8(16); }
+
+ /* AO_LOG_GPS_SAT elements */
+ public int nsat() { return data16(0); }
+ public int svid(int n) { return data8(2 + n * 2); }
+ public int c_n(int n) { return data8(2 + n * 2 + 1); }
public AltosEepromMega (AltosEepromChunk chunk, int start) throws ParseException {
cmd = chunk.data(start);
@@ -126,26 +137,26 @@ public class AltosEepromMega {
data = tokens[2];
} else if (tokens[0].equals("Main") && tokens[1].equals("deploy:")) {
cmd = AltosLib.AO_LOG_MAIN_DEPLOY;
- a = Integer.parseInt(tokens[2]);
+ config_a = Integer.parseInt(tokens[2]);
} else if (tokens[0].equals("Apogee") && tokens[1].equals("delay:")) {
cmd = AltosLib.AO_LOG_APOGEE_DELAY;
- a = Integer.parseInt(tokens[2]);
+ config_a = Integer.parseInt(tokens[2]);
} else if (tokens[0].equals("Radio") && tokens[1].equals("channel:")) {
cmd = AltosLib.AO_LOG_RADIO_CHANNEL;
- a = Integer.parseInt(tokens[2]);
+ config_a = Integer.parseInt(tokens[2]);
} else if (tokens[0].equals("Callsign:")) {
cmd = AltosLib.AO_LOG_CALLSIGN;
data = tokens[1].replaceAll("\"","");
} else if (tokens[0].equals("Accel") && tokens[1].equals("cal")) {
cmd = AltosLib.AO_LOG_ACCEL_CAL;
- a = Integer.parseInt(tokens[3]);
- b = Integer.parseInt(tokens[5]);
+ config_a = Integer.parseInt(tokens[3]);
+ config_b = Integer.parseInt(tokens[5]);
} else if (tokens[0].equals("Radio") && tokens[1].equals("cal:")) {
cmd = AltosLib.AO_LOG_RADIO_CAL;
- a = Integer.parseInt(tokens[2]);
+ config_a = Integer.parseInt(tokens[2]);
} else if (tokens[0].equals("Max") && tokens[1].equals("flight") && tokens[2].equals("log:")) {
cmd = AltosLib.AO_LOG_MAX_FLIGHT_LOG;
- a = Integer.parseInt(tokens[3]);
+ config_a = Integer.parseInt(tokens[3]);
} else if (tokens[0].equals("manufacturer")) {
cmd = AltosLib.AO_LOG_MANUFACTURER;
data = tokens[1];
@@ -154,38 +165,38 @@ public class AltosEepromMega {
data = tokens[1];
} else if (tokens[0].equals("serial-number")) {
cmd = AltosLib.AO_LOG_SERIAL_NUMBER;
- a = Integer.parseInt(tokens[1]);
+ config_a = Integer.parseInt(tokens[1]);
} else if (tokens[0].equals("log-format")) {
cmd = AltosLib.AO_LOG_LOG_FORMAT;
- a = Integer.parseInt(tokens[1]);
+ config_a = Integer.parseInt(tokens[1]);
} else if (tokens[0].equals("software-version")) {
cmd = AltosLib.AO_LOG_SOFTWARE_VERSION;
data = tokens[1];
} else if (tokens[0].equals("ms5607")) {
if (tokens[1].equals("reserved:")) {
cmd = AltosLib.AO_LOG_BARO_RESERVED;
- a = Integer.parseInt(tokens[2]);
+ config_a = Integer.parseInt(tokens[2]);
} else if (tokens[1].equals("sens:")) {
cmd = AltosLib.AO_LOG_BARO_SENS;
- a = Integer.parseInt(tokens[2]);
+ config_a = Integer.parseInt(tokens[2]);
} else if (tokens[1].equals("off:")) {
cmd = AltosLib.AO_LOG_BARO_OFF;
- a = Integer.parseInt(tokens[2]);
+ config_a = Integer.parseInt(tokens[2]);
} else if (tokens[1].equals("tcs:")) {
cmd = AltosLib.AO_LOG_BARO_TCS;
- a = Integer.parseInt(tokens[2]);
+ config_a = Integer.parseInt(tokens[2]);
} else if (tokens[1].equals("tco:")) {
cmd = AltosLib.AO_LOG_BARO_TCO;
- a = Integer.parseInt(tokens[2]);
+ config_a = Integer.parseInt(tokens[2]);
} else if (tokens[1].equals("tref:")) {
cmd = AltosLib.AO_LOG_BARO_TREF;
- a = Integer.parseInt(tokens[2]);
+ config_a = Integer.parseInt(tokens[2]);
} else if (tokens[1].equals("tempsens:")) {
cmd = AltosLib.AO_LOG_BARO_TEMPSENS;
- a = Integer.parseInt(tokens[2]);
+ config_a = Integer.parseInt(tokens[2]);
} else if (tokens[1].equals("crc:")) {
cmd = AltosLib.AO_LOG_BARO_CRC;
- a = Integer.parseInt(tokens[2]);
+ config_a = Integer.parseInt(tokens[2]);
} else {
cmd = AltosLib.AO_LOG_INVALID;
data = line;
diff --git a/altoslib/AltosEepromMegaIterable.java b/altoslib/AltosEepromMegaIterable.java
index 1ab2fcc8..16809089 100644
--- a/altoslib/AltosEepromMegaIterable.java
+++ b/altoslib/AltosEepromMegaIterable.java
@@ -106,80 +106,47 @@ public class AltosEepromMegaIterable extends AltosRecordIterable {
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.v_batt = record.v_batt();
state.v_pyro = record.v_pbatt();
- for (int i = 0; i < AltosRecordMM.num_sense; i++)
+ 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:
@@ -192,8 +159,8 @@ public class AltosEepromMegaIterable extends AltosRecordIterable {
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;
@@ -202,33 +169,33 @@ public class AltosEepromMegaIterable extends AltosRecordIterable {
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;
@@ -287,25 +254,25 @@ public class AltosEepromMegaIterable extends AltosRecordIterable {
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);
@@ -314,74 +281,40 @@ public class AltosEepromMegaIterable extends AltosRecordIterable {
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
* are sometimes out of order with GPS data getting timestamps
@@ -416,53 +349,11 @@ public class AltosEepromMegaIterable extends AltosRecordIterable {
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) {
diff --git a/altoslib/AltosIdleMonitor.java b/altoslib/AltosIdleMonitor.java
index 2c4965ff..07d8930d 100644
--- a/altoslib/AltosIdleMonitor.java
+++ b/altoslib/AltosIdleMonitor.java
@@ -97,7 +97,7 @@ public class AltosIdleMonitor extends Thread {
else if (has_sensor_mm(config_data))
record = sensor_mm(config_data);
else
- record = new AltosRecord();
+ record = new AltosRecordNone();
if (has_gps(config_data))
gps = new AltosGPSQuery(link, config_data);
diff --git a/altoslib/AltosLib.java b/altoslib/AltosLib.java
index 192c445e..07516aeb 100644
--- a/altoslib/AltosLib.java
+++ b/altoslib/AltosLib.java
@@ -199,7 +199,7 @@ public class AltosLib {
public static String state_name_capital(int state) {
if (state < 0 || state_to_string.length <= state)
- return "invalid";
+ return "Invalid";
return state_to_string_capital[state];
}
diff --git a/altoslib/AltosOrderedMegaRecord.java b/altoslib/AltosOrderedMegaRecord.java
index 05423dd9..3aaf7b5b 100644
--- a/altoslib/AltosOrderedMegaRecord.java
+++ b/altoslib/AltosOrderedMegaRecord.java
@@ -43,18 +43,6 @@ class AltosOrderedMegaRecord extends AltosEepromMega implements Comparable<Altos
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)
diff --git a/altoslib/AltosPyro.java b/altoslib/AltosPyro.java
new file mode 100644
index 00000000..14051169
--- /dev/null
+++ b/altoslib/AltosPyro.java
@@ -0,0 +1,293 @@
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+package org.altusmetrum.AltosLib;
+
+import java.util.*;
+import java.text.*;
+import java.util.concurrent.*;
+
+public class AltosPyro {
+ public static final int pyro_none = 0x00000000;
+
+ public static final int pyro_accel_less = 0x00000001;
+ public static final int pyro_accel_greater = 0x00000002;
+ public static final String pyro_accel_less_string = "a<";
+ public static final String pyro_accel_greater_string = "a>";
+ public static final String pyro_accel_less_name = "Acceleration less than (m/s²)";
+ public static final String pyro_accel_greater_name = "Acceleration greater than (m/s²)";
+ public static final double pyro_accel_scale = 16.0;
+
+ public static final int pyro_speed_less = 0x00000004;
+ public static final int pyro_speed_greater = 0x00000008;
+ public static final String pyro_speed_less_string = "s<";
+ public static final String pyro_speed_greater_string = "s>";
+ public static final String pyro_speed_less_name = "Speed less than (m/s)";
+ public static final String pyro_speed_greater_name = "Speed greater than (m/s)";
+ public static final double pyro_speed_scale = 16.0;
+
+ public static final int pyro_height_less = 0x00000010;
+ public static final int pyro_height_greater = 0x00000020;
+ public static final String pyro_height_less_string = "h<";
+ public static final String pyro_height_greater_string = "h>";
+ public static final String pyro_height_less_name = "Height less than (m)";
+ public static final String pyro_height_greater_name = "Height greater than (m)";
+ public static final double pyro_height_scale = 1.0;
+
+ public static final int pyro_orient_less = 0x00000040;
+ public static final int pyro_orient_greater = 0x00000080;
+ public static final String pyro_orient_less_string = "o<";
+ public static final String pyro_orient_greater_string = "o>";
+ public static final String pyro_orient_less_name = "Angle from vertical less than (degrees)";
+ public static final String pyro_orient_greater_name = "Angle from vertical greater than (degrees)";
+ public static final double pyro_orient_scale = 1.0;
+
+ public static final int pyro_time_less = 0x00000100;
+ public static final int pyro_time_greater = 0x00000200;
+ public static final String pyro_time_less_string = "t<";
+ public static final String pyro_time_greater_string = "t>";
+ public static final String pyro_time_less_name = "Time since boost less than (s)";
+ public static final String pyro_time_greater_name = "Time since boost greater than (s)";
+ public static final double pyro_time_scale = 100.0;
+
+ public static final int pyro_ascending = 0x00000400;
+ public static final int pyro_descending = 0x00000800;
+ public static final String pyro_ascending_string = "A";
+ public static final String pyro_descending_string = "D";
+ public static final String pyro_ascending_name = "Ascending";
+ public static final String pyro_descending_name = "Descending";
+
+ public static final int pyro_after_motor = 0x00001000;
+ public static final String pyro_after_motor_string = "m";
+ public static final String pyro_after_motor_name = "After motor number";
+ public static final double pyro_after_motor_scale = 1.0;
+
+ public static final int pyro_delay = 0x00002000;
+ public static final String pyro_delay_string = "d";
+ public static final String pyro_delay_name = "Delay after other conditions (s)";
+ public static final double pyro_delay_scale = 100.0;
+
+ public static final int pyro_state_less = 0x00004000;
+ public static final int pyro_state_greater_or_equal = 0x00008000;
+ public static final String pyro_state_less_string = "f<";
+ public static final String pyro_state_greater_or_equal_string = "f>=";
+ public static final String pyro_state_less_name = "Flight state before";
+ public static final String pyro_state_greater_or_equal_name = "Flight state after";
+ public static final double pyro_state_scale = 1.0;
+
+ public static final int pyro_all = 0x0000ffff;
+
+ public static final int pyro_no_value = (pyro_ascending |
+ pyro_descending);
+
+ public static final int pyro_state_value = pyro_state_less | pyro_state_greater_or_equal;
+
+ private static HashMap<String,Integer> string_to_pyro = new HashMap<String,Integer>();
+
+ private static HashMap<Integer,String> pyro_to_string = new HashMap<Integer,String>();
+
+ private static HashMap<Integer,String> pyro_to_name = new HashMap<Integer,String>();
+
+ private static HashMap<Integer,Double> pyro_to_scale = new HashMap<Integer,Double>();
+
+ private static void insert_map(int flag, String string, String name, double scale) {
+ string_to_pyro.put(string, flag);
+ pyro_to_string.put(flag, string);
+ pyro_to_name.put(flag, name);
+ pyro_to_scale.put(flag, scale);
+ }
+
+ public static int string_to_pyro(String name) {
+ if (string_to_pyro.containsKey(name))
+ return string_to_pyro.get(name);
+ return pyro_none;
+ }
+
+ public static String pyro_to_string(int flag) {
+ if (pyro_to_string.containsKey(flag))
+ return pyro_to_string.get(flag);
+ return null;
+ }
+
+ public static String pyro_to_name(int flag) {
+ if (pyro_to_name.containsKey(flag))
+ return pyro_to_name.get(flag);
+ return null;
+ }
+
+ public static double pyro_to_scale(int flag) {
+ if (pyro_to_scale.containsKey(flag))
+ return pyro_to_scale.get(flag);
+ return 1.0;
+ }
+
+ private static void initialize_maps() {
+ insert_map(pyro_accel_less, pyro_accel_less_string, pyro_accel_less_name, pyro_accel_scale);
+ insert_map(pyro_accel_greater, pyro_accel_greater_string, pyro_accel_greater_name, pyro_accel_scale);
+
+ insert_map(pyro_speed_less, pyro_speed_less_string, pyro_speed_less_name, pyro_speed_scale);
+ insert_map(pyro_speed_greater, pyro_speed_greater_string, pyro_speed_greater_name, pyro_speed_scale);
+
+ insert_map(pyro_height_less, pyro_height_less_string, pyro_height_less_name, pyro_height_scale);
+ insert_map(pyro_height_greater, pyro_height_greater_string, pyro_height_greater_name, pyro_height_scale);
+
+ insert_map(pyro_orient_less, pyro_orient_less_string, pyro_orient_less_name, pyro_orient_scale);
+ insert_map(pyro_orient_greater, pyro_orient_greater_string, pyro_orient_greater_name, pyro_orient_scale);
+
+ insert_map(pyro_time_less, pyro_time_less_string, pyro_time_less_name, pyro_time_scale);
+ insert_map(pyro_time_greater, pyro_time_greater_string, pyro_time_greater_name, pyro_time_scale);
+
+ insert_map(pyro_ascending, pyro_ascending_string, pyro_ascending_name, 1.0);
+ insert_map(pyro_descending, pyro_descending_string, pyro_descending_name, 1.0);
+
+ insert_map(pyro_after_motor, pyro_after_motor_string, pyro_after_motor_name, 1.0);
+ insert_map(pyro_delay, pyro_delay_string, pyro_delay_name, pyro_delay_scale);
+
+ insert_map(pyro_state_less, pyro_state_less_string, pyro_state_less_name, 1.0);
+ insert_map(pyro_state_greater_or_equal, pyro_state_greater_or_equal_string, pyro_state_greater_or_equal_name, 1.0);
+ }
+
+ {
+ initialize_maps();
+ }
+
+ public int channel;
+ public int flags;
+ public int accel_less, accel_greater;
+ public int speed_less, speed_greater;
+ public int height_less, height_greater;
+ public int orient_less, orient_greater;
+ public int time_less, time_greater;
+ public int delay;
+ public int state_less, state_greater_or_equal;
+ public int motor;
+
+ public AltosPyro(int in_channel) {
+ channel = in_channel;
+ flags = 0;
+ }
+
+ private boolean set_ivalue(int flag, int value) {
+ switch (flag) {
+ case pyro_accel_less: accel_less = value; break;
+ case pyro_accel_greater: accel_greater = value; break;
+ case pyro_speed_less: speed_less = value; break;
+ case pyro_speed_greater: speed_greater = value; break;
+ case pyro_height_less: height_less = value; break;
+ case pyro_height_greater: height_greater = value; break;
+ case pyro_orient_less: orient_less = value; break;
+ case pyro_orient_greater: orient_greater = value; break;
+ case pyro_time_less: time_less = value; break;
+ case pyro_time_greater: time_greater = value; break;
+ case pyro_after_motor: motor = value; break;
+ case pyro_delay: delay = value; break;
+ case pyro_state_less: state_less = value; break;
+ case pyro_state_greater_or_equal: state_greater_or_equal = value; break;
+ default:
+ return false;
+ }
+ return true;
+ }
+
+ public boolean set_value(int flag, double dvalue) {
+ return set_ivalue(flag, (int) (dvalue * pyro_to_scale(flag)));
+ }
+
+ private int get_ivalue (int flag) {
+ int value;
+
+ switch (flag) {
+ case pyro_accel_less: value = accel_less; break;
+ case pyro_accel_greater: value = accel_greater; break;
+ case pyro_speed_less: value = speed_less; break;
+ case pyro_speed_greater: value = speed_greater; break;
+ case pyro_height_less: value = height_less; break;
+ case pyro_height_greater: value = height_greater; break;
+ case pyro_orient_less: value = orient_less; break;
+ case pyro_orient_greater: value = orient_greater; break;
+ case pyro_time_less: value = time_less; break;
+ case pyro_time_greater: value = time_greater; break;
+ case pyro_after_motor: value = motor; break;
+ case pyro_delay: value = delay; break;
+ case pyro_state_less: value = state_less; break;
+ case pyro_state_greater_or_equal: value = state_greater_or_equal; break;
+ default: value = 0; break;
+ }
+ return value;
+ }
+
+ public double get_value(int flag) {
+ return get_ivalue(flag) / pyro_to_scale(flag);
+ }
+
+ public AltosPyro(int in_channel, String line) throws ParseException {
+ String[] tokens = line.split("\\s+");
+
+ channel = in_channel;
+ flags = 0;
+
+ int i = 0;
+ if (tokens[i].equals("Pyro"))
+ i += 2;
+
+ for (; i < tokens.length; i++) {
+
+ if (tokens[i].equals("<disabled>"))
+ break;
+
+ int flag = string_to_pyro(tokens[i]);
+ if (flag == pyro_none)
+ throw new ParseException(String.format("Invalid pyro token \"%s\"",
+ tokens[i]), i);
+ flags |= flag;
+
+ if ((flag & pyro_no_value) == 0) {
+ int value = 0;
+ ++i;
+ try {
+ value = AltosLib.fromdec(tokens[i]);
+ } catch (NumberFormatException n) {
+ throw new ParseException(String.format("Invalid pyro value \"%s\"",
+ tokens[i]), i);
+ }
+ if (!set_ivalue(flag, value))
+ throw new ParseException(String.format("Internal parser error \"%s\" \"%s\"",
+ tokens[i-1], tokens[i]), i-1);
+ }
+ }
+ }
+
+ public String toString() {
+ String ret = String.format("%d", channel);
+
+ for (int flag = 1; flag <= flags; flag <<= 1) {
+ if ((flags & flag) != 0) {
+ String add;
+ if ((flag & pyro_no_value) == 0) {
+ add = String.format(" %s %d",
+ pyro_to_string.get(flag),
+ get_ivalue(flag));
+ } else {
+ add = String.format(" %s",
+ pyro_to_string.get(flag));
+ }
+ ret = ret.concat(add);
+ }
+ }
+ return ret;
+ }
+}
diff --git a/altoslib/AltosRecord.java b/altoslib/AltosRecord.java
index 8bab1d0c..09169515 100644
--- a/altoslib/AltosRecord.java
+++ b/altoslib/AltosRecord.java
@@ -17,7 +17,7 @@
package org.altusmetrum.AltosLib;
-public class AltosRecord implements Comparable <AltosRecord>, Cloneable {
+public abstract class AltosRecord implements Comparable <AltosRecord>, Cloneable {
public static final int seen_flight = 1;
public static final int seen_sensor = 2;
@@ -43,11 +43,6 @@ public class AltosRecord implements Comparable <AltosRecord>, Cloneable {
public int state;
public int tick;
- /* Current flight dynamic state */
- public double acceleration; /* m/s² */
- public double speed; /* m/s */
- public double height; /* m */
-
public AltosGPS gps;
public boolean new_gps;
@@ -63,6 +58,11 @@ public class AltosRecord implements Comparable <AltosRecord>, Cloneable {
public AltosRecordCompanion companion;
+ /* Telemetry sources have these values recorded from the flight computer */
+ public double kalman_height;
+ public double kalman_speed;
+ public double kalman_acceleration;
+
/*
* Abstract methods that convert record data
* to standard units:
@@ -75,76 +75,48 @@ public class AltosRecord implements Comparable <AltosRecord>, Cloneable {
* temperature: °C
*/
- public double raw_pressure() { return MISSING; }
-
- public double filtered_pressure() { return MISSING; }
-
- public double ground_pressure() { return MISSING; }
-
- public double battery_voltage() { return MISSING; }
+ abstract public double pressure();
+ abstract public double ground_pressure();
+ abstract public double acceleration();
- public double main_voltage() { return MISSING; }
+ public double altitude() {
+ double p = pressure();
- public double drogue_voltage() { return MISSING; }
-
- public double temperature() { return MISSING; }
-
- public double acceleration() { return MISSING; }
-
- public double accel_speed() { return MISSING; }
-
- public AltosIMU imu() { return null; }
-
- public AltosMag mag() { return null; }
-
- /*
- * Convert various pressure values to altitude
- */
-
- public double raw_altitude() {
- double p = raw_pressure();
if (p == MISSING)
return MISSING;
return AltosConvert.pressure_to_altitude(p);
}
public double ground_altitude() {
- double p = ground_pressure();
+ double p = ground_pressure();
+
if (p == MISSING)
return MISSING;
return AltosConvert.pressure_to_altitude(p);
}
- public double filtered_altitude() {
- double ga = ground_altitude();
- if (height != MISSING && ga != MISSING)
- return height + ga;
+ public double height() {
+ double g = ground_altitude();
+ double a = altitude();
- double p = filtered_pressure();
- if (p == MISSING)
- return raw_altitude();
- return AltosConvert.pressure_to_altitude(p);
+ if (g == MISSING)
+ return MISSING;
+ if (a == MISSING)
+ return MISSING;
+ return a - g;
}
- public double filtered_height() {
- if (height != MISSING)
- return height;
+ public double battery_voltage() { return MISSING; }
- double f = filtered_altitude();
- double g = ground_altitude();
- if (f == MISSING || g == MISSING)
- return MISSING;
- return f - g;
- }
+ public double main_voltage() { return MISSING; }
- public double raw_height() {
- double r = raw_altitude();
- double g = ground_altitude();
+ public double drogue_voltage() { return MISSING; }
- if (r == MISSING || g == MISSING)
- return height;
- return r - g;
- }
+ public double temperature() { return MISSING; }
+
+ public AltosIMU imu() { return null; }
+
+ public AltosMag mag() { return null; }
public String state() {
return AltosLib.state_name(state);
@@ -164,12 +136,12 @@ public class AltosRecord implements Comparable <AltosRecord>, Cloneable {
status = old.status;
state = old.state;
tick = old.tick;
- acceleration = old.acceleration;
- speed = old.speed;
- height = old.height;
gps = new AltosGPS(old.gps);
new_gps = old.new_gps;
companion = old.companion;
+ kalman_acceleration = old.kalman_acceleration;
+ kalman_speed = old.kalman_speed;
+ kalman_height = old.kalman_height;
}
public AltosRecord clone() {
@@ -192,11 +164,12 @@ public class AltosRecord implements Comparable <AltosRecord>, Cloneable {
status = 0;
state = AltosLib.ao_flight_startup;
tick = 0;
- acceleration = MISSING;
- speed = MISSING;
- height = MISSING;
gps = new AltosGPS();
new_gps = false;
companion = null;
+
+ kalman_acceleration = MISSING;
+ kalman_speed = MISSING;
+ kalman_height = MISSING;
}
}
diff --git a/altoslib/AltosRecordMM.java b/altoslib/AltosRecordMM.java
index 5f952f7a..9f529234 100644
--- a/altoslib/AltosRecordMM.java
+++ b/altoslib/AltosRecordMM.java
@@ -19,6 +19,7 @@ package org.altusmetrum.AltosLib;
public class AltosRecordMM extends AltosRecord {
+ /* Sensor values */
public int accel;
public int pres;
public int temp;
@@ -45,16 +46,12 @@ public class AltosRecordMM extends AltosRecord {
return raw / 4095.0;
}
- public double raw_pressure() {
+ public double pressure() {
if (pres != MISSING)
return pres;
return MISSING;
}
- public double filtered_pressure() {
- return raw_pressure();
- }
-
public double ground_pressure() {
if (ground_pres != MISSING)
return ground_pres;
@@ -98,9 +95,6 @@ public class AltosRecordMM extends AltosRecord {
}
public double acceleration() {
- if (acceleration != MISSING)
- return acceleration;
-
if (ground_accel == MISSING || accel == MISSING)
return MISSING;
@@ -110,10 +104,6 @@ public class AltosRecordMM extends AltosRecord {
return (ground_accel - accel) / accel_counts_per_mss();
}
- public double accel_speed() {
- return speed;
- }
-
public void copy (AltosRecordMM old) {
super.copy(old);
diff --git a/altoslib/AltosRecordNone.java b/altoslib/AltosRecordNone.java
new file mode 100644
index 00000000..ca0a5fe3
--- /dev/null
+++ b/altoslib/AltosRecordNone.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+package org.altusmetrum.AltosLib;
+
+public class AltosRecordNone extends AltosRecord {
+
+ public double pressure() { return MISSING; }
+ public double ground_pressure() { return MISSING; }
+ public double temperature() { return MISSING; }
+ public double acceleration() { return MISSING; }
+
+ public AltosRecordNone(AltosRecord old) {
+ super.copy(old);
+ }
+
+ public AltosRecordNone() {
+ super();
+ }
+}
diff --git a/altoslib/AltosRecordTM.java b/altoslib/AltosRecordTM.java
index 37accef6..9530be31 100644
--- a/altoslib/AltosRecordTM.java
+++ b/altoslib/AltosRecordTM.java
@@ -18,6 +18,8 @@
package org.altusmetrum.AltosLib;
public class AltosRecordTM extends AltosRecord {
+
+ /* Sensor values */
public int accel;
public int pres;
public int temp;
@@ -57,18 +59,12 @@ public class AltosRecordTM extends AltosRecord {
return ((count / 16.0) / 2047.0 + 0.095) / 0.009 * 1000.0;
}
- public double raw_pressure() {
+ public double pressure() {
if (pres == MISSING)
return MISSING;
return barometer_to_pressure(pres);
}
- public double filtered_pressure() {
- if (flight_pres == MISSING)
- return MISSING;
- return barometer_to_pressure(flight_pres);
- }
-
public double ground_pressure() {
if (ground_pres == MISSING)
return MISSING;
@@ -121,22 +117,11 @@ public class AltosRecordTM extends AltosRecord {
}
public double acceleration() {
- if (acceleration != MISSING)
- return acceleration;
-
if (ground_accel == MISSING || accel == MISSING)
return MISSING;
return (ground_accel - accel) / accel_counts_per_mss();
}
- public double accel_speed() {
- if (speed != MISSING)
- return speed;
- if (flight_vel == MISSING)
- return MISSING;
- return flight_vel / (accel_counts_per_mss() * 100.0);
- }
-
public void copy(AltosRecordTM old) {
super.copy(old);
diff --git a/altoslib/AltosState.java b/altoslib/AltosState.java
index 2e4d8870..f28dd1c6 100644
--- a/altoslib/AltosState.java
+++ b/altoslib/AltosState.java
@@ -40,17 +40,17 @@ public class AltosState {
public double ground_altitude;
public double altitude;
public double height;
- public double speed;
public double acceleration;
public double battery;
public double temperature;
public double main_sense;
public double drogue_sense;
+ public double accel_speed;
public double baro_speed;
public double max_height;
public double max_acceleration;
- public double max_speed;
+ public double max_accel_speed;
public double max_baro_speed;
public AltosGPS gps;
@@ -76,20 +76,39 @@ public class AltosState {
public int speak_tick;
public double speak_altitude;
- public void init (AltosRecord cur, AltosState prev_state) {
- //int i;
- //AltosRecord prev;
+ public double speed() {
+ if (ascent)
+ return accel_speed;
+ else
+ return baro_speed;
+ }
+
+ public double max_speed() {
+ if (max_accel_speed != 0)
+ return max_accel_speed;
+ return max_baro_speed;
+ }
+ public void init (AltosRecord cur, AltosState prev_state) {
data = cur;
ground_altitude = data.ground_altitude();
- altitude = data.raw_altitude();
- height = data.filtered_height();
+
+ altitude = data.altitude();
+
+ if (data.kalman_height != AltosRecord.MISSING)
+ height = data.kalman_height;
+ else {
+ if (prev_state != null)
+ height = (prev_state.height * 15 + altitude - ground_altitude) / 16.0;
+ }
report_time = System.currentTimeMillis();
- acceleration = data.acceleration();
- speed = data.accel_speed();
+ if (data.kalman_acceleration != AltosRecord.MISSING)
+ acceleration = data.kalman_acceleration;
+ else
+ acceleration = data.acceleration();
temperature = data.temperature();
drogue_sense = data.drogue_voltage();
main_sense = data.main_voltage();
@@ -108,7 +127,7 @@ public class AltosState {
pad_alt = prev_state.pad_alt;
max_height = prev_state.max_height;
max_acceleration = prev_state.max_acceleration;
- max_speed = prev_state.max_speed;
+ max_accel_speed = prev_state.max_accel_speed;
max_baro_speed = prev_state.max_baro_speed;
imu = prev_state.imu;
mag = prev_state.mag;
@@ -119,23 +138,39 @@ public class AltosState {
time_change = (tick - prev_state.tick) / 100.0;
- /* compute barometric speed */
+ if (data.kalman_speed != AltosRecord.MISSING) {
+ baro_speed = accel_speed = data.kalman_speed;
+ } else {
+ /* compute barometric speed */
- double height_change = height - prev_state.height;
- if (data.speed != AltosRecord.MISSING)
- baro_speed = data.speed;
- else {
+ double height_change = height - prev_state.height;
if (time_change > 0)
baro_speed = (prev_state.baro_speed * 3 + (height_change / time_change)) / 4.0;
else
baro_speed = prev_state.baro_speed;
+
+ if (acceleration == AltosRecord.MISSING) {
+ /* Fill in mising acceleration value */
+ accel_speed = baro_speed;
+ if (time_change > 0)
+ acceleration = (accel_speed - prev_state.accel_speed) / time_change;
+ else
+ acceleration = prev_state.acceleration;
+ } else {
+ /* compute accelerometer speed */
+ accel_speed = prev_state.accel_speed + acceleration * time_change;
+ }
}
+
} else {
npad = 0;
ngps = 0;
gps = null;
baro_speed = 0;
+ accel_speed = 0;
time_change = 0;
+ if (acceleration == AltosRecord.MISSING)
+ acceleration = 0;
}
time = tick / 100.0;
@@ -180,8 +215,8 @@ public class AltosState {
/* Only look at accelerometer data under boost */
if (boost && acceleration > max_acceleration && acceleration != AltosRecord.MISSING)
max_acceleration = acceleration;
- if (boost && speed > max_speed && speed != AltosRecord.MISSING)
- max_speed = speed;
+ if (boost && accel_speed > max_accel_speed && accel_speed != AltosRecord.MISSING)
+ max_accel_speed = accel_speed;
if (boost && baro_speed > max_baro_speed && baro_speed != AltosRecord.MISSING)
max_baro_speed = baro_speed;
diff --git a/altoslib/AltosTelemetryRecordLegacy.java b/altoslib/AltosTelemetryRecordLegacy.java
index 21176069..43189794 100644
--- a/altoslib/AltosTelemetryRecordLegacy.java
+++ b/altoslib/AltosTelemetryRecordLegacy.java
@@ -257,9 +257,9 @@ public class AltosTelemetryRecordLegacy extends AltosTelemetryRecord {
record.accel_minus_g = map.get_int(AO_TELEM_CAL_ACCEL_MINUS, AltosRecord.MISSING);
/* flight computer values */
- record.acceleration = map.get_double(AO_TELEM_KALMAN_ACCEL, AltosRecord.MISSING, 1/16.0);
- record.speed = map.get_double(AO_TELEM_KALMAN_SPEED, AltosRecord.MISSING, 1/16.0);
- record.height = map.get_int(AO_TELEM_KALMAN_HEIGHT, AltosRecord.MISSING);
+ record.kalman_acceleration = map.get_double(AO_TELEM_KALMAN_ACCEL, AltosRecord.MISSING, 1/16.0);
+ record.kalman_speed = map.get_double(AO_TELEM_KALMAN_SPEED, AltosRecord.MISSING, 1/16.0);
+ record.kalman_height = map.get_int(AO_TELEM_KALMAN_HEIGHT, AltosRecord.MISSING);
record.flight_accel = map.get_int(AO_TELEM_ADHOC_ACCEL, AltosRecord.MISSING);
record.flight_vel = map.get_int(AO_TELEM_ADHOC_SPEED, AltosRecord.MISSING);
@@ -334,9 +334,9 @@ public class AltosTelemetryRecordLegacy extends AltosTelemetryRecord {
/* Old TeleDongle code with kalman-reporting TeleMetrum code */
if ((record.flight_vel & 0xffff0000) == 0x80000000) {
- record.speed = ((short) record.flight_vel) / 16.0;
- record.acceleration = record.flight_accel / 16.0;
- record.height = record.flight_pres;
+ record.kalman_speed = ((short) record.flight_vel) / 16.0;
+ record.kalman_acceleration = record.flight_accel / 16.0;
+ record.kalman_height = record.flight_pres;
record.flight_vel = AltosRecord.MISSING;
record.flight_pres = AltosRecord.MISSING;
record.flight_accel = AltosRecord.MISSING;
@@ -455,9 +455,9 @@ public class AltosTelemetryRecordLegacy extends AltosTelemetryRecord {
record.accel_minus_g = int16(19);
if (uint16(11) == 0x8000) {
- record.acceleration = int16(5);
- record.speed = int16(9);
- record.height = int16(13);
+ record.kalman_acceleration = int16(5);
+ record.kalman_speed = int16(9);
+ record.kalman_height = int16(13);
record.flight_accel = AltosRecord.MISSING;
record.flight_vel = AltosRecord.MISSING;
record.flight_pres = AltosRecord.MISSING;
@@ -465,9 +465,9 @@ public class AltosTelemetryRecordLegacy extends AltosTelemetryRecord {
record.flight_accel = int16(5);
record.flight_vel = uint32(9);
record.flight_pres = int16(13);
- record.acceleration = AltosRecord.MISSING;
- record.speed = AltosRecord.MISSING;
- record.height = AltosRecord.MISSING;
+ record.kalman_acceleration = AltosRecord.MISSING;
+ record.kalman_speed = AltosRecord.MISSING;
+ record.kalman_height = AltosRecord.MISSING;
}
record.gps = null;
diff --git a/altoslib/AltosTelemetryRecordMegaData.java b/altoslib/AltosTelemetryRecordMegaData.java
index 8f55d238..16a7b80c 100644
--- a/altoslib/AltosTelemetryRecordMegaData.java
+++ b/altoslib/AltosTelemetryRecordMegaData.java
@@ -83,9 +83,9 @@ public class AltosTelemetryRecordMegaData extends AltosTelemetryRecordRaw {
next.accel_plus_g = accel_plus_g;
next.accel_minus_g = accel_minus_g;
- next.acceleration = acceleration / 16.0;
- next.speed = speed / 16.0;
- next.height = height;
+ next.kalman_acceleration = acceleration / 16.0;
+ next.kalman_speed = speed / 16.0;
+ next.kalman_height = height;
next.seen |= AltosRecord.seen_flight | AltosRecord.seen_temp_volt;
diff --git a/altoslib/AltosTelemetryRecordRaw.java b/altoslib/AltosTelemetryRecordRaw.java
index fbb373d5..c21da6fc 100644
--- a/altoslib/AltosTelemetryRecordRaw.java
+++ b/altoslib/AltosTelemetryRecordRaw.java
@@ -65,7 +65,7 @@ public class AltosTelemetryRecordRaw extends AltosTelemetryRecord {
if (previous != null)
next = previous.clone();
else
- next = new AltosRecord();
+ next = new AltosRecordNone();
next.serial = serial;
next.tick = tick;
return next;
diff --git a/altoslib/AltosTelemetryRecordSensor.java b/altoslib/AltosTelemetryRecordSensor.java
index 319a91b3..f1fc156c 100644
--- a/altoslib/AltosTelemetryRecordSensor.java
+++ b/altoslib/AltosTelemetryRecordSensor.java
@@ -86,9 +86,9 @@ public class AltosTelemetryRecordSensor extends AltosTelemetryRecordRaw {
next.main = AltosRecord.MISSING;
}
- next.acceleration = acceleration / 16.0;
- next.speed = speed / 16.0;
- next.height = height;
+ next.kalman_acceleration = acceleration / 16.0;
+ next.kalman_speed = speed / 16.0;
+ next.kalman_height = height;
next.ground_pres = ground_pres;
if (type == packet_type_TM_sensor) {
diff --git a/altoslib/Makefile.am b/altoslib/Makefile.am
index b56d8af1..2579a650 100644
--- a/altoslib/Makefile.am
+++ b/altoslib/Makefile.am
@@ -46,6 +46,7 @@ AltosLib_JAVA = \
$(SRC)/AltosRecordCompanion.java \
$(SRC)/AltosRecordIterable.java \
$(SRC)/AltosRecord.java \
+ $(SRC)/AltosRecordNone.java \
$(SRC)/AltosRecordTM.java \
$(SRC)/AltosRecordMM.java \
$(SRC)/AltosReplayReader.java \
@@ -74,7 +75,8 @@ AltosLib_JAVA = \
$(SRC)/AltosDistance.java \
$(SRC)/AltosHeight.java \
$(SRC)/AltosSpeed.java \
- $(SRC)/AltosAccel.java
+ $(SRC)/AltosAccel.java \
+ $(SRC)/AltosPyro.java
JAR=AltosLib.jar