Parse GPS data locally. Add 'g' command to display recent GPS results.
[fw/altos] / ao.h
diff --git a/ao.h b/ao.h
index 853738b29171358967c0a80b931bcefa6d529b66..bbf358e971dc1328fc8cb30db69d2fb77458c8d9 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 0x6f
+#define AO_STACK_START 0x62
 #define AO_STACK_END   0xfe
 #define AO_STACK_SIZE  (AO_STACK_END - AO_STACK_START + 1)
 
@@ -38,6 +38,7 @@ struct ao_task {
        __xdata void *wchan;            /* current wait channel (NULL if running) */
        uint8_t stack_count;            /* amount of saved stack */
        uint8_t task_id;                /* index in the task array */
+       __code char *name;              /* task name */
        uint8_t stack[AO_STACK_SIZE];   /* saved stack */
 };
 
@@ -64,7 +65,11 @@ ao_yield(void) _naked;
 
 /* Add a task to the run queue */
 void
-ao_add_task(__xdata struct ao_task * task, void (*start)(void));
+ao_add_task(__xdata struct ao_task * task, void (*start)(void), __code char *name);
+
+/* Dump task info to console */
+void
+ao_task_info(void);
 
 /* Start the scheduler. This will not return */
 void
@@ -472,15 +477,15 @@ enum ao_flight_state {
        ao_flight_invalid
 };
 
-extern __xdata struct ao_adc   ao_flight_data;
-extern __data enum flight_state        ao_flight_state;
-extern __data uint16_t                 ao_flight_tick;
-extern __data int16_t                  ao_flight_accel;
-extern __data int16_t                  ao_flight_pres;
-extern __data int16_t                  ao_ground_pres;
-extern __data int16_t                  ao_ground_accel;
-extern __data int16_t                  ao_min_pres;
-extern __data uint16_t                 ao_launch_time;
+extern __xdata struct ao_adc           ao_flight_data;
+extern __pdata enum 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;
+extern __pdata int16_t                 ao_ground_pres;
+extern __pdata int16_t                 ao_ground_accel;
+extern __pdata int16_t                 ao_min_pres;
+extern __pdata uint16_t                        ao_launch_time;
 
 /* Flight thread */
 void
@@ -580,6 +585,37 @@ ao_serial_init(void);
  * ao_gps.c
  */
 
+struct ao_gps_pos {
+       uint8_t degrees;
+       uint8_t minutes;
+       uint16_t minutes_fraction;      /* in units of 1/10000 minutes */
+};
+
+#define AO_GPS_NUM_SAT_MASK    (0xf << 0)
+#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)
+
+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;
+};
+
+extern __xdata uint8_t ao_gps_mutex;
+extern __xdata struct ao_gps_data ao_gps_data;
+
 void
 ao_gps(void);