diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2009-09-08 01:53:12 +0000 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2009-09-08 01:53:12 +0000 |
commit | a60fc9935f5d19b563e85dc4c1104dec92d778dd (patch) | |
tree | fa0c398769befa3869f3f41301dbfe25980bb68d /driver_nmea.c | |
parent | 023c2e8f3eed45c94c0a39bb73d51288a263b00f (diff) | |
download | gpsd-a60fc9935f5d19b563e85dc4c1104dec92d778dd.tar.gz |
Refactor NMEA driver so all sentence timestamp recording is done in one spot.
All regression tests pass.
Diffstat (limited to 'driver_nmea.c')
-rw-r--r-- | driver_nmea.c | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/driver_nmea.c b/driver_nmea.c index 6ceb169a..769212a1 100644 --- a/driver_nmea.c +++ b/driver_nmea.c @@ -107,6 +107,17 @@ static void merge_hhmmss(char *hhmmss, struct gps_device_t *session) #define GPS_TIME_EQUAL(a, b) (fabs((a) - (b)) < 0.01) +static void register_sentence_time(const char *tag, + struct gps_device_t *session) +{ + session->gpsdata.fix.time = (double)mkgmtime(&session->driver.nmea.date)+session->driver.nmea.subseconds; + if (!GPS_TIME_EQUAL(session->gpsdata.sentence_time, session->gpsdata.fix.time)) { + session->cycle_state |= CYCLE_START; + gpsd_report(LOG_PROG, "%s starts a reporting cycle.\n", tag); + } + session->gpsdata.sentence_time = session->gpsdata.fix.time; +} + /************************************************************************** * * NMEA sentence handling begins here @@ -152,13 +163,8 @@ static gps_mask_t processGPRMC(int count, char *field[], struct gps_device_t *se if (count > 9) { merge_hhmmss(field[1], session); merge_ddmmyy(field[9], session); + register_sentence_time("RMC", session); mask |= TIME_SET; - session->gpsdata.fix.time = (double)mkgmtime(&session->driver.nmea.date)+session->driver.nmea.subseconds; - if (!GPS_TIME_EQUAL(session->gpsdata.sentence_time, session->gpsdata.fix.time)) { - session->cycle_state |= CYCLE_START; - gpsd_report(LOG_PROG, "GPRMC starts a reporting cycle.\n"); - } - session->gpsdata.sentence_time = session->gpsdata.fix.time; } do_lat_lon(&field[3], &session->gpsdata); mask |= LATLON_SET; @@ -231,13 +237,8 @@ static gps_mask_t processGPGLL(int count, char *field[], struct gps_device_t *se if (session->driver.nmea.date.tm_year == 0) gpsd_report(LOG_WARN, "can't use GGL time until after ZDA or RMC has supplied a year.\n"); else { + register_sentence_time("GLL", session); mask = TIME_SET; - session->gpsdata.fix.time = (double)mkgmtime(&session->driver.nmea.date)+session->driver.nmea.subseconds; - if (!GPS_TIME_EQUAL(session->gpsdata.sentence_time, session->gpsdata.fix.time)) { - session->cycle_state |= CYCLE_START; - gpsd_report(LOG_PROG, "GPGLL starts a reporting cycle.\n"); - } - session->gpsdata.sentence_time = session->gpsdata.fix.time; } do_lat_lon(&field[1], &session->gpsdata); mask |= LATLON_SET; @@ -296,13 +297,8 @@ static gps_mask_t processGPGGA(int c UNUSED, char *field[], struct gps_device_t if (session->driver.nmea.date.tm_year == 0) gpsd_report(LOG_WARN, "can't use GGA time until after ZDA or RMC has supplied a year.\n"); else { + register_sentence_time("GGA", session); mask |= TIME_SET; - session->gpsdata.fix.time = (double)mkgmtime(&session->driver.nmea.date)+session->driver.nmea.subseconds; - if (!GPS_TIME_EQUAL(session->gpsdata.sentence_time, session->gpsdata.fix.time)) { - session->cycle_state |= CYCLE_START; - gpsd_report(LOG_PROG, "GPGGA starts a reporting cycle.\n"); - } - session->gpsdata.sentence_time = session->gpsdata.fix.time; } do_lat_lon(&field[2], &session->gpsdata); mask |= LATLON_SET; @@ -595,12 +591,7 @@ static gps_mask_t processGPZDA(int c UNUSED, char *field[], struct gps_device_t session->driver.nmea.date.tm_year = atoi(field[4]) - 1900; session->driver.nmea.date.tm_mon = atoi(field[3])-1; session->driver.nmea.date.tm_mday = atoi(field[2]); - session->gpsdata.fix.time = (double)mkgmtime(&session->driver.nmea.date)+session->driver.nmea.subseconds; - if (!GPS_TIME_EQUAL(session->gpsdata.sentence_time, session->gpsdata.fix.time)) { - session->cycle_state |= CYCLE_START; - gpsd_report(LOG_PROG, "GPZDA starts a reporting cycle.\n"); - } - session->gpsdata.sentence_time = session->gpsdata. fix.time; + register_sentence_time("ZDA", session); return mask; } @@ -925,6 +916,14 @@ gps_mask_t nmea_parse(char *sentence, struct gps_device_t *session) #endif /* MKT3301_ENABLE */ /*@ +usedef @*/ + /* + * The end-of-cycle detector. This code depends on just one assumption: + * if a sentence with a timestamp occurs just before start of cycle, then + * it never occurs in a non-end position (that is, before a sentence + * with the same timestamp). + */ + /* FIXME: implementatiin goes here */ + /* we might have a reliable end-of-cycle */ if (session->driver.nmea.cycle_end_reliable) session->cycle_state |= CYCLE_END_RELIABLE; |