summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--driver_evermore.c4
-rw-r--r--driver_italk.c5
-rw-r--r--driver_navcom.c3
-rw-r--r--driver_proto.c1
-rw-r--r--driver_sirf.c6
-rw-r--r--driver_tsip.c9
-rw-r--r--driver_ubx.c2
-rw-r--r--driver_zodiac.c1
-rw-r--r--gpsd.h-tail3
-rw-r--r--libgpsd_core.c6
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