summaryrefslogtreecommitdiff
path: root/driver_nmea.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2011-01-21 14:06:01 -0500
committerEric S. Raymond <esr@thyrsus.com>2011-01-21 14:06:01 -0500
commit518124c349f2f9a9507db9bae49b85f08c255b6e (patch)
treee1ef710ada9243939069c178207d18791f02cd22 /driver_nmea.c
parenta52e44bb961c4696d7d2d86abe7ce724e03e9635 (diff)
downloadgpsd-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.c12
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);
}
/*