#define AO_PANIC_REBOOT 8 /* Reboot failed */
#define AO_PANIC_FLASH 9 /* Invalid flash part (or wrong blocksize) */
#define AO_PANIC_USB 10 /* Trying to send USB packet while busy */
+#define AO_PANIC_BT 11 /* Communications with bluetooth device failed */
/* Stop the operating system, beeping and blinking the reason */
void
void
ao_cmd_init(void);
+#if HAS_CMD_FILTER
+/*
+ * Provided by an external module to filter raw command lines
+ */
+uint8_t
+ao_cmd_filter(void);
+#endif
+
/*
* ao_dma.c
*/
void
ao_serial_putchar(char c) __critical;
+void
+ao_serial_drain(void) __critical;
+
#define AO_SERIAL_SPEED_4800 0
#define AO_SERIAL_SPEED_9600 1
#define AO_SERIAL_SPEED_19200 2
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 */
+};
+
+#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 {
+struct ao_telemetry_orig {
uint16_t serial;
uint16_t flight;
uint8_t flight_state;
/*
* 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 {
ao_rdf_set(uint8_t rdf);
void
-ao_telemetry_init(void);
+ao_telemetry_orig_init(void);
void
ao_telemetry_tiny_init(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
char (*pollchar)(void);
void (*putchar)(char c) __reentrant;
void (*flush)(void);
+ uint8_t echo;
};
+extern __xdata struct ao_stdio ao_stdios[];
+extern __data int8_t ao_cur_stdio;
+extern __data int8_t ao_num_stdios;
+
void
flush(void);
extern __xdata uint8_t ao_stdin_ready;
-void
+uint8_t
+ao_echo(void);
+
+int8_t
ao_add_stdio(char (*pollchar)(void),
void (*putchar)(char) __reentrant,
void (*flush)(void)) __reentrant;
/* ao_btm.c */
+/* 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)
+#if BT_LINK_ON_P1
+ __interrupt 15
+#endif
+ ;
+
+
void
ao_btm_init(void);