From 392a3107b9e9cc8c1ea51df6ff5ec54817adbc65 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 26 Mar 2012 20:11:34 -0700 Subject: [PATCH] altosui: Restructure telemetry classes to be more sane * Make AltosTelemetryRecord be a class, rather than an interface. * Inherit from this for AltosTelemetryRecordLegacy and AltosTelemetryRecordRaw. * Remove bogus AltosTelemetryRecordGeneral class. Signed-off-by: Keith Packard --- altosui/AltosTelemetry.java | 2 +- altosui/AltosTelemetryRecord.java | 109 +++++++++- altosui/AltosTelemetryRecordGeneral.java | 43 ---- altosui/AltosTelemetryRecordLegacy.java | 248 ++++++++++++----------- altosui/AltosTelemetryRecordRaw.java | 89 +------- altosui/Makefile.am | 1 - 6 files changed, 241 insertions(+), 251 deletions(-) delete mode 100644 altosui/AltosTelemetryRecordGeneral.java diff --git a/altosui/AltosTelemetry.java b/altosui/AltosTelemetry.java index a05269f4..0052ef04 100644 --- a/altosui/AltosTelemetry.java +++ b/altosui/AltosTelemetry.java @@ -234,7 +234,7 @@ public class AltosTelemetry extends AltosRecord { final static String AO_TELEM_SAT_C_N_0 = "s_c"; static public AltosRecord parse(String line, AltosRecord previous) throws ParseException, AltosCRCException { - AltosTelemetryRecord r = AltosTelemetryRecordGeneral.parse(line); + AltosTelemetryRecord r = AltosTelemetryRecord.parse(line); return r.update_state(previous); } diff --git a/altosui/AltosTelemetryRecord.java b/altosui/AltosTelemetryRecord.java index cfac309a..2e6b5ead 100644 --- a/altosui/AltosTelemetryRecord.java +++ b/altosui/AltosTelemetryRecord.java @@ -16,8 +16,113 @@ */ package altosui; +import java.lang.*; +import java.text.*; -public interface AltosTelemetryRecord { +public abstract class AltosTelemetryRecord { - public AltosRecord update_state(AltosRecord previous); + long received_time; + abstract public AltosRecord update_state(AltosRecord previous); + + static boolean cksum(int[] bytes) { + int sum = 0x5a; + for (int i = 1; i < bytes.length - 1; i++) + sum += bytes[i]; + sum &= 0xff; + return sum == bytes[bytes.length - 1]; + } + + final static int PKT_APPEND_STATUS_1_CRC_OK = (1 << 7); + final static int PKT_APPEND_STATUS_1_LQI_MASK = (0x7f); + final static int PKT_APPEND_STATUS_1_LQI_SHIFT = 0; + + final static int packet_type_TM_sensor = 0x01; + final static int packet_type_Tm_sensor = 0x02; + final static int packet_type_Tn_sensor = 0x03; + final static int packet_type_configuration = 0x04; + final static int packet_type_location = 0x05; + final static int packet_type_satellite = 0x06; + final static int packet_type_companion = 0x07; + + static AltosTelemetryRecord parse_hex(String hex) throws ParseException, AltosCRCException { + AltosTelemetryRecord r; + + int[] bytes; + try { + bytes = Altos.hexbytes(hex); + } catch (NumberFormatException ne) { + throw new ParseException(ne.getMessage(), 0); + } + + /* one for length, one for checksum */ + if (bytes[0] != bytes.length - 2) + throw new ParseException(String.format("invalid length %d != %d\n", + bytes[0], + bytes.length - 2), 0); + if (!cksum(bytes)) + throw new ParseException(String.format("invalid line \"%s\"", hex), 0); + + int rssi = Altos.int8(bytes, bytes.length - 3) / 2 - 74; + int status = Altos.uint8(bytes, bytes.length - 2); + + if ((status & PKT_APPEND_STATUS_1_CRC_OK) == 0) + throw new AltosCRCException(rssi); + + /* length, data ..., rssi, status, checksum -- 4 bytes extra */ + switch (bytes.length) { + case Altos.ao_telemetry_standard_len + 4: + int type = Altos.uint8(bytes, 4 + 1); + switch (type) { + case packet_type_TM_sensor: + case packet_type_Tm_sensor: + case packet_type_Tn_sensor: + r = new AltosTelemetryRecordSensor(bytes, rssi); + break; + case packet_type_configuration: + r = new AltosTelemetryRecordConfiguration(bytes); + break; + case packet_type_location: + r = new AltosTelemetryRecordLocation(bytes); + break; + case packet_type_satellite: + r = new AltosTelemetryRecordSatellite(bytes); + break; + case packet_type_companion: + r = new AltosTelemetryRecordCompanion(bytes); + break; + default: + r = new AltosTelemetryRecordRaw(bytes); + break; + } + break; + case Altos.ao_telemetry_0_9_len + 4: + r = new AltosTelemetryRecordLegacy(bytes, rssi, status); + break; + case Altos.ao_telemetry_0_8_len + 4: + r = new AltosTelemetryRecordLegacy(bytes, rssi, status); + break; + default: + throw new ParseException(String.format("Invalid packet length %d", bytes.length), 0); + } + r.received_time = System.currentTimeMillis(); + return r; + } + + public static AltosTelemetryRecord parse(String line) throws ParseException, AltosCRCException { + AltosTelemetryRecord r; + + String[] word = line.split("\\s+"); + int i =0; + if (word[i].equals("CRC") && word[i+1].equals("INVALID")) { + i += 2; + AltosParse.word(word[i++], "RSSI"); + throw new AltosCRCException(AltosParse.parse_int(word[i++])); + } + + if (word[i].equals("TELEM")) + r = parse_hex(word[i+1]); + else + r = new AltosTelemetryRecordLegacy(line); + return r; + } } diff --git a/altosui/AltosTelemetryRecordGeneral.java b/altosui/AltosTelemetryRecordGeneral.java deleted file mode 100644 index 722baba3..00000000 --- a/altosui/AltosTelemetryRecordGeneral.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright © 2011 Keith Packard - * - * 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 altosui; - -import java.lang.*; -import java.text.*; -import java.util.HashMap; - -public class AltosTelemetryRecordGeneral { - - static AltosTelemetryRecord parse(String line) throws ParseException, AltosCRCException { - AltosTelemetryRecord r; - - String[] word = line.split("\\s+"); - int i =0; - if (word[i].equals("CRC") && word[i+1].equals("INVALID")) { - i += 2; - AltosParse.word(word[i++], "RSSI"); - throw new AltosCRCException(AltosParse.parse_int(word[i++])); - } - - if (word[i].equals("TELEM")) - r = AltosTelemetryRecordRaw.parse(word[i+1]); - else - r = new AltosTelemetryRecordLegacy(line); - return r; - } -} diff --git a/altosui/AltosTelemetryRecordLegacy.java b/altosui/AltosTelemetryRecordLegacy.java index f2f63358..a72ebb0f 100644 --- a/altosui/AltosTelemetryRecordLegacy.java +++ b/altosui/AltosTelemetryRecordLegacy.java @@ -84,7 +84,7 @@ import java.util.HashMap; * */ -public class AltosTelemetryRecordLegacy extends AltosRecord implements AltosTelemetryRecord { +public class AltosTelemetryRecordLegacy extends AltosTelemetryRecord { /* * General header fields * @@ -232,152 +232,156 @@ public class AltosTelemetryRecordLegacy extends AltosRecord implements AltosTele final static String AO_TELEM_SAT_SVID = "s_v"; final static String AO_TELEM_SAT_C_N_0 = "s_c"; + AltosRecord record; + private void parse_v4(String[] words, int i) throws ParseException { AltosTelemetryMap map = new AltosTelemetryMap(words, i); - callsign = map.get_string(AO_TELEM_CALL, "N0CALL"); - serial = map.get_int(AO_TELEM_SERIAL, MISSING); - flight = map.get_int(AO_TELEM_FLIGHT, MISSING); - rssi = map.get_int(AO_TELEM_RSSI, MISSING); - state = Altos.state(map.get_string(AO_TELEM_STATE, "invalid")); - tick = map.get_int(AO_TELEM_TICK, 0); + record.callsign = map.get_string(AO_TELEM_CALL, "N0CALL"); + record.serial = map.get_int(AO_TELEM_SERIAL, AltosRecord.MISSING); + record.flight = map.get_int(AO_TELEM_FLIGHT, AltosRecord.MISSING); + record.rssi = map.get_int(AO_TELEM_RSSI, AltosRecord.MISSING); + record.state = Altos.state(map.get_string(AO_TELEM_STATE, "invalid")); + record.tick = map.get_int(AO_TELEM_TICK, 0); /* raw sensor values */ - accel = map.get_int(AO_TELEM_RAW_ACCEL, MISSING); - pres = map.get_int(AO_TELEM_RAW_BARO, MISSING); - temp = map.get_int(AO_TELEM_RAW_THERMO, MISSING); - batt = map.get_int(AO_TELEM_RAW_BATT, MISSING); - drogue = map.get_int(AO_TELEM_RAW_DROGUE, MISSING); - main = map.get_int(AO_TELEM_RAW_MAIN, MISSING); + record.accel = map.get_int(AO_TELEM_RAW_ACCEL, AltosRecord.MISSING); + record.pres = map.get_int(AO_TELEM_RAW_BARO, AltosRecord.MISSING); + record.temp = map.get_int(AO_TELEM_RAW_THERMO, AltosRecord.MISSING); + record.batt = map.get_int(AO_TELEM_RAW_BATT, AltosRecord.MISSING); + record.drogue = map.get_int(AO_TELEM_RAW_DROGUE, AltosRecord.MISSING); + record.main = map.get_int(AO_TELEM_RAW_MAIN, AltosRecord.MISSING); /* sensor calibration information */ - ground_accel = map.get_int(AO_TELEM_CAL_ACCEL_GROUND, MISSING); - ground_pres = map.get_int(AO_TELEM_CAL_BARO_GROUND, MISSING); - accel_plus_g = map.get_int(AO_TELEM_CAL_ACCEL_PLUS, MISSING); - accel_minus_g = map.get_int(AO_TELEM_CAL_ACCEL_MINUS, MISSING); + record.ground_accel = map.get_int(AO_TELEM_CAL_ACCEL_GROUND, AltosRecord.MISSING); + record.ground_pres = map.get_int(AO_TELEM_CAL_BARO_GROUND, AltosRecord.MISSING); + record.accel_plus_g = map.get_int(AO_TELEM_CAL_ACCEL_PLUS, AltosRecord.MISSING); + record.accel_minus_g = map.get_int(AO_TELEM_CAL_ACCEL_MINUS, AltosRecord.MISSING); /* flight computer values */ - acceleration = map.get_double(AO_TELEM_KALMAN_ACCEL, MISSING, 1/16.0); - speed = map.get_double(AO_TELEM_KALMAN_SPEED, MISSING, 1/16.0); - height = map.get_int(AO_TELEM_KALMAN_HEIGHT, MISSING); + 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); - flight_accel = map.get_int(AO_TELEM_ADHOC_ACCEL, MISSING); - flight_vel = map.get_int(AO_TELEM_ADHOC_SPEED, MISSING); - flight_pres = map.get_int(AO_TELEM_ADHOC_BARO, 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); + record.flight_pres = map.get_int(AO_TELEM_ADHOC_BARO, AltosRecord.MISSING); if (map.has(AO_TELEM_GPS_STATE)) { - gps = new AltosGPS(map); - new_gps = true; + record.gps = new AltosGPS(map); + record.new_gps = true; } else - gps = null; + record.gps = null; } private void parse_legacy(String[] words, int i) throws ParseException { AltosParse.word (words[i++], "CALL"); - callsign = words[i++]; + record.callsign = words[i++]; AltosParse.word (words[i++], "SERIAL"); - serial = AltosParse.parse_int(words[i++]); + record.serial = AltosParse.parse_int(words[i++]); - if (version >= 2) { + if (record.version >= 2) { AltosParse.word (words[i++], "FLIGHT"); - flight = AltosParse.parse_int(words[i++]); + record.flight = AltosParse.parse_int(words[i++]); } else - flight = 0; + record.flight = 0; AltosParse.word(words[i++], "RSSI"); - rssi = AltosParse.parse_int(words[i++]); + record.rssi = AltosParse.parse_int(words[i++]); /* Older telemetry data had mis-computed RSSI value */ - if (version <= 2) - rssi = (rssi + 74) / 2 - 74; + if (record.version <= 2) + record.rssi = (record.rssi + 74) / 2 - 74; AltosParse.word(words[i++], "STATUS"); - status = AltosParse.parse_hex(words[i++]); + record.status = AltosParse.parse_hex(words[i++]); AltosParse.word(words[i++], "STATE"); - state = Altos.state(words[i++]); + record.state = Altos.state(words[i++]); - tick = AltosParse.parse_int(words[i++]); + record.tick = AltosParse.parse_int(words[i++]); AltosParse.word(words[i++], "a:"); - accel = AltosParse.parse_int(words[i++]); + record.accel = AltosParse.parse_int(words[i++]); AltosParse.word(words[i++], "p:"); - pres = AltosParse.parse_int(words[i++]); + record.pres = AltosParse.parse_int(words[i++]); AltosParse.word(words[i++], "t:"); - temp = AltosParse.parse_int(words[i++]); + record.temp = AltosParse.parse_int(words[i++]); AltosParse.word(words[i++], "v:"); - batt = AltosParse.parse_int(words[i++]); + record.batt = AltosParse.parse_int(words[i++]); AltosParse.word(words[i++], "d:"); - drogue = AltosParse.parse_int(words[i++]); + record.drogue = AltosParse.parse_int(words[i++]); AltosParse.word(words[i++], "m:"); - main = AltosParse.parse_int(words[i++]); + record.main = AltosParse.parse_int(words[i++]); AltosParse.word(words[i++], "fa:"); - flight_accel = AltosParse.parse_int(words[i++]); + record.flight_accel = AltosParse.parse_int(words[i++]); AltosParse.word(words[i++], "ga:"); - ground_accel = AltosParse.parse_int(words[i++]); + record.ground_accel = AltosParse.parse_int(words[i++]); AltosParse.word(words[i++], "fv:"); - flight_vel = AltosParse.parse_int(words[i++]); + record.flight_vel = AltosParse.parse_int(words[i++]); AltosParse.word(words[i++], "fp:"); - flight_pres = AltosParse.parse_int(words[i++]); + record.flight_pres = AltosParse.parse_int(words[i++]); /* Old TeleDongle code with kalman-reporting TeleMetrum code */ - if ((flight_vel & 0xffff0000) == 0x80000000) { - speed = ((short) flight_vel) / 16.0; - acceleration = flight_accel / 16.0; - height = flight_pres; - flight_vel = MISSING; - flight_pres = MISSING; - flight_accel = MISSING; + 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.flight_vel = AltosRecord.MISSING; + record.flight_pres = AltosRecord.MISSING; + record.flight_accel = AltosRecord.MISSING; } AltosParse.word(words[i++], "gp:"); - ground_pres = AltosParse.parse_int(words[i++]); + record.ground_pres = AltosParse.parse_int(words[i++]); - if (version >= 1) { + if (record.version >= 1) { AltosParse.word(words[i++], "a+:"); - accel_plus_g = AltosParse.parse_int(words[i++]); + record.accel_plus_g = AltosParse.parse_int(words[i++]); AltosParse.word(words[i++], "a-:"); - accel_minus_g = AltosParse.parse_int(words[i++]); + record.accel_minus_g = AltosParse.parse_int(words[i++]); } else { - accel_plus_g = ground_accel; - accel_minus_g = ground_accel + 530; + record.accel_plus_g = record.ground_accel; + record.accel_minus_g = record.ground_accel + 530; } - gps = new AltosGPS(words, i, version); - new_gps = true; + record.gps = new AltosGPS(words, i, record.version); + record.new_gps = true; } public AltosTelemetryRecordLegacy(String line) throws ParseException, AltosCRCException { String[] words = line.split("\\s+"); int i = 0; + record = new AltosRecord(); + if (words[i].equals("CRC") && words[i+1].equals("INVALID")) { i += 2; AltosParse.word(words[i++], "RSSI"); - rssi = AltosParse.parse_int(words[i++]); - throw new AltosCRCException(rssi); + record.rssi = AltosParse.parse_int(words[i++]); + throw new AltosCRCException(record.rssi); } if (words[i].equals("CALL")) { - version = 0; + record.version = 0; } else { AltosParse.word (words[i++], "VERSION"); - version = AltosParse.parse_int(words[i++]); + record.version = AltosParse.parse_int(words[i++]); } - if (version < 4) + if (record.version < 4) parse_legacy(words, i); else parse_v4(words, i); @@ -418,72 +422,74 @@ public class AltosTelemetryRecordLegacy extends AltosRecord implements AltosTele static final int AO_GPS_COURSE_VALID = (1 << 7); public AltosTelemetryRecordLegacy(int[] in_bytes, int in_rssi, int in_status) { + record = new AltosRecord(); + bytes = in_bytes; - version = 4; + record.version = 4; adjust = 0; if (bytes.length == Altos.ao_telemetry_0_8_len + 4) { - serial = uint8(0); + record.serial = uint8(0); adjust = -1; } else - serial = uint16(0); - - seen = seen_flight | seen_sensor | seen_temp_volt | seen_deploy; - - callsign = string(62, 8); - flight = uint16(2); - rssi = in_rssi; - status = in_status; - state = uint8(4); - tick = uint16(21); - accel = int16(23); - pres = int16(25); - temp = int16(27); - batt = int16(29); - drogue = int16(31); - main = int16(33); + record.serial = uint16(0); + + record.seen = AltosRecord.seen_flight | AltosRecord.seen_sensor | AltosRecord.seen_temp_volt | AltosRecord.seen_deploy; + + record.callsign = string(62, 8); + record.flight = uint16(2); + record.rssi = in_rssi; + record.status = in_status; + record.state = uint8(4); + record.tick = uint16(21); + record.accel = int16(23); + record.pres = int16(25); + record.temp = int16(27); + record.batt = int16(29); + record.drogue = int16(31); + record.main = int16(33); - ground_accel = int16(7); - ground_pres = int16(15); - accel_plus_g = int16(17); - accel_minus_g = int16(19); + record.ground_accel = int16(7); + record.ground_pres = int16(15); + record.accel_plus_g = int16(17); + record.accel_minus_g = int16(19); if (uint16(11) == 0x8000) { - acceleration = int16(5); - speed = int16(9); - height = int16(13); - flight_accel = MISSING; - flight_vel = MISSING; - flight_pres = MISSING; + record.acceleration = int16(5); + record.speed = int16(9); + record.height = int16(13); + record.flight_accel = AltosRecord.MISSING; + record.flight_vel = AltosRecord.MISSING; + record.flight_pres = AltosRecord.MISSING; } else { - flight_accel = int16(5); - flight_vel = uint32(9); - flight_pres = int16(13); - acceleration = MISSING; - speed = MISSING; - height = MISSING; + 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; } - gps = null; + record.gps = null; int gps_flags = uint8(41); if ((gps_flags & (AO_GPS_VALID|AO_GPS_RUNNING)) != 0) { - gps = new AltosGPS(); - new_gps = true; - - seen |= seen_gps_time | seen_gps_lat | seen_gps_lon; - gps.nsat = (gps_flags & AO_GPS_NUM_SAT_MASK); - gps.locked = (gps_flags & AO_GPS_VALID) != 0; - gps.connected = true; - gps.lat = uint32(42) / 1.0e7; - gps.lon = uint32(46) / 1.0e7; - gps.alt = int16(50); - gps.ground_speed = uint16(52) / 100.0; - gps.course = uint8(54) * 2; - gps.hdop = uint8(55) / 5.0; - gps.h_error = uint16(58); - gps.v_error = uint16(60); + record.gps = new AltosGPS(); + record.new_gps = true; + + record.seen |= record.seen_gps_time | record.seen_gps_lat | record.seen_gps_lon; + record.gps.nsat = (gps_flags & AO_GPS_NUM_SAT_MASK); + record.gps.locked = (gps_flags & AO_GPS_VALID) != 0; + record.gps.connected = true; + record.gps.lat = uint32(42) / 1.0e7; + record.gps.lon = uint32(46) / 1.0e7; + record.gps.alt = int16(50); + record.gps.ground_speed = uint16(52) / 100.0; + record.gps.course = uint8(54) * 2; + record.gps.hdop = uint8(55) / 5.0; + record.gps.h_error = uint16(58); + record.gps.v_error = uint16(60); int n_tracking_reported = uint8(70); if (n_tracking_reported > 12) @@ -494,22 +500,22 @@ public class AltosTelemetryRecordLegacy extends AltosRecord implements AltosTele n_tracking_actual++; } if (n_tracking_actual > 0) { - gps.cc_gps_sat = new AltosGPSSat[n_tracking_actual]; + record.gps.cc_gps_sat = new AltosGPSSat[n_tracking_actual]; n_tracking_actual = 0; for (int i = 0; i < n_tracking_reported; i++) { int svid = uint8(71 + i*2); int c_n0 = uint8(72 + i*2); if (svid != 0) - gps.cc_gps_sat[n_tracking_actual++] = new AltosGPSSat(svid, c_n0); + record.gps.cc_gps_sat[n_tracking_actual++] = new AltosGPSSat(svid, c_n0); } } } - time = 0.0; + record.time = 0.0; } public AltosRecord update_state(AltosRecord previous) { - return this; + return record; } } diff --git a/altosui/AltosTelemetryRecordRaw.java b/altosui/AltosTelemetryRecordRaw.java index fb2b495c..08c85e85 100644 --- a/altosui/AltosTelemetryRecordRaw.java +++ b/altosui/AltosTelemetryRecordRaw.java @@ -21,94 +21,13 @@ import java.lang.*; import java.text.*; import java.util.HashMap; -public class AltosTelemetryRecordRaw implements AltosTelemetryRecord { +public class AltosTelemetryRecordRaw extends AltosTelemetryRecord { int[] bytes; int serial; int tick; int type; - final static int packet_type_TM_sensor = 0x01; - final static int packet_type_Tm_sensor = 0x02; - final static int packet_type_Tn_sensor = 0x03; - final static int packet_type_configuration = 0x04; - final static int packet_type_location = 0x05; - final static int packet_type_satellite = 0x06; - final static int packet_type_companion = 0x07; - - final static int PKT_APPEND_STATUS_1_CRC_OK = (1 << 7); - final static int PKT_APPEND_STATUS_1_LQI_MASK = (0x7f); - final static int PKT_APPEND_STATUS_1_LQI_SHIFT = 0; - - static boolean cksum(int[] bytes) { - int sum = 0x5a; - for (int i = 1; i < bytes.length - 1; i++) - sum += bytes[i]; - sum &= 0xff; - return sum == bytes[bytes.length - 1]; - } - - public static AltosTelemetryRecord parse (String hex) throws ParseException, AltosCRCException { - AltosTelemetryRecord r; - - int[] bytes; - try { - bytes = Altos.hexbytes(hex); - } catch (NumberFormatException ne) { - throw new ParseException(ne.getMessage(), 0); - } - - /* one for length, one for checksum */ - if (bytes[0] != bytes.length - 2) - throw new ParseException(String.format("invalid length %d != %d\n", - bytes[0], - bytes.length - 2), 0); - if (!cksum(bytes)) - throw new ParseException(String.format("invalid line \"%s\"", hex), 0); - - int rssi = Altos.int8(bytes, bytes.length - 3) / 2 - 74; - int status = Altos.uint8(bytes, bytes.length - 2); - - if ((status & PKT_APPEND_STATUS_1_CRC_OK) == 0) - throw new AltosCRCException(rssi); - - /* length, data ..., rssi, status, checksum -- 4 bytes extra */ - switch (bytes.length) { - case Altos.ao_telemetry_standard_len + 4: - int type = Altos.uint8(bytes, 4 + 1); - switch (type) { - case packet_type_TM_sensor: - case packet_type_Tm_sensor: - case packet_type_Tn_sensor: - r = new AltosTelemetryRecordSensor(bytes, rssi); - break; - case packet_type_configuration: - r = new AltosTelemetryRecordConfiguration(bytes); - break; - case packet_type_location: - r = new AltosTelemetryRecordLocation(bytes); - break; - case packet_type_satellite: - r = new AltosTelemetryRecordSatellite(bytes); - break; - case packet_type_companion: - r = new AltosTelemetryRecordCompanion(bytes); - break; - default: - r = new AltosTelemetryRecordRaw(bytes); - break; - } - break; - case Altos.ao_telemetry_0_9_len + 4: - r = new AltosTelemetryRecordLegacy(bytes, rssi, status); - break; - case Altos.ao_telemetry_0_8_len + 4: - r = new AltosTelemetryRecordLegacy(bytes, rssi, status); - break; - default: - throw new ParseException(String.format("Invalid packet length %d", bytes.length), 0); - } - return r; - } + long received_time; public int int8(int off) { return Altos.int8(bytes, off + 1); @@ -151,4 +70,8 @@ public class AltosTelemetryRecordRaw implements AltosTelemetryRecord { next.tick = tick; return next; } + + public long received_time() { + return received_time; + } } diff --git a/altosui/Makefile.am b/altosui/Makefile.am index fc024fff..3138efac 100644 --- a/altosui/Makefile.am +++ b/altosui/Makefile.am @@ -86,7 +86,6 @@ altosui_JAVA = \ AltosRecordIterable.java \ AltosTelemetryReader.java \ AltosTelemetryRecord.java \ - AltosTelemetryRecordGeneral.java \ AltosTelemetryRecordRaw.java \ AltosTelemetryRecordSensor.java \ AltosTelemetryRecordConfiguration.java \ -- 2.30.2