Make some functions reentrant to save DSEG space
[fw/altos] / ao.h
diff --git a/ao.h b/ao.h
index c2e83277ca6e6c3e2320a3ccfd6b5f40de2ad41f..2cad7621c5e5db33d072954149ed05b66b441924 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 0x7e
 #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
@@ -122,7 +122,9 @@ ao_timer_init(void);
  * ao_adc.c
  */
 
-#define AO_ADC_RING    128
+#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
@@ -241,7 +243,7 @@ ao_led_set(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
@@ -317,7 +319,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 +417,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
@@ -544,7 +546,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;
@@ -695,9 +697,6 @@ struct ao_telemetry {
        struct ao_gps_data      gps;
 };
 
-void
-ao_telemetry_send(__xdata struct ao_telemetry *telemetry) __reentrant;
-
 void
 ao_telemetry_init(void);
 
@@ -724,6 +723,8 @@ ao_radio_init(void);
  * ao_monitor.c
  */
 
+extern const char const * const ao_state_names[];
+
 void
 ao_monitor(void);
 
@@ -737,5 +738,30 @@ ao_monitor_init(void);
 void
 flush(void);
 
+/*
+ * 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);
+
 #endif /* _AO_H_ */