Fix up fancy dbg stuff. Add teleterra initial bits.
[fw/altos] / ao_gps.c
index 83f44d55f42f80c0c738b5f754d04b6c3f40d610..651a59e543d1a8336a76bff238447471e115141f 100644 (file)
--- a/ao_gps.c
+++ b/ao_gps.c
@@ -17,8 +17,6 @@
 
 #include "ao.h"
 
-__xdata struct ao_task ao_gps_task;
-
 #define AO_GPS_LEADER          6
 
 static const uint8_t ao_gps_header[] = "GPGGA,";
@@ -248,15 +246,70 @@ ao_gps(void) __reentrant
                        ao_gps_error = 1;
                if (!ao_gps_error) {
                        ao_mutex_get(&ao_gps_mutex);
-                       memcpy(&ao_gps_data, &ao_gps_next, sizeof (ao_gps_data));
+                       memcpy(&ao_gps_data, &ao_gps_next, sizeof (struct ao_gps_data));
                        ao_mutex_put(&ao_gps_mutex);
                        ao_wakeup(&ao_gps_data);
                }
        }
 }
 
+void
+ao_gps_report(void)
+{
+       static __xdata struct ao_log_record     gps_log;
+       static __xdata struct ao_gps_data       gps_data;
+
+       for (;;) {
+               ao_sleep(&ao_gps_data);
+               ao_mutex_get(&ao_gps_mutex);
+               memcpy(&gps_data, &ao_gps_data, sizeof (struct ao_gps_data));
+               ao_mutex_put(&ao_gps_mutex);
+
+               gps_log.tick = ao_time();
+               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;
+               gps_log.u.gps_time.second = gps_data.second;
+               gps_log.u.gps_time.flags = gps_data.flags;
+               ao_log_data(&gps_log);
+               gps_log.type = AO_LOG_GPS_LAT;
+               gps_log.u.gps_latitude.degrees = gps_data.latitude.degrees;
+               gps_log.u.gps_latitude.minutes = gps_data.latitude.minutes;
+               gps_log.u.gps_latitude.minutes_fraction = gps_data.latitude.minutes_fraction;
+               ao_log_data(&gps_log);
+               gps_log.type = AO_LOG_GPS_LON;
+               gps_log.u.gps_longitude.degrees = gps_data.longitude.degrees;
+               gps_log.u.gps_longitude.minutes = gps_data.longitude.minutes;
+               gps_log.u.gps_longitude.minutes_fraction = gps_data.longitude.minutes_fraction;
+               ao_log_data(&gps_log);
+               gps_log.type = AO_LOG_GPS_ALT;
+               gps_log.u.gps_altitude.altitude = gps_data.altitude;
+               gps_log.u.gps_altitude.unused = 0xffff;
+               ao_log_data(&gps_log);
+       }
+               
+}
+
+__xdata struct ao_task ao_gps_task;
+__xdata struct ao_task ao_gps_report_task;
+
+static void
+gps_dump(void) __reentrant
+{
+       ao_mutex_get(&ao_gps_mutex);
+       ao_gps_print(&ao_gps_data);
+       ao_mutex_put(&ao_gps_mutex);
+}
+
+__code struct ao_cmds ao_gps_cmds[] = {
+       { 'g', gps_dump,        "g                                  Display current GPS values" },
+       { 0, gps_dump, NULL },
+};
+
 void
 ao_gps_init(void)
 {
        ao_add_task(&ao_gps_task, ao_gps, "gps");
+       ao_add_task(&ao_gps_report_task, ao_gps_report, "gps_report");
+       ao_cmd_register(&ao_gps_cmds[0]);
 }