add site map tab, at least for QRS launches
[fw/altos] / ao-tools / altosui / AltosTelemetry.java
index 34b4099f77fc9ad0cad1dd35da9820058940ff6f..be22dac60aa308c8e170f960b3718f79c6088bdd 100644 (file)
@@ -21,7 +21,9 @@ import java.lang.*;
 import java.text.*;
 import java.util.HashMap;
 import altosui.AltosConvert;
+import altosui.AltosRecord;
 import altosui.AltosGPS;
+import altosui.AltosCRCException;
 
 /*
  * Telemetry data contents
@@ -51,76 +53,23 @@ import altosui.AltosGPS;
  *     SAT 10   29  30  24  28   5  25  21  20  15  33   1  23  30  24  18  26  10  29   2  26
  */
 
-public class AltosTelemetry {
-       int     version;
-       String  callsign;
-       int     serial;
-       int     flight;
-       int     rssi;
-       int     status;
-       String  state;
-       int     tick;
-       int     accel;
-       int     pres;
-       int     temp;
-       int     batt;
-       int     drogue;
-       int     main;
-       int     flight_accel;
-       int     ground_accel;
-       int     flight_vel;
-       int     flight_pres;
-       int     ground_pres;
-       int     accel_plus_g;
-       int     accel_minus_g;
-       AltosGPS        gps;
-
-       public static final int ao_flight_startup = 0;
-       public static final int ao_flight_idle = 1;
-       public static final int ao_flight_pad = 2;
-       public static final int ao_flight_boost = 3;
-       public static final int ao_flight_fast = 4;
-       public static final int ao_flight_coast = 5;
-       public static final int ao_flight_drogue = 6;
-       public static final int ao_flight_main = 7;
-       public static final int ao_flight_landed = 8;
-       public static final int ao_flight_invalid = 9;
-
-       static HashMap<String,Integer>  states = new HashMap<String,Integer>();
-       {
-               states.put("startup", ao_flight_startup);
-               states.put("idle", ao_flight_idle);
-               states.put("pad", ao_flight_pad);
-               states.put("boost", ao_flight_boost);
-               states.put("fast", ao_flight_fast);
-               states.put("coast", ao_flight_coast);
-               states.put("drogue", ao_flight_drogue);
-               states.put("main", ao_flight_main);
-               states.put("landed", ao_flight_landed);
-               states.put("invalid", ao_flight_invalid);
-       }
-
-       public int state() {
-               if (states.containsKey(state))
-                       return states.get(state);
-               return ao_flight_invalid;
-       }
-
-       public double altitude() {
-               return AltosConvert.cc_pressure_to_altitude(AltosConvert.cc_barometer_to_pressure(pres));
-       }
-
-       public double pad_altitude() {
-               return AltosConvert.cc_pressure_to_altitude(AltosConvert.cc_barometer_to_pressure(ground_pres));
-       }
-
-       public AltosTelemetry(String line) throws ParseException {
+public class AltosTelemetry extends AltosRecord {
+       public AltosTelemetry(String line) throws ParseException, AltosCRCException {
                String[] words = line.split("\\s+");
-
                int     i = 0;
 
-               AltosParse.word (words[i++], "VERSION");
-               version = AltosParse.parse_int(words[i++]);
+               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);
+               }
+               if (words[i].equals("CALL")) {
+                       version = 0;
+               } else {
+                       AltosParse.word (words[i++], "VERSION");
+                       version = AltosParse.parse_int(words[i++]);
+               }
 
                AltosParse.word (words[i++], "CALL");
                callsign = words[i++];
@@ -128,17 +77,24 @@ public class AltosTelemetry {
                AltosParse.word (words[i++], "SERIAL");
                serial = AltosParse.parse_int(words[i++]);
 
-               AltosParse.word (words[i++], "FLIGHT");
-               flight = AltosParse.parse_int(words[i++]);
+               if (version >= 2) {
+                       AltosParse.word (words[i++], "FLIGHT");
+                       flight = AltosParse.parse_int(words[i++]);
+               } else
+                       flight = 0;
 
                AltosParse.word(words[i++], "RSSI");
                rssi = AltosParse.parse_int(words[i++]);
 
+               /* Older telemetry data had mis-computed RSSI value */
+               if (version <= 2)
+                       rssi = (rssi + 74) / 2 - 74;
+
                AltosParse.word(words[i++], "STATUS");
                status = AltosParse.parse_hex(words[i++]);
 
                AltosParse.word(words[i++], "STATE");
-               state = words[i++];
+               state = Altos.state(words[i++]);
 
                tick = AltosParse.parse_int(words[i++]);
 
@@ -175,11 +131,17 @@ public class AltosTelemetry {
                AltosParse.word(words[i++], "gp:");
                ground_pres = AltosParse.parse_int(words[i++]);
 
-               AltosParse.word(words[i++], "a+:");
-               accel_plus_g = AltosParse.parse_int(words[i++]);
+               if (version >= 1) {
+                       AltosParse.word(words[i++], "a+:");
+                       accel_plus_g = AltosParse.parse_int(words[i++]);
 
-               AltosParse.word(words[i++], "a-:");
-               accel_minus_g = AltosParse.parse_int(words[i++]);
+                       AltosParse.word(words[i++], "a-:");
+                       accel_minus_g = AltosParse.parse_int(words[i++]);
+               } else {
+                       accel_plus_g = ground_accel;
+                       accel_minus_g = ground_accel + 530;
+               }
 
+               gps = new AltosGPS(words, i, version);
        }
 }