summaryrefslogtreecommitdiff
path: root/driver_nmea.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2010-01-06 17:46:05 +0000
committerEric S. Raymond <esr@thyrsus.com>2010-01-06 17:46:05 +0000
commitd9cf4c36f64f863042a6082b67957b3be0bd105b (patch)
tree824ca4cdad7e00e947135bda3473a41d9f1f4948 /driver_nmea.c
parentff47beb08f85a781ad3224b072ee0234ad09c4ae (diff)
downloadgpsd-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.c18
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);
}