Record average accelerometer value in flight start log record
[fw/altos] / ao.h
diff --git a/ao.h b/ao.h
index b10f1b34c1d2502cdd60c0252da5bfcc00447830..4505edfab4dbd9e622ab4a036df1010c24a4c308 100644 (file)
--- a/ao.h
+++ b/ao.h
@@ -29,7 +29,7 @@
 /* Stack runs from above the allocated __data space to 0xfe, which avoids
  * writing to 0xff as that triggers the stack overflow indicator
  */
-#define AO_STACK_START 0x68
+#define AO_STACK_START 0x80
 #define AO_STACK_END   0xfe
 #define AO_STACK_SIZE  (AO_STACK_END - AO_STACK_START + 1)
 
@@ -65,7 +65,7 @@ ao_yield(void) _naked;
 
 /* Add a task to the run queue */
 void
-ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *name);
+ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *name) __reentrant;
 
 /* Dump task info to console */
 void
@@ -123,6 +123,8 @@ ao_timer_init(void);
  */
 
 #define AO_ADC_RING    64
+#define ao_adc_ring_next(n)    (((n) + 1) & (AO_ADC_RING - 1))
+#define ao_adc_ring_prev(n)    (((n) - 1) & (AO_ADC_RING - 1))
 
 /*
  * One set of samples read from the A/D converter
@@ -147,7 +149,7 @@ extern volatile __data uint8_t              ao_adc_head;
 /* Trigger a conversion sequence (called from the timer interrupt) */
 void
 ao_adc_poll(void);
+
 /* Suspend the current task until another A/D sample is converted */
 void
 ao_adc_sleep(void);
@@ -213,7 +215,7 @@ ao_beep(uint8_t beep);
 
 /* Turn on the beeper for the specified time */
 void
-ao_beep_for(uint8_t beep, uint16_t ticks);
+ao_beep_for(uint8_t beep, uint16_t ticks) __reentrant;
 
 /* Initialize the beeper */
 void
@@ -239,13 +241,17 @@ ao_led_off(uint8_t colors);
 void
 ao_led_set(uint8_t colors);
 
+/* Toggle the specified LEDs */
+void
+ao_led_toggle(uint8_t colors);
+
 /* Turn on the specified LEDs for the indicated interval */
 void
-ao_led_for(uint8_t colors, uint16_t ticks);
+ao_led_for(uint8_t colors, uint16_t ticks) __reentrant;
 
 /* Initialize the LEDs */
 void
-ao_led_init(void);
+ao_led_init(uint8_t enable);
 
 /*
  * ao_usb.c
@@ -253,10 +259,10 @@ ao_led_init(void);
 
 /* Put one character to the USB output queue */
 void
-ao_usb_putchar(uint8_t c);
+ao_usb_putchar(char c);
 
 /* Get one character from the USB input queue */
-uint8_t
+char
 ao_usb_getchar(void);
 
 /* Flush the USB output queue */
@@ -267,6 +273,14 @@ ao_usb_flush(void);
 void
 ao_usb_isr(void) interrupt 6;
 
+/* Enable the USB controller */
+void
+ao_usb_enable(void);
+
+/* Disable the USB controller */
+void
+ao_usb_disable(void);
+
 /* Initialize the USB system */
 void
 ao_usb_init(void);
@@ -282,7 +296,7 @@ enum ao_cmd_status {
 };
 
 extern __xdata uint16_t ao_cmd_lex_i;
-extern __xdata uint8_t ao_cmd_lex_c;
+extern __xdata char    ao_cmd_lex_c;
 extern __xdata enum ao_cmd_status ao_cmd_status;
 
 void
@@ -300,8 +314,11 @@ ao_cmd_white(void);
 void
 ao_cmd_hex(void);
 
+void
+ao_cmd_decimal(void);
+
 struct ao_cmds {
-       uint8_t         cmd;
+       char            cmd;
        void            (*func)(void);
        const char      *help;
 };
@@ -317,7 +334,7 @@ ao_cmd_init(void);
  */
 
 /* Allocate a DMA channel. the 'done' parameter will be set to 1
- * when the dma is finished and will be used to wakeup any waiters 
+ * when the dma is finished and will be used to wakeup any waiters
  */
 uint8_t
 ao_dma_alloc(__xdata uint8_t * done);
@@ -415,7 +432,7 @@ struct ao_gps_pos {
  * packet type, the packet checksum and the tick count. Then
  * they all contain 2 16 bit values which hold packet-specific
  * data.
- * 
+ *
  * For each flight, the first packet
  * is FLIGHT packet, indicating the serial number of the
  * device and a unique number marking the number of flights
@@ -445,12 +462,12 @@ struct ao_gps_pos {
 #define AO_LOG_POS_NONE                (~0UL)
 
 struct ao_log_record {
-       uint8_t                 type;
+       char                    type;
        uint8_t                 csum;
        uint16_t                tick;
        union {
                struct {
-                       uint16_t        serial;
+                       int16_t         ground_accel;
                        uint16_t        flight;
                } flight;
                struct {
@@ -544,7 +561,7 @@ enum ao_flight_state {
 };
 
 extern __xdata struct ao_adc           ao_flight_data;
-extern __pdata enum flight_state       ao_flight_state;
+extern __pdata enum ao_flight_state    ao_flight_state;
 extern __pdata uint16_t                        ao_flight_tick;
 extern __pdata int16_t                 ao_flight_accel;
 extern __pdata int16_t                 ao_flight_pres;
@@ -579,10 +596,10 @@ int16_t
 ao_pres_to_altitude(int16_t pres) __reentrant;
 
 int16_t
-ao_temp_to_dC(int16_t temp) __reentrant;
+ao_altitude_to_pres(int16_t alt) __reentrant;
 
 int16_t
-ao_accel_to_cm_per_s2(int16_t accel) __reentrant;
+ao_temp_to_dC(int16_t temp) __reentrant;
 
 /*
  * ao_dbg.c
@@ -637,11 +654,11 @@ void
 ao_serial_tx1_isr(void) interrupt 14;
 #endif
 
-uint8_t
+char
 ao_serial_getchar(void) __critical;
 
 void
-ao_serial_putchar(uint8_t c) __critical;
+ao_serial_putchar(char c) __critical;
 
 void
 ao_serial_init(void);
@@ -684,17 +701,41 @@ ao_gps_print(__xdata struct ao_gps_data *gps_data);
 void
 ao_gps_init(void);
 
+/*
+ * ao_gps_report.c
+ */
+
+void
+ao_gps_report(void);
+
+void
+ao_gps_report_init(void);
+
 /*
  * ao_telemetry.c
  */
 
+#define AO_MAX_CALLSIGN                8
+
 struct ao_telemetry {
        uint8_t                 addr;
        uint8_t                 flight_state;
        struct ao_adc           adc;
        struct ao_gps_data      gps;
+       char                    callsign[AO_MAX_CALLSIGN];
 };
 
+/* Set delay between telemetry reports (0 to disable) */
+
+#define AO_TELEMETRY_INTERVAL_FLIGHT   AO_MS_TO_TICKS(50)
+#define AO_TELEMETRY_INTERVAL_RECOVER  AO_MS_TO_TICKS(1000)
+
+void
+ao_telemetry_set_interval(uint16_t interval);
+
+void
+ao_rdf_set(uint8_t rdf);
+
 void
 ao_telemetry_init(void);
 
@@ -707,13 +748,19 @@ ao_radio_send(__xdata struct ao_telemetry *telemetry) __reentrant;
 
 struct ao_radio_recv {
        struct ao_telemetry     telemetry;
-       uint8_t                 rssi;
+       int8_t                  rssi;
        uint8_t                 status;
 };
 
 void
 ao_radio_recv(__xdata struct ao_radio_recv *recv) __reentrant;
 
+void
+ao_radio_rdf(void);
+
+void
+ao_radio_rdf_abort(void);
+
 void
 ao_radio_init(void);
 
@@ -721,11 +768,13 @@ ao_radio_init(void);
  * ao_monitor.c
  */
 
+extern const char const * const ao_state_names[];
+
 void
 ao_monitor(void);
 
 void
-ao_monitor_init(void);
+ao_monitor_init(uint8_t led);
 
 /*
  * ao_stdio.c
@@ -734,5 +783,66 @@ ao_monitor_init(void);
 void
 flush(void);
 
-#endif /* _AO_H_ */
+/*
+ * ao_ignite.c
+ */
+
+enum ao_igniter {
+       ao_igniter_drogue = 0,
+       ao_igniter_main = 1
+};
+
+void
+ao_ignite(enum ao_igniter igniter);
+
+enum ao_igniter_status {
+       ao_igniter_unknown,     /* unknown status (ambiguous voltage) */
+       ao_igniter_ready,       /* continuity detected */
+       ao_igniter_active,      /* igniter firing */
+       ao_igniter_open,        /* open circuit detected */
+};
+
+enum ao_igniter_status
+ao_igniter_status(enum ao_igniter igniter);
 
+void
+ao_igniter_init(void);
+
+/*
+ * ao_config.c
+ */
+
+#define AO_CONFIG_MAJOR        1
+#define AO_CONFIG_MINOR        0
+
+struct ao_config {
+       uint8_t         major;
+       uint8_t         minor;
+       uint16_t        main_deploy;
+       int16_t         accel_zero_g;
+       uint8_t         radio_channel;
+       char            callsign[AO_MAX_CALLSIGN + 1];
+};
+
+extern __xdata struct ao_config ao_config;
+
+void
+ao_config_get(void);
+
+void
+ao_config_init(void);
+
+/*
+ * ao_product.c
+ *
+ * values which need to be defined for
+ * each instance of a product
+ */
+
+extern const uint8_t ao_usb_descriptors [];
+extern const uint16_t ao_serial_number;
+extern const char ao_version[];
+extern const char ao_manufacturer[];
+extern const char ao_product[];
+
+#endif /* _AO_H_ */