Log GPS data on pad after boost detect.
authorKeith Packard <keithp@keithp.com>
Sun, 14 Feb 2010 00:42:27 +0000 (16:42 -0800)
committerKeith Packard <keithp@keithp.com>
Sun, 14 Feb 2010 00:42:27 +0000 (16:42 -0800)
This wakes up the two GPS reporting tasks and gets them to report out
any existing GPS data to the log file. To make sure the timestamps in
that GPS data are accurate, this also records GPS time on receipt of
the GPS data instead of when that is logged.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/ao.h
src/ao_flight.c
src/ao_gps_report.c
src/ao_gps_sirf.c
src/ao_gps_skytraq.c
src/ao_gps_test.c
src/ao_gps_test_skytraq.c

index 2c6eb2b..d6be222 100644 (file)
--- a/src/ao.h
+++ b/src/ao.h
@@ -731,6 +731,8 @@ ao_serial_init(void);
 #define AO_GPS_RUNNING         (1 << 5)
 #define AO_GPS_DATE_VALID      (1 << 6)
 
+extern __xdata uint16_t ao_gps_tick;
+
 struct ao_gps_data {
        uint8_t                 year;
        uint8_t                 month;
index e0fd97f..980c16b 100644 (file)
@@ -289,6 +289,10 @@ ao_flight(void)
                                /* disable RDF beacon */
                                ao_rdf_set(0);
 
+                               /* Record current GPS position by waking up GPS log tasks */
+                               ao_wakeup(&ao_gps_data);
+                               ao_wakeup(&ao_gps_tracking_data);
+
                                ao_wakeup(DATA_TO_XDATA(&ao_flight_state));
                                break;
                        }
index e3e2752..cceb79f 100644 (file)
@@ -33,7 +33,7 @@ ao_gps_report(void)
                if (!(gps_data.flags & AO_GPS_VALID))
                        continue;
 
-               gps_log.tick = ao_time();
+               gps_log.tick = ao_gps_tick;
                gps_log.type = AO_LOG_GPS_TIME;
                gps_log.u.gps_time.hour = gps_data.hour;
                gps_log.u.gps_time.minute = gps_data.minute;
@@ -71,13 +71,13 @@ ao_gps_tracking_report(void)
        for (;;) {
                ao_sleep(&ao_gps_tracking_data);
                ao_mutex_get(&ao_gps_mutex);
+               gps_log.tick = ao_gps_tick;
                memcpy(&gps_tracking_data, &ao_gps_tracking_data, sizeof (struct ao_gps_tracking_data));
                ao_mutex_put(&ao_gps_mutex);
 
                if (!(n = gps_tracking_data.channels))
                        continue;
 
-               gps_log.tick = ao_time();
                gps_log.type = AO_LOG_GPS_SAT;
                for (c = 0; c < n; c++)
                        if ((gps_log.u.gps_sat.svid = gps_tracking_data.sats[c].svid))
index 64b66c9..a6167e6 100644 (file)
@@ -20,6 +20,7 @@
 #endif
 
 __xdata uint8_t ao_gps_mutex;
+__xdata uint16_t ao_gps_tick;
 __xdata struct ao_gps_data     ao_gps_data;
 __xdata struct ao_gps_tracking_data    ao_gps_tracking_data;
 
@@ -390,6 +391,7 @@ ao_gps(void) __reentrant
                switch (i) {
                case 41:
                        ao_mutex_get(&ao_gps_mutex);
+                       ao_gps_tick = ao_time();
                        ao_gps_data.hour = ao_sirf_data.utc_hour;
                        ao_gps_data.minute = ao_sirf_data.utc_minute;
                        ao_gps_data.second = ao_sirf_data.utc_second / 1000;
index 0dd45c0..ae8c7ef 100644 (file)
@@ -28,9 +28,11 @@ static __xdata char ao_gps_char;
 static __xdata uint8_t ao_gps_cksum;
 static __xdata uint8_t ao_gps_error;
 
+__xdata uint16_t ao_gps_tick;
 __xdata struct ao_gps_data     ao_gps_data;
 __xdata struct ao_gps_tracking_data    ao_gps_tracking_data;
 
+static __xdata uint16_t                                ao_gps_next_tick;
 static __xdata struct ao_gps_data              ao_gps_next;
 static __xdata uint8_t                         ao_gps_date_flags;
 static __xdata struct ao_gps_tracking_data     ao_gps_tracking_next;
@@ -248,6 +250,7 @@ ao_gps(void) __reentrant
                         *         *66          checksum
                         */
 
+                       ao_gps_next_tick = ao_time();
                        ao_gps_next.flags = AO_GPS_RUNNING | ao_gps_date_flags;
                        ao_gps_next.hour = ao_gps_decimal(2);
                        ao_gps_next.minute = ao_gps_decimal(2);
@@ -297,6 +300,7 @@ ao_gps(void) __reentrant
                                ao_gps_error = 1;
                        if (!ao_gps_error) {
                                ao_mutex_get(&ao_gps_mutex);
+                               ao_gps_tick = ao_gps_next_tick;
                                memcpy(&ao_gps_data, &ao_gps_next, sizeof (struct ao_gps_data));
                                ao_mutex_put(&ao_gps_mutex);
                                ao_wakeup(&ao_gps_data);
index fddfedf..cdcc6f4 100644 (file)
@@ -400,6 +400,8 @@ ao_serial_set_speed(uint8_t speed)
        tcflush(fd, TCIFLUSH);
 }
 
+#define ao_time() 0
+
 #include "ao_gps_print.c"
 #include "ao_gps_sirf.c"
 
index ccf9637..7fa10ea 100644 (file)
@@ -408,6 +408,8 @@ ao_serial_set_speed(uint8_t speed)
        tcflush(fd, TCIFLUSH);
 }
 
+#define ao_time() 0
+
 #include "ao_gps_print.c"
 #include "ao_gps_skytraq.c"