altos: Start adding new telemetry frame definitions
[fw/altos] / src / ao.h
index dad1f3dfba3b3a1ec748dd8ff51d574c104fbc8b..4895f016d663c8b93749b8600b4a2fa72cbcafd6 100644 (file)
--- a/src/ao.h
+++ b/src/ao.h
@@ -1036,12 +1036,102 @@ void
 ao_gps_report_init(void);
 
 /*
- * ao_telemetry.c
+ * ao_telemetry_orig.c
  */
 
 #define AO_MAX_CALLSIGN                        8
+#define AO_MAX_TELEMETRY               128
+
+struct ao_telemetry_generic {
+       uint16_t        serial;         /* 0 */
+       uint16_t        tick;           /* 2 */
+       uint8_t         type;           /* 4 */
+       uint8_t         payload[19];    /* 5 */
+       /* 24 */
+};
+
+#define AO_TELEMETRY_SENSOR_TELEMETRUM 0x01
+#define AO_TELEMETRY_SENSOR_TELEMINI   0x02
+#define AO_TELEMETRY_SENSOR_TELENANO   0x03
+
+struct ao_telemetry_sensor {
+       uint16_t        serial;         /*  0 */
+       uint16_t        tick;           /*  2 */
+       uint8_t         type;           /*  4 */
+
+       uint8_t         state;          /*  5 flight state */
+       int16_t         accel;          /*  6 accelerometer (TM only) */
+       int16_t         pres;           /*  8 pressure sensor */
+       int16_t         temp;           /* 10 temperature sensor */
+       int16_t         v_batt;         /* 12 battery voltage */
+       int16_t         sense_d;        /* 14 drogue continuity sense (TM/Tm) */
+       int16_t         sense_m;        /* 16 main continuity sense (TM/Tm) */
+
+       int16_t         acceleration;   /* 18 m/s² * 16 */
+       int16_t         speed;          /* 20 m/s * 16 */
+       int16_t         height;         /* 22 m */
+       /* 24 */
+};
 
-struct ao_telemetry {
+#define AO_TELEMETRY_CONSTANT          0x10
+
+struct ao_telemetry_constant {
+       uint16_t        serial;         /*  0 */
+       uint16_t        tick;           /*  2 */
+       uint8_t         type;           /*  4 */
+       uint8_t         device;         /*  5 device type */
+       uint16_t        flight;         /*  6 flight number */
+       int16_t         ground_accel;   /*  8 average ground accelerometer (TM only) */
+       int16_t         ground_pres;    /* 10 average ground barometer */
+       int16_t         accel_plus_g;   /* 12 +1g accelerometer calibration value (TM only) */
+       int16_t         accel_minus_g;  /* 14 -1g accelermeter calibration value (TM only) */
+       char            callsign[AO_MAX_CALLSIGN];      /* 16 identity */
+       /* 24 */
+};
+
+#define AO_TELEMETRY_LOCATION          0x11
+
+struct ao_telemetry_location {
+       uint16_t        serial;         /*  0 */
+       uint16_t        tick;           /*  2 */
+       uint8_t         type;           /*  4 */
+       uint8_t         flags;          /*  5 Number of sats and other flags */
+       int16_t         altitude;       /*  6 GPS reported altitude (m) */
+       int32_t         latitude;       /*  8 latitude (degrees * 10⁷) */
+       int32_t         longitude;      /* 12 longitude (degrees * 10⁷) */
+       uint8_t         year;           /* 16 (- 2000) */
+       uint8_t         month;          /* 17 (1-12) */
+       uint8_t         day;            /* 18 (1-31) */
+       uint8_t         hour;           /* 19 (0-23) */
+       uint8_t         minute;         /* 20 (0-59) */
+       uint8_t         second;         /* 21 (0-59) */
+       uint8_t         hdop;           /* 22 (m * 5) */
+       uint8_t         unused;         /* 23 */
+       /* 24 */
+};
+
+#define AO_TELEMETRY_SATELLITE         0x12
+
+struct ao_telemetry_satellite {
+       uint16_t        serial;         /*  0 */
+       uint16_t        tick;           /*  2 */
+       uint8_t         type;           /*  4 */
+       uint8_t         channels;       /*  5 number of reported sats */
+       uint8_t         sats_0_1[3];    /*  6 reported sats 0 and 1 */
+       uint8_t         sats_2_3[3];
+       uint8_t         sats_4_5[3];
+       uint8_t         sats_6_7[3];
+       uint8_t         sats_8_9[3];
+       uint8_t         sats_10_11[3];
+       /* 24 */
+};
+
+#define AO_SAT_0_SSID(s)       ((s)[0] & 0x3f)
+#define AO_SAT_0_C_N_1(s)      ((((s)[0] & 0xc0) >> 2) | ((s)[1] & 0x0f))
+#define AO_SAT_1_SSID(s)       ((((s)[1] & 0xf0) >> 2) | ((s)[2] & 0x03))
+#define AO_SAT_1_C_N_1(s)      (((s)[2] & 0xfc) >> 2)
+
+struct ao_telemetry_orig {
        uint16_t                serial;
        uint16_t                flight;
        uint8_t                 flight_state;
@@ -1079,10 +1169,15 @@ struct ao_telemetry_tiny {
 /*
  * ao_radio_recv tacks on rssi and status bytes
  */
-struct ao_telemetry_recv {
-       struct ao_telemetry     telemetry;
-       int8_t                  rssi;
-       uint8_t                 status;
+
+struct ao_telemetry_raw_recv {
+       uint8_t                 packet[AO_MAX_TELEMETRY + 2];
+};
+
+struct ao_telemetry_orig_recv {
+       struct ao_telemetry_orig        telemetry_orig;
+       int8_t                          rssi;
+       uint8_t                         status;
 };
 
 struct ao_telemetry_tiny_recv {
@@ -1104,7 +1199,7 @@ void
 ao_rdf_set(uint8_t rdf);
 
 void
-ao_telemetry_init(void);
+ao_telemetry_orig_init(void);
 
 void
 ao_telemetry_tiny_init(void);
@@ -1160,7 +1255,7 @@ void
 ao_monitor(void);
 
 #define AO_MONITORING_OFF      0
-#define AO_MONITORING_FULL     1
+#define AO_MONITORING_ORIG     1
 #define AO_MONITORING_TINY     2
 
 void
@@ -1194,7 +1289,7 @@ extern __xdata uint8_t ao_stdin_ready;
 uint8_t
 ao_echo(void);
 
-void
+int8_t
 ao_add_stdio(char (*pollchar)(void),
             void (*putchar)(char) __reentrant,
             void (*flush)(void)) __reentrant;
@@ -1367,9 +1462,17 @@ ao_packet_slave_init(uint8_t enable);
 
 /* ao_btm.c */
 
-/* Shared by USB, so the USB code calls this function */
+/* If bt_link is on P2, this interrupt is shared by USB, so the USB
+ * code calls this function. Otherwise, it's a regular ISR.
+ */
+
 void
-ao_btm_isr(void);
+ao_btm_isr(void)
+#if BT_LINK_ON_P1
+       __interrupt 15
+#endif
+       ;
+
 
 void
 ao_btm_init(void);