- int parse_int(String v) throws ParseException {
- try {
- return Integer.parseInt(v);
- } catch (NumberFormatException e) {
- throw new ParseException(v, 0);
- }
- }
-
- public AltosGPSTime(String date, String time) throws ParseException {
- String[] ymd = date.split("-");
- if (ymd.length != 3) {
- System.out.println("Error parsing GPS date " + date + " got " + ymd.length);
- throw new ParseException(date, 0);
- }
- year = parse_int(ymd[0]);
- month = parse_int(ymd[1]);
- day = parse_int(ymd[2]);
-
- String[] hms = time.split(":");
- if (hms.length != 3) {
- System.out.println("Error parsing GPS time " + time + " got " + hms.length);
- throw new ParseException(time, 0);
- }
- hour = parse_int(hms[0]);
- minute = parse_int(hms[1]);
- second = parse_int(hms[2]);
- }
-
- public AltosGPSTime() {
- year = month = day = 0;
- hour = minute = second = 0;
- }
-};
-
-class AltosGPS {
- int nsat;
- int gps_locked;
- int gps_connected;
- AltosGPSTime gps_time;
- double lat; /* degrees (+N -S) */
- double lon; /* degrees (+E -W) */
- int alt; /* m */
-
- int gps_extended; /* has extra data */
- double ground_speed; /* m/s */
- int course; /* degrees */
- double climb_rate; /* m/s */
- double hdop; /* unitless? */
- int h_error; /* m */
- int v_error; /* m */
-
-}
-
-class AltosGPSSat {
- int svid;
- int c_n0;
-}
-
-class AltosGPSTracking {
- int channels;
- AltosGPSSat[] cc_gps_sat;
-}
-
-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;
- AltosGPSTracking gps_tracking;
-
- int parse_int(String v) throws ParseException {
- try {
- return Integer.parseInt(v);
- } catch (NumberFormatException e) {
- System.out.println("error parsing int " + v);
- throw new ParseException(v, 0);
- }
- }
-
- int parse_hex(String v) throws ParseException {
- try {
- return Integer.parseInt(v, 16);
- } catch (NumberFormatException e) {
- System.out.println("error parsing hex " + v);
- throw new ParseException(v, 0);
- }
- }
-
- double parse_double(String v) throws ParseException {
- try {
- return Double.parseDouble(v);
- } catch (NumberFormatException e) {
- System.out.println("error parsing double " + v);
- throw new ParseException(v, 0);
- }
- }
-
- double parse_coord(String coord) throws ParseException {
- String[] dsf = coord.split("\\D+");
-
- if (dsf.length != 3) {
- System.out.println("error parsing coord " + coord);
- throw new ParseException(coord, 0);
- }
- int deg = parse_int(dsf[0]);
- int min = parse_int(dsf[1]);
- int frac = parse_int(dsf[2]);
-
- double r = deg + (min + frac / 10000.0) / 60.0;
- if (coord.endsWith("S") || coord.endsWith("W"))
- r = -r;
- return r;
- }
-
- String strip_suffix(String v, String suffix) {
- if (v.endsWith(suffix))
- return v.substring(0, v.length() - suffix.length());
- return v;
- }
-
- void word(String v, String m) throws ParseException {
- if (!v.equals(m)) {
- System.out.println("error matching '" + v + "' '" + m + "'");
- throw new ParseException(v, 0);
- }
- }
+/*
+ * The telemetry data stream is a bit of a mess at present, with no consistent
+ * formatting. In particular, the GPS data is formatted for viewing instead of parsing.
+ * However, the key feature is that every telemetry line contains all of the information
+ * necessary to describe the current rocket state, including the calibration values
+ * for accelerometer and barometer.
+ *
+ * GPS unlocked:
+ *
+ * VERSION 2 CALL KB0G SERIAL 51 FLIGHT 2 RSSI -68 STATUS ff STATE pad 1001 \
+ * a: 16032 p: 21232 t: 20284 v: 25160 d: 204 m: 204 fa: 16038 ga: 16032 fv: 0 \
+ * fp: 21232 gp: 21230 a+: 16049 a-: 16304 GPS 0 sat unlocked SAT 1 15 30
+ *
+ * GPS locked:
+ *
+ * VERSION 2 CALL KB0G SERIAL 51 FLIGHT 2 RSSI -71 STATUS ff STATE pad 2504 \
+ * a: 16028 p: 21220 t: 20360 v: 25004 d: 208 m: 200 fa: 16031 ga: 16032 fv: 330 \
+ * fp: 21231 gp: 21230 a+: 16049 a-: 16304 \
+ * GPS 9 sat 2010-02-13 17:16:51 35°20.0803'N 106°45.2235'W 1790m \
+ * 0.00m/s(H) 0° 0.00m/s(V) 1.0(hdop) 0(herr) 0(verr) \
+ * SAT 10 29 30 24 28 5 25 21 20 15 33 1 23 30 24 18 26 10 29 2 26
+ */