X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=ao_gps.c;h=651a59e543d1a8336a76bff238447471e115141f;hp=83f44d55f42f80c0c738b5f754d04b6c3f40d610;hb=d1887ded41a5bfec8e10e9fd736fa9444b9b6222;hpb=c4e983daa4579896b227fdcb2be43fad75e94307 diff --git a/ao_gps.c b/ao_gps.c index 83f44d55..651a59e5 100644 --- 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]); }