Add ao_wake_task and ao_exit
[fw/altos] / src / ao.h
index c4cb5bf7176d526b2ea4a4bbe887684778070a59..132711091de385a36a0abe562cb570fbf883a5b6 100644 (file)
--- a/src/ao.h
+++ b/src/ao.h
@@ -21,6 +21,7 @@
 #include <stdint.h>
 #include <stdio.h>
 #include <string.h>
+#include <stddef.h>
 #include "cc1111.h"
 
 #define TRUE 1
@@ -62,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;
@@ -70,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);
@@ -121,6 +130,10 @@ ao_timer_isr(void) interrupt 9;
 void
 ao_timer_init(void);
 
+/* Initialize the hardware clock. Must be called first */
+void
+ao_clock_init(void);
+
 /*
  * ao_adc.c
  */
@@ -419,14 +432,6 @@ ao_ee_init(void);
  * ao_log.c
  */
 
-/* Structure containing GPS position, either lat or lon */
-
-struct ao_gps_pos {
-       uint8_t degrees;
-       uint8_t minutes;
-       uint16_t minutes_fraction;      /* in units of 1/10000 minutes */
-};
-
 /*
  * The data log is recorded in the eeprom as a sequence
  * of data packets.
@@ -461,6 +466,7 @@ struct ao_gps_pos {
 #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)
 
@@ -495,12 +501,17 @@ struct ao_log_record {
                        uint8_t         second;
                        uint8_t         flags;
                } gps_time;
-               struct ao_gps_pos gps_latitude;
-               struct ao_gps_pos gps_longitude;
+               int32_t         gps_latitude;
+               int32_t         gps_longitude;
                struct {
                        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;
@@ -553,10 +564,10 @@ ao_log_init(void);
 enum ao_flight_state {
        ao_flight_startup = 0,
        ao_flight_idle = 1,
-       ao_flight_launchpad = 2,
+       ao_flight_pad = 2,
        ao_flight_boost = 3,
-       ao_flight_coast = 4,
-       ao_flight_apogee = 5,
+       ao_flight_fast = 4,
+       ao_flight_coast = 5,
        ao_flight_drogue = 6,
        ao_flight_main = 7,
        ao_flight_landed = 8,
@@ -664,6 +675,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);
 
@@ -675,26 +693,47 @@ ao_serial_init(void);
 #define AO_GPS_NUM_SAT_SHIFT   (0)
 
 #define AO_GPS_VALID           (1 << 4)
-#define AO_GPS_LONGITUDE_MASK  (1 << 5)
-#define AO_GPS_LONGITUDE_EAST  (0 << 5)
-#define AO_GPS_LONGITUDE_WEST  (1 << 5)
-
-#define AO_GPS_LATITUDE_MASK   (1 << 6)
-#define AO_GPS_LATITUDE_NORTH  (0 << 6)
-#define AO_GPS_LATITUDE_SOUTH  (1 << 6)
+#define AO_GPS_RUNNING         (1 << 5)
 
 struct ao_gps_data {
        uint8_t                 hour;
        uint8_t                 minute;
        uint8_t                 second;
        uint8_t                 flags;
-       struct ao_gps_pos       latitude;
-       struct ao_gps_pos       longitude;
-       int16_t                 altitude;
+       int32_t                 latitude;       /* degrees * 10⁷ */
+       int32_t                 longitude;      /* degrees * 10⁷ */
+       int16_t                 altitude;       /* m */
+       uint16_t                ground_speed;   /* cm/s */
+       uint8_t                 course;         /* degrees / 2 */
+       uint8_t                 hdop;           /* * 5 */
+       int16_t                 climb_rate;     /* cm/s */
+       uint16_t                h_error;        /* m */
+       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);
@@ -702,6 +741,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);
 
@@ -732,6 +774,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) */
@@ -743,6 +786,9 @@ struct ao_telemetry {
 void
 ao_telemetry_set_interval(uint16_t interval);
 
+void
+ao_rdf_set(uint8_t rdf);
+
 void
 ao_telemetry_init(void);
 
@@ -762,6 +808,12 @@ struct ao_radio_recv {
 void
 ao_radio_recv(__xdata struct ao_radio_recv *recv) __reentrant;
 
+void
+ao_radio_rdf(int ms);
+
+void
+ao_radio_rdf_abort(void);
+
 void
 ao_radio_init(void);
 
@@ -817,7 +869,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;
@@ -826,6 +878,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;