diff options
Diffstat (limited to 'ao_gps.c')
-rw-r--r-- | ao_gps.c | 63 |
1 files changed, 60 insertions, 3 deletions
@@ -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,7 +246,7 @@ 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); } @@ -256,7 +254,66 @@ ao_gps(void) __reentrant } void +ao_gps_report(void) +{ + static __xdata struct ao_log_record gps_log; + static __xdata struct ao_telemetry gps_telemetry; + 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); + gps_telemetry.type = AO_TELEMETRY_GPS; + memcpy(&gps_telemetry.u.gps, &gps_data, sizeof (struct ao_gps_data)); + ao_telemetry_send(&gps_telemetry); + } + +} + +__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\n" }, + { 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]); } |