diff options
-rw-r--r-- | driver_evermore.c | 4 | ||||
-rw-r--r-- | driver_italk.c | 5 | ||||
-rw-r--r-- | driver_navcom.c | 3 | ||||
-rw-r--r-- | driver_proto.c | 1 | ||||
-rw-r--r-- | driver_sirf.c | 6 | ||||
-rw-r--r-- | driver_tsip.c | 9 | ||||
-rw-r--r-- | driver_ubx.c | 2 | ||||
-rw-r--r-- | driver_zodiac.c | 1 | ||||
-rw-r--r-- | gpsd.h-tail | 3 | ||||
-rw-r--r-- | libgpsd_core.c | 6 |
10 files changed, 35 insertions, 5 deletions
diff --git a/driver_evermore.c b/driver_evermore.c index e035b77b..97c7629f 100644 --- a/driver_evermore.c +++ b/driver_evermore.c @@ -184,6 +184,7 @@ gps_mask_t evermore_parse(struct gps_device_t * session, unsigned char *buf, gpstime_to_unix(session->context->gps_week, session->context->gps_tow) - session->context->leap_seconds; + gpsd_rollover_check(session, session->newdata.time); /*@ end @*/ ecef_to_wgs84fix(&session->newdata, &session->gpsdata.separation, getlesl(buf2, 8) * 1.0, getlesl(buf2, 12) * 1.0, @@ -224,6 +225,7 @@ gps_mask_t evermore_parse(struct gps_device_t * session, unsigned char *buf, gpstime_to_unix(session->context->gps_week, session->context->gps_tow) - session->context->leap_seconds; + gpsd_rollover_check(session, session->newdata.time); /*@ end @*/ /* * We make a deliberate choice not to clear DOPs from the @@ -273,6 +275,7 @@ gps_mask_t evermore_parse(struct gps_device_t * session, unsigned char *buf, gpstime_to_unix(session->context->gps_week, session->context->gps_tow) - session->context->leap_seconds; + gpsd_rollover_check(session, session->gpsdata.skyview_time); /*@ end @*/ session->gpsdata.satellites_visible = (int)getub(buf2, 8); gpsd_zero_satellites(&session->gpsdata); @@ -333,6 +336,7 @@ gps_mask_t evermore_parse(struct gps_device_t * session, unsigned char *buf, gpstime_to_unix(session->context->gps_week, session->context->gps_tow) - session->context->leap_seconds; + gpsd_rollover_check(session, session->newdata.time); /*@ end @*/ visible = (unsigned char)getub(buf2, 10); /* diff --git a/driver_italk.c b/driver_italk.c index 8f80699f..df9674b7 100644 --- a/driver_italk.c +++ b/driver_italk.c @@ -61,6 +61,7 @@ static gps_mask_t decode_itk_navfix(struct gps_device_t *session, t = gpstime_to_unix((int)gps_week, session->context->gps_tow) - session->context->leap_seconds; session->newdata.time = t; + gpsd_rollover_check(session, session->newdata.time); mask |= TIME_IS; epx = (double)(getlesl(buf, 7 + 96) / 100.0); @@ -136,6 +137,7 @@ static gps_mask_t decode_itk_prnstatus(struct gps_device_t *session, t = gpstime_to_unix((int)gps_week, session->context->gps_tow) - session->context->leap_seconds; session->gpsdata.skyview_time = t; + gpsd_rollover_check(session, session->gpsdata.skyview_time); gpsd_zero_satellites(&session->gpsdata); nsv = 0; @@ -201,6 +203,7 @@ static gps_mask_t decode_itk_utcionomodel(struct gps_device_t *session, t = gpstime_to_unix((int)gps_week, session->context->gps_tow) - session->context->leap_seconds; session->newdata.time = t; + gpsd_rollover_check(session, session->newdata.time); gpsd_report(LOG_DATA, "UTC_IONO_MODEL: time=%.2f mask={TIME}\n", @@ -272,6 +275,8 @@ static gps_mask_t decode_itk_pseudo(struct gps_device_t *session, session->context->gps_tow = tow / 1000.0; t = gpstime_to_unix((int)gps_week, session->context->gps_tow) - session->context->leap_seconds; + session->newdata.time = t; + gpsd_rollover_check(session, session->newdata.time); /*@-type@*/ for (i = 0; i < n; i++){ diff --git a/driver_navcom.c b/driver_navcom.c index 8a43a5dd..237bcc50 100644 --- a/driver_navcom.c +++ b/driver_navcom.c @@ -413,6 +413,7 @@ static gps_mask_t handle_0xb1(struct gps_device_t *session) session->newdata.time = gpstime_to_unix((int)week, session->context->gps_tow) - session->context->leap_seconds; + gpsd_rollover_check(session, session->newdata.time); /* Satellites used */ sats_used = (uint32_t) getleul(buf, 9); @@ -736,6 +737,7 @@ static gps_mask_t handle_0x86(struct gps_device_t *session) session->gpsdata.skyview_time = gpstime_to_unix((int)week, session->context->gps_tow) - session->context->leap_seconds; + gpsd_rollover_check(session, session->gpsdata.skyview_time); /*@ end @*/ /* Give this driver a single point of truth about DOPs */ //session->gpsdata.dop.pdop = (int)pdop / 10.0; @@ -934,6 +936,7 @@ static gps_mask_t handle_0xb5(struct gps_device_t *session) session->newdata.time = gpstime_to_unix((int)week, session->context->gps_tow) - session->context->leap_seconds; + gpsd_rollover_check(session, session->newdata.time); /*@ end @*/ gpsd_report(LOG_PROG, "Navcom: received packet type 0xb5 (Pseudorange Noise Statistics)\n"); diff --git a/driver_proto.c b/driver_proto.c index 98cc8a1b..12908a45 100644 --- a/driver_proto.c +++ b/driver_proto.c @@ -157,6 +157,7 @@ _proto__msg_utctime(struct gps_device_t *session, unsigned char *buf, size_t dat t = gpstime_to_unix(gps_week, session->context->gps_tow) - session->context->leap_seconds; session->newdata.time = t; + gpsd_rollover_check(session, session->newdata.time); return TIME_IS | ONLINE_IS; } diff --git a/driver_sirf.c b/driver_sirf.c index 449fd0b0..9895b7db 100644 --- a/driver_sirf.c +++ b/driver_sirf.c @@ -475,6 +475,7 @@ static gps_mask_t sirf_msg_svinfo(struct gps_device_t *session, = gpstime_to_unix(session->context->gps_week, session->context->gps_tow) - session->context->leap_seconds; + gpsd_rollover_check(session, session->gpsdata.skyview_time); /*@ end @*/ for (i = st = 0; i < SIRF_CHANNELS; i++) { int off = 8 + 15 * i; @@ -631,8 +632,9 @@ static gps_mask_t sirf_msg_navsol(struct gps_device_t *session, /*@ ignore @*//*@ splint is confused @ */ session->newdata.time = gpstime_to_unix(session->context->gps_week, - session->context->gps_tow) - - session->context->leap_seconds; + session->context->gps_tow) + - session->context->leap_seconds; + gpsd_rollover_check(session, session->newdata.time); /*@ end @*/ #ifdef NTPSHM_ENABLE if (session->newdata.mode <= MODE_NO_FIX) { diff --git a/driver_tsip.c b/driver_tsip.c index 0f10306f..8d30c62e 100644 --- a/driver_tsip.c +++ b/driver_tsip.c @@ -192,8 +192,8 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session) session->newdata.time = gpstime_to_unix(session->context->gps_week, - session->context->gps_tow) - - session->context->leap_seconds; + session->context->gps_tow) - session->context->leap_seconds; + gpsd_rollover_check(session, session->newdata.time); mask |= TIME_IS; } gpsd_report(LOG_INF, "GPS Time %f %d %f\n", f1, s1, f2); @@ -292,6 +292,7 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session) gpstime_to_unix((int)session->context->gps_week, session->context->gps_tow) - session->context->leap_seconds; + gpsd_rollover_check(session, session->newdata.time); mask |= TIME_IS; } mask |= LATLON_IS | ALTITUDE_IS | CLEAR_IS | REPORT_IS; @@ -555,6 +556,7 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session) gpstime_to_unix((int)session->context->gps_week, session->context->gps_tow) - session->context->leap_seconds; + gpsd_rollover_check(session, session->newdata.time); mask |= TIME_IS; } gpsd_report(LOG_INF, "GPS DP LLA %f %f %f %f\n", @@ -654,6 +656,7 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session) session->newdata.time = gpstime_to_unix((int)s4, session->context->gps_tow) - session->context->leap_seconds; + gpsd_rollover_check(session, session->newdata.time); /*@ end @*/ mask |= TIME_IS | LATLON_IS | ALTITUDE_IS | SPEED_IS | TRACK_IS | @@ -697,6 +700,7 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session) gpstime_to_unix(session->context->gps_week, session->context->gps_tow) - session->context->leap_seconds; + gpsd_rollover_check(session, session->newdata.time); /*@ end @*/ session->gpsdata.status = STATUS_NO_FIX; session->newdata.mode = MODE_NO_FIX; @@ -765,6 +769,7 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session) session->newdata.time = gpstime_to_unix((int)s1, session->context->gps_tow) - (double)s2; + gpsd_rollover_check(session, session->newdata.time); mask |= TIME_IS | CLEAR_IS; gpsd_report(LOG_DATA, "SP-TTS 0xab time=%.2f mask={TIME}\n", session->newdata.time); diff --git a/driver_ubx.c b/driver_ubx.c index 5c7aff7a..c472091a 100644 --- a/driver_ubx.c +++ b/driver_ubx.c @@ -73,6 +73,7 @@ ubx_msg_nav_sol(struct gps_device_t *session, unsigned char *buf, session->context->gps_tow) - session->context->leap_seconds; session->newdata.time = t; + gpsd_rollover_check(session, session->newdata.time); mask |= TIME_IS; } @@ -185,6 +186,7 @@ ubx_msg_nav_timegps(struct gps_device_t *session, unsigned char *buf, session->context->gps_tow) - session->context->leap_seconds; session->newdata.time = t; + gpsd_rollover_check(session, session->newdata.time); gpsd_report(LOG_DATA, "TIMEGPS: time=%.2f mask={TIME}\n", session->newdata.time); diff --git a/driver_zodiac.c b/driver_zodiac.c index 7525586c..e88d9e23 100644 --- a/driver_zodiac.c +++ b/driver_zodiac.c @@ -241,6 +241,7 @@ static gps_mask_t handle1002(struct gps_device_t *session) session->context->gps_tow = (double)gps_seconds; session->gpsdata.skyview_time = gpstime_to_unix(gps_week, session->context->gps_tow); + gpsd_rollover_check(session, session->gpsdata.skyview_time); gpsd_report(LOG_DATA, "1002: visible=%d used=%d mask={SATELLITE|USED}\n", session->gpsdata.satellites_visible, session->gpsdata.satellites_used); diff --git a/gpsd.h-tail b/gpsd.h-tail index 06879c2c..f5857efb 100644 --- a/gpsd.h-tail +++ b/gpsd.h-tail @@ -562,8 +562,9 @@ extern /*@ observer @*/ char *gpsd_hexdump_wrapper(/*@null@*/const void *, size_ extern int gpsd_hexpack(/*@in@*/const char *, /*@out@*/char *, size_t); extern int hex2bin(const char *); extern ssize_t hex_escapes(/*@out@*/char *cooked, const char *raw); -extern void ntpd_link_activate(struct gps_device_t *session); +extern void ntpd_link_activate(struct gps_device_t *); extern char /*@observer@*/ *gpsd_id(/*@in@*/struct gps_device_t *); +extern void gpsd_rollover_check(/*@in@ */ struct gps_device_t *, const double); extern void gpsd_position_fix_dump(struct gps_device_t *, /*@out@*/char[], size_t); extern void gpsd_clear_data(struct gps_device_t *); extern socket_t netlib_connectsock(int, const char *, const char *, const char *); diff --git a/libgpsd_core.c b/libgpsd_core.c index 6df1067f..fd91e440 100644 --- a/libgpsd_core.c +++ b/libgpsd_core.c @@ -810,6 +810,12 @@ char /*@observer@*/ *gpsd_id( /*@in@ */ struct gps_device_t *session) return (buf); } +void gpsd_rollover_check(/*@in@ */ struct gps_device_t *session, const double unixtime) +{ + if (session->context->start_time >= GPS_EPOCH && unixtime < session->context->start_time) + gpsd_report(LOG_WARN, "GPS week rollover makes time invalid"); +} + /***************************************************************************** Carl Carter of SiRF supplied this algorithm for computing DOPs from |