diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2011-01-21 14:06:01 -0500 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2011-01-21 14:06:01 -0500 |
commit | 518124c349f2f9a9507db9bae49b85f08c255b6e (patch) | |
tree | e1ef710ada9243939069c178207d18791f02cd22 /driver_nmea.c | |
parent | a52e44bb961c4696d7d2d86abe7ce724e03e9635 (diff) | |
download | gpsd-518124c349f2f9a9507db9bae49b85f08c255b6e.tar.gz |
Compensate for century rollover in NMEA.
Contains the hidden assumption that dates to be merged will always be
presented in monotonically increasing order. If this ever fails to be
the case near a century turnover, you're screwed.
Diffstat (limited to 'driver_nmea.c')
-rw-r--r-- | driver_nmea.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/driver_nmea.c b/driver_nmea.c index 213d8aff..dcd62bb2 100644 --- a/driver_nmea.c +++ b/driver_nmea.c @@ -76,8 +76,11 @@ static void merge_ddmmyy(char *ddmmyy, struct gps_device_t *session) year = (session->context->century + yy) - 1900; } else if (year % 100 != yy) { /* update year */ - if (year % 100 == 99 && yy == 0) - yy += 100; /* century change */ + if (year % 100 == 99 && yy == 0) { + yy += 100; + session->context->century += 100; + gpsd_report(LOG_WARN, "century rollover detected.\n"); + } year = year / 100 * 100 + yy; } if ( (1 > year ) || (2200 < year ) ) { @@ -1083,15 +1086,14 @@ gps_mask_t nmea_parse(char *sentence, struct gps_device_t * session) * is a timestamp whenever TIME_IS is set. */ gpsd_report(LOG_DATA, - "%s time is %2f = %d-%02d-%02dT%02d:%02d:%02d.%dZ\n", + "%s time is %2f = %d-%02d-%02dT%02d:%02d:%02.2fZ\n", session->driver.nmea.field[0], session->newdata.time, 1900 + session->driver.nmea.date.tm_year, session->driver.nmea.date.tm_mon + 1, session->driver.nmea.date.tm_mday, session->driver.nmea.date.tm_hour, session->driver.nmea.date.tm_min, - session->driver.nmea.date.tm_sec, - session->driver.nmea.subseconds); + session->driver.nmea.date.tm_sec + session->driver.nmea.subseconds); } /* |