diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2010-01-06 17:46:05 +0000 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2010-01-06 17:46:05 +0000 |
commit | d9cf4c36f64f863042a6082b67957b3be0bd105b (patch) | |
tree | 824ca4cdad7e00e947135bda3473a41d9f1f4948 /driver_nmea.c | |
parent | ff47beb08f85a781ad3224b072ee0234ad09c4ae (diff) | |
download | gpsd-d9cf4c36f64f863042a6082b67957b3be0bd105b.tar.gz |
Cope better with decade and century transitions while the daemon is running.
Thanks to Miroslav Lichvar.
Diffstat (limited to 'driver_nmea.c')
-rw-r--r-- | driver_nmea.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/driver_nmea.c b/driver_nmea.c index 0770f237..c52622b8 100644 --- a/driver_nmea.c +++ b/driver_nmea.c @@ -75,12 +75,20 @@ static void do_lat_lon(char *field[], struct gps_data_t *out) static void merge_ddmmyy(char *ddmmyy, struct gps_device_t *session) /* sentence supplied ddmmyy, but no century part */ { - if (session->driver.nmea.date.tm_year == 0) { - session->driver.nmea.date.tm_year = (CENTURY_BASE + DD(ddmmyy+4)) - 1900; - gpsd_report(LOG_DATA, "merge_ddmmyy(ddmmyy) sets year %d from %s\n", - session->driver.nmea.date.tm_year, - ddmmyy); + int yy = DD(ddmmyy+4), year = session->driver.nmea.date.tm_year; + + if (year == 0) { + year = (CENTURY_BASE + yy) - 1900; + } else if (year % 100 != yy) { + /* update year */ + if (year % 100 == 99 && yy == 0) + yy += 100; /* century change */ + year = year / 100 * 100 + yy; } + gpsd_report(LOG_DATA, "merge_ddmmyy(ddmmyy) sets year %d from %s\n", + year, + ddmmyy); + session->driver.nmea.date.tm_year = year; session->driver.nmea.date.tm_mon = DD(ddmmyy+2)-1; session->driver.nmea.date.tm_mday = DD(ddmmyy); } |