Wait for TX to finish sending data
[fw/altos] / src / ao.h
index 30511c8c2f7c49326e73bb9c02412ccb4bf237dc..84e92f35e77ced7eb5c581c6c43230f9eabc110f 100644 (file)
--- a/src/ao.h
+++ b/src/ao.h
@@ -63,6 +63,10 @@ ao_sleep(__xdata void *wchan);
 void
 ao_wakeup(__xdata void *wchan);
 
+/* Wake up a specific task */
+void
+ao_wake_task(__xdata struct ao_task *task);
+
 /* Yield the processor to another task */
 void
 ao_yield(void) _naked;
@@ -71,6 +75,10 @@ ao_yield(void) _naked;
 void
 ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *name) __reentrant;
 
+/* Terminate the current task */
+void
+ao_exit(void);
+
 /* Dump task info to console */
 void
 ao_task_info(void);
@@ -130,7 +138,7 @@ ao_clock_init(void);
  * ao_adc.c
  */
 
-#define AO_ADC_RING    64
+#define AO_ADC_RING    32
 #define ao_adc_ring_next(n)    (((n) + 1) & (AO_ADC_RING - 1))
 #define ao_adc_ring_prev(n)    (((n) - 1) & (AO_ADC_RING - 1))
 
@@ -341,9 +349,15 @@ ao_cmd_init(void);
  * ao_dma.c
  */
 
-/* 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
+/* Allocate a DMA channel. the 'done' parameter will be set
+ * when the dma is finished or aborted and will be used to
+ * wakeup any waiters
  */
+
+#define AO_DMA_DONE    1
+#define AO_DMA_ABORTED 2
+#define AO_DMA_TIMEOUT 4
+
 uint8_t
 ao_dma_alloc(__xdata uint8_t * done);
 
@@ -366,7 +380,7 @@ ao_dma_trigger(uint8_t id);
 
 /* Abort a running DMA transfer */
 void
-ao_dma_abort(uint8_t id);
+ao_dma_abort(uint8_t id, uint8_t reason);
 
 /* DMA interrupt routine */
 void
@@ -458,6 +472,7 @@ ao_ee_init(void);
 #define AO_LOG_GPS_LAT         'N'
 #define AO_LOG_GPS_LON         'W'
 #define AO_LOG_GPS_ALT         'H'
+#define AO_LOG_GPS_SAT         'V'
 
 #define AO_LOG_POS_NONE                (~0UL)
 
@@ -498,6 +513,11 @@ struct ao_log_record {
                        int16_t         altitude;
                        uint16_t        unused;
                } gps_altitude;
+               struct {
+                       uint16_t        svid;
+                       uint8_t         state;
+                       uint8_t         c_n;
+               } gps_sat;
                struct {
                        uint16_t        d0;
                        uint16_t        d1;
@@ -661,6 +681,13 @@ ao_serial_getchar(void) __critical;
 void
 ao_serial_putchar(char c) __critical;
 
+#define AO_SERIAL_SPEED_4800   0
+#define AO_SERIAL_SPEED_9600   1
+#define AO_SERIAL_SPEED_57600  2
+
+void
+ao_serial_set_speed(uint8_t speed);
+
 void
 ao_serial_init(void);
 
@@ -672,6 +699,7 @@ ao_serial_init(void);
 #define AO_GPS_NUM_SAT_SHIFT   (0)
 
 #define AO_GPS_VALID           (1 << 4)
+#define AO_GPS_RUNNING         (1 << 5)
 
 struct ao_gps_data {
        uint8_t                 hour;
@@ -689,8 +717,29 @@ struct ao_gps_data {
        uint16_t                v_error;        /* m */
 };
 
+#define SIRF_SAT_STATE_ACQUIRED                        (1 << 0)
+#define SIRF_SAT_STATE_CARRIER_PHASE_VALID     (1 << 1)
+#define SIRF_SAT_BIT_SYNC_COMPLETE             (1 << 2)
+#define SIRF_SAT_SUBFRAME_SYNC_COMPLETE                (1 << 3)
+#define SIRF_SAT_CARRIER_PULLIN_COMPLETE       (1 << 4)
+#define SIRF_SAT_CODE_LOCKED                   (1 << 5)
+#define SIRF_SAT_ACQUISITION_FAILED            (1 << 6)
+#define SIRF_SAT_EPHEMERIS_AVAILABLE           (1 << 7)
+
+struct ao_gps_sat_data {
+       uint8_t         svid;
+       uint8_t         state;
+       uint8_t         c_n_1;
+};
+
+struct ao_gps_tracking_data {
+       uint8_t                 channels;
+       struct ao_gps_sat_data  sats[12];
+};
+
 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);
@@ -698,6 +747,9 @@ ao_gps(void);
 void
 ao_gps_print(__xdata struct ao_gps_data *gps_data);
 
+void
+ao_gps_tracking_print(__xdata struct ao_gps_tracking_data *gps_tracking_data);
+
 void
 ao_gps_init(void);
 
@@ -728,6 +780,7 @@ struct ao_telemetry {
        struct ao_adc           adc;
        struct ao_gps_data      gps;
        char                    callsign[AO_MAX_CALLSIGN];
+       struct ao_gps_tracking_data     gps_tracking;
 };
 
 /* Set delay between telemetry reports (0 to disable) */
@@ -739,6 +792,9 @@ struct ao_telemetry {
 void
 ao_telemetry_set_interval(uint16_t interval);
 
+void
+ao_rdf_set(uint8_t rdf);
+
 void
 ao_telemetry_init(void);
 
@@ -746,6 +802,23 @@ ao_telemetry_init(void);
  * ao_radio.c
  */
 
+extern __xdata uint8_t ao_radio_dma;
+extern __xdata uint8_t ao_radio_dma_done;
+extern __xdata uint8_t ao_radio_done;
+extern __xdata uint8_t ao_radio_mutex;
+
+void
+ao_radio_general_isr(void) interrupt 16;
+
+void
+ao_radio_set_telemetry(void);
+
+void
+ao_radio_set_packet(void);
+
+void
+ao_radio_set_rdf(void);
+
 void
 ao_radio_send(__xdata struct ao_telemetry *telemetry) __reentrant;
 
@@ -755,9 +828,21 @@ struct ao_radio_recv {
        uint8_t                 status;
 };
 
-void
+uint8_t
 ao_radio_recv(__xdata struct ao_radio_recv *recv) __reentrant;
 
+void
+ao_radio_rdf(int ms);
+
+void
+ao_radio_abort(uint8_t reason);
+
+void
+ao_radio_rdf_abort(void);
+
+void
+ao_radio_idle(void);
+
 void
 ao_radio_init(void);
 
@@ -813,7 +898,7 @@ ao_igniter_init(void);
  */
 
 #define AO_CONFIG_MAJOR        1
-#define AO_CONFIG_MINOR        0
+#define AO_CONFIG_MINOR        1
 
 struct ao_config {
        uint8_t         major;
@@ -822,6 +907,7 @@ struct ao_config {
        int16_t         accel_zero_g;
        uint8_t         radio_channel;
        char            callsign[AO_MAX_CALLSIGN + 1];
+       uint8_t         apogee_delay;
 };
 
 extern __xdata struct ao_config ao_config;
@@ -886,35 +972,21 @@ struct ao_fifo {
  * Packet-based command interface
  */
 
-#define AO_PACKET_MAX  32
-#define AO_PACKET_WIN  256
-
-#define AO_PACKET_FIN  (1 << 0)
-#define AO_PACKET_SYN  (1 << 1)
-#define AO_PACKET_RST  (1 << 2)
-#define AO_PACKET_ACK  (1 << 3)
+#define AO_PACKET_MAX  8
 
 struct ao_packet {
        uint8_t         addr;
-       uint8_t         flags;
-       uint16_t        seq;
-       uint16_t        ack;
-       uint16_t        window;
        uint8_t         len;
+       uint8_t         seq;
+       uint8_t         ack;
        uint8_t         d[AO_PACKET_MAX];
 };
 
-uint8_t
-ao_packet_connect(uint8_t dest);
-
-uint8_t
-ao_packet_accept(void);
-
-int
-ao_packet_send(uint8_t *data, int len);
-
-int
-ao_packet_recv(uint8_t *data, int len);
+struct ao_packet_recv {
+       struct ao_packet        packet;
+       int8_t                  rssi;
+       uint8_t                 status;
+};
 
 void
 ao_packet_init(void);