altos/altosui: Add pad orientation configure option
[fw/altos] / src / ao.h
index 2d2bbf82ac247459cbf68f1e5e5101a28ba4886d..b315af7a9672208d57d7bbc8fd062762260f5e7e 100644 (file)
--- a/src/ao.h
+++ b/src/ao.h
@@ -107,6 +107,7 @@ ao_start_scheduler(void);
 #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
@@ -366,10 +367,10 @@ enum ao_cmd_status {
        ao_cmd_syntax_error = 2,
 };
 
-extern __xdata uint16_t ao_cmd_lex_i;
-extern __xdata uint32_t ao_cmd_lex_u32;
-extern __xdata char    ao_cmd_lex_c;
-extern __xdata enum ao_cmd_status ao_cmd_status;
+extern __pdata uint16_t ao_cmd_lex_i;
+extern __pdata uint32_t ao_cmd_lex_u32;
+extern __pdata char    ao_cmd_lex_c;
+extern __pdata enum ao_cmd_status ao_cmd_status;
 
 void
 ao_cmd_lex(void);
@@ -394,7 +395,7 @@ ao_match_word(__code char *word);
 
 struct ao_cmds {
        void            (*func)(void);
-       const char      *help;
+       __code char     *help;
 };
 
 void
@@ -403,6 +404,14 @@ ao_cmd_register(__code struct ao_cmds *cmds);
 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
  */
@@ -455,16 +464,16 @@ ao_mutex_put(__xdata uint8_t *ao_mutex) __reentrant;
  */
 
 /* Total bytes of available storage */
-extern __xdata uint32_t        ao_storage_total;
+extern __pdata uint32_t        ao_storage_total;
 
 /* Block size - device is erased in these units. At least 256 bytes */
-extern __xdata uint32_t        ao_storage_block;
+extern __pdata uint32_t        ao_storage_block;
 
 /* Byte offset of config block. Will be ao_storage_block bytes long */
-extern __xdata uint32_t        ao_storage_config;
+extern __pdata uint32_t        ao_storage_config;
 
 /* Storage unit size - device reads and writes must be within blocks of this size. Usually 256 bytes. */
-extern __xdata uint16_t ao_storage_unit;
+extern __pdata uint16_t ao_storage_unit;
 
 #define AO_STORAGE_ERASE_LOG   (ao_storage_config + AO_CONFIG_MAX_SIZE)
 
@@ -526,7 +535,7 @@ extern __pdata uint32_t ao_log_current_pos;
 extern __pdata uint32_t ao_log_end_pos;
 extern __pdata uint32_t ao_log_start_pos;
 extern __xdata uint8_t ao_log_running;
-extern __xdata enum flight_state ao_log_state;
+extern __pdata enum flight_state ao_log_state;
 
 /* required functions from the underlying log system */
 
@@ -698,7 +707,7 @@ enum ao_flight_state {
 extern __pdata enum ao_flight_state    ao_flight_state;
 
 extern __pdata uint16_t                        ao_launch_time;
-extern __xdata uint8_t                 ao_flight_force_idle;
+extern __pdata uint8_t                 ao_flight_force_idle;
 
 /* Flight thread */
 void
@@ -794,13 +803,13 @@ extern __data uint8_t     ao_sample_adc;          /* Ring position of last processed sample
 extern __pdata int16_t ao_sample_accel;        /* most recent accel sensor reading */
 #endif
 
-extern __xdata int16_t ao_ground_pres;         /* startup pressure */
-extern __xdata int16_t ao_ground_height;       /* MSL of ao_ground_pres */
+extern __pdata int16_t ao_ground_pres;         /* startup pressure */
+extern __pdata int16_t ao_ground_height;       /* MSL of ao_ground_pres */
 
 #if HAS_ACCEL
-extern __xdata int16_t ao_ground_accel;        /* startup acceleration */
-extern __xdata int16_t         ao_accel_2g;            /* factory accel calibration */
-extern __xdata int32_t ao_accel_scale;         /* sensor to m/s² conversion */
+extern __pdata int16_t ao_ground_accel;        /* startup acceleration */
+extern __pdata int16_t         ao_accel_2g;            /* factory accel calibration */
+extern __pdata int32_t ao_accel_scale;         /* sensor to m/s² conversion */
 #endif
 
 void ao_sample_init(void);
@@ -820,6 +829,7 @@ extern __pdata int16_t                      ao_height;      /* meters */
 extern __pdata int16_t                 ao_speed;       /* m/s * 16 */
 extern __pdata int16_t                 ao_accel;       /* m/s² * 16 */
 extern __pdata int16_t                 ao_max_height;  /* max of ao_height */
+extern __pdata int16_t                 ao_avg_height;  /* running average of height */
 
 extern __pdata int16_t                 ao_error_h;
 extern __pdata int16_t                 ao_error_h_sq_avg;
@@ -927,6 +937,9 @@ ao_serial_set_stdin(uint8_t stdin);
 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
@@ -952,6 +965,129 @@ ao_spi_recv(void __xdata *block, uint16_t len) __reentrant;
 void
 ao_spi_init(void);
 
+/*
+ * ao_telemetry.c
+ */
+#define AO_MAX_CALLSIGN                        8
+#define AO_MAX_VERSION                 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[27];    /* 5 */
+       /* 32 */
+};
+
+#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 */
+
+       int16_t         ground_pres;    /* 24 average pres on pad */
+       int16_t         ground_accel;   /* 26 average accel on pad */
+       int16_t         accel_plus_g;   /* 28 accel calibration at +1g */
+       int16_t         accel_minus_g;  /* 30 accel calibration at -1g */
+       /* 32 */
+};
+
+#define AO_TELEMETRY_CONFIGURATION     0x04
+
+struct ao_telemetry_configuration {
+       uint16_t        serial;                         /*  0 */
+       uint16_t        tick;                           /*  2 */
+       uint8_t         type;                           /*  4 */
+
+       uint8_t         device;                         /*  5 device type */
+       uint16_t        flight;                         /*  6 flight number */
+       uint8_t         config_major;                   /*  8 Config major version */
+       uint8_t         config_minor;                   /*  9 Config minor version */
+       uint16_t        apogee_delay;                   /* 10 Apogee deploy delay in seconds */
+       uint16_t        main_deploy;                    /* 12 Main deploy alt in meters */
+       uint16_t        flight_log_max;                 /* 14 Maximum flight log size in kB */
+       char            callsign[AO_MAX_CALLSIGN];      /* 16 Radio operator identity */
+       char            version[AO_MAX_VERSION];        /* 24 Software version */
+       /* 32 */
+};
+
+#define AO_TELEMETRY_LOCATION          0x05
+
+#define AO_GPS_MODE_NOT_VALID          'N'
+#define AO_GPS_MODE_AUTONOMOUS         'A'
+#define AO_GPS_MODE_DIFFERENTIAL       'D'
+#define AO_GPS_MODE_ESTIMATED          'E'
+#define AO_GPS_MODE_MANUAL             'M'
+#define AO_GPS_MODE_SIMULATED          'S'
+
+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         pdop;           /* 22 (m * 5) */
+       uint8_t         hdop;           /* 23 (m * 5) */
+       uint8_t         vdop;           /* 24 (m * 5) */
+       uint8_t         mode;           /* 25 */
+       uint16_t        ground_speed;   /* 26 cm/s */
+       int16_t         climb_rate;     /* 28 cm/s */
+       uint8_t         course;         /* 30 degrees / 2 */
+       uint8_t         unused[1];      /* 31 */
+       /* 32 */
+};
+
+#define AO_TELEMETRY_SATELLITE         0x06
+
+struct ao_telemetry_satellite_info {
+       uint8_t         svid;
+       uint8_t         c_n_1;
+};
+
+struct ao_telemetry_satellite {
+       uint16_t                                serial;         /*  0 */
+       uint16_t                                tick;           /*  2 */
+       uint8_t                                 type;           /*  4 */
+       uint8_t                                 channels;       /*  5 number of reported sats */
+
+       struct ao_telemetry_satellite_info      sats[12];       /* 6 */
+       uint8_t                                 unused[2];      /* 30 */
+       /* 32 */
+};
+
+union ao_telemetry_all {
+       struct ao_telemetry_generic             generic;
+       struct ao_telemetry_sensor              sensor;
+       struct ao_telemetry_configuration       configuration;
+       struct ao_telemetry_location            location;
+       struct ao_telemetry_satellite           satellite;
+};
+
 /*
  * ao_gps.c
  */
@@ -964,9 +1100,12 @@ ao_spi_init(void);
 #define AO_GPS_DATE_VALID      (1 << 6)
 #define AO_GPS_COURSE_VALID    (1 << 7)
 
-extern __xdata uint16_t ao_gps_tick;
+extern __pdata uint16_t ao_gps_tick;
+extern __xdata uint8_t ao_gps_mutex;
+extern __xdata struct ao_telemetry_location ao_gps_data;
+extern __xdata struct ao_telemetry_satellite ao_gps_tracking_data;
 
-struct ao_gps_data {
+struct ao_gps_orig {
        uint8_t                 year;
        uint8_t                 month;
        uint8_t                 day;
@@ -985,30 +1124,26 @@ struct ao_gps_data {
        uint16_t                v_error;        /* m */
 };
 
-struct ao_gps_sat_data {
+struct ao_gps_sat_orig {
        uint8_t         svid;
        uint8_t         c_n_1;
 };
 
 #define AO_MAX_GPS_TRACKING    12
 
-struct ao_gps_tracking_data {
+struct ao_gps_tracking_orig {
        uint8_t                 channels;
-       struct ao_gps_sat_data  sats[AO_MAX_GPS_TRACKING];
+       struct ao_gps_sat_orig  sats[AO_MAX_GPS_TRACKING];
 };
 
-extern __xdata uint8_t ao_gps_mutex;
-extern __xdata struct ao_gps_data ao_gps_data;
-extern __xdata struct ao_gps_tracking_data ao_gps_tracking_data;
-
 void
 ao_gps(void);
 
 void
-ao_gps_print(__xdata struct ao_gps_data *gps_data);
+ao_gps_print(__xdata struct ao_gps_orig *gps_data);
 
 void
-ao_gps_tracking_print(__xdata struct ao_gps_tracking_data *gps_tracking_data);
+ao_gps_tracking_print(__xdata struct ao_gps_tracking_orig *gps_tracking_data);
 
 void
 ao_gps_init(void);
@@ -1024,12 +1159,10 @@ void
 ao_gps_report_init(void);
 
 /*
- * ao_telemetry.c
+ * ao_telemetry_orig.c
  */
 
-#define AO_MAX_CALLSIGN                        8
-
-struct ao_telemetry {
+struct ao_telemetry_orig {
        uint16_t                serial;
        uint16_t                flight;
        uint8_t                 flight_state;
@@ -1047,9 +1180,9 @@ struct ao_telemetry {
        int16_t                 accel_plus_g;
        int16_t                 accel_minus_g;
        struct ao_adc           adc;
-       struct ao_gps_data      gps;
+       struct ao_gps_orig      gps;
        char                    callsign[AO_MAX_CALLSIGN];
-       struct ao_gps_tracking_data     gps_tracking;
+       struct ao_gps_tracking_orig     gps_tracking;
 };
 
 struct ao_telemetry_tiny {
@@ -1067,10 +1200,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 {
@@ -1094,6 +1232,9 @@ ao_rdf_set(uint8_t rdf);
 void
 ao_telemetry_init(void);
 
+void
+ao_telemetry_orig_init(void);
+
 void
 ao_telemetry_tiny_init(void);
 
@@ -1148,7 +1289,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
@@ -1167,17 +1308,22 @@ struct ao_stdio {
        char    (*pollchar)(void);
        void    (*putchar)(char c) __reentrant;
        void    (*flush)(void);
+       uint8_t echo;
 };
 
-extern __data int8_t ao_cur_stdio;
-extern __data int8_t ao_num_stdios;
+extern __xdata struct ao_stdio ao_stdios[];
+extern __pdata int8_t ao_cur_stdio;
+extern __pdata 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;
@@ -1212,7 +1358,7 @@ ao_igniter_init(void);
  */
 
 #define AO_CONFIG_MAJOR        1
-#define AO_CONFIG_MINOR        4
+#define AO_CONFIG_MINOR        6
 
 struct ao_config {
        uint8_t         major;
@@ -1225,8 +1371,17 @@ struct ao_config {
        int16_t         accel_minus_g;          /* minor version 2 */
        uint32_t        radio_cal;              /* minor version 3 */
        uint32_t        flight_log_max;         /* minor version 4 */
+       uint8_t         ignite_mode;            /* minor version 5 */
+       uint8_t         pad_orientation;        /* minor version 6 */
 };
 
+#define AO_IGNITE_MODE_DUAL            0
+#define AO_IGNITE_MODE_APOGEE          1
+#define AO_IGNITE_MODE_MAIN            2
+
+#define AO_PAD_ORIENTATION_ANTENNA_UP  0
+#define AO_PAD_ORIENTATION_ANTENNA_DOWN        1
+
 extern __xdata struct ao_config ao_config;
 
 #define AO_CONFIG_MAX_SIZE     128
@@ -1350,6 +1505,18 @@ ao_packet_slave_init(uint8_t enable);
 
 /* 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);