summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--driver_evermore.c16
-rw-r--r--driver_italk.c15
-rw-r--r--driver_navcom.c22
-rw-r--r--driver_proto.c4
-rw-r--r--driver_sirf.c9
-rw-r--r--driver_tsip.c27
-rw-r--r--driver_ubx.c10
-rw-r--r--driver_zodiac.c3
8 files changed, 67 insertions, 39 deletions
diff --git a/driver_evermore.c b/driver_evermore.c
index 1f8b705b..c8136e28 100644
--- a/driver_evermore.c
+++ b/driver_evermore.c
@@ -184,11 +184,11 @@ gps_mask_t evermore_parse(struct gps_device_t * session, unsigned char *buf,
switch (type) {
case 0x02: /* Navigation Data Output */
session->context->gps_week = getleuw(buf2, 2);
+ session->context->gps_tow = getleul(buf2, 4) * 0.01;
/*@ ignore @*//*@ splint is confused @ */
session->newdata.time =
gpstime_to_unix(session->context->gps_week,
- getleul(buf2,
- 4) * 0.01) -
+ session->context->gps_tow) -
session->context->leap_seconds;
/*@ end @*/
ecef_to_wgs84fix(&session->newdata, &session->gpsdata.separation,
@@ -224,11 +224,11 @@ gps_mask_t evermore_parse(struct gps_device_t * session, unsigned char *buf,
case 0x04: /* DOP Data Output */
session->context->gps_week = getleuw(buf2, 2);
+ session->context->gps_tow = getleul(buf2, 4) * 0.01;
/*@ ignore @*//*@ splint is confused @ */
session->newdata.time =
gpstime_to_unix(session->context->gps_week,
- getleul(buf2,
- 4) * 0.01) -
+ session->context->gps_tow) -
session->context->leap_seconds;
/*@ end @*/
clear_dop(&session->gpsdata.dop);
@@ -268,11 +268,11 @@ gps_mask_t evermore_parse(struct gps_device_t * session, unsigned char *buf,
case 0x06: /* Channel Status Output */
session->context->gps_week = getleuw(buf2, 2);
+ session->context->gps_tow = getleul(buf2, 4) * 0.01;
/*@ ignore @*//*@ splint is confused @ */
session->gpsdata.skyview_time =
gpstime_to_unix(session->context->gps_week,
- getleul(buf2,
- 4) * 0.01) -
+ session->context->gps_tow) -
session->context->leap_seconds;
/*@ end @*/
session->gpsdata.satellites_visible = (int)getub(buf2, 8);
@@ -328,11 +328,11 @@ gps_mask_t evermore_parse(struct gps_device_t * session, unsigned char *buf,
/* clock offset is a manufacturer diagnostic */
/* (int)getleuw(buf2, 8); clock offset, 29000..29850 ?? */
session->context->gps_week = getleuw(buf2, 2);
+ session->context->gps_tow = getleul(buf2, 4) * 0.01;
/*@ ignore @*//*@ splint is confused @ */
session->newdata.time =
gpstime_to_unix(session->context->gps_week,
- getleul(buf2,
- 4) * 0.01) -
+ session->context->gps_tow) -
session->context->leap_seconds;
/*@ end @*/
visible = (unsigned char)getub(buf2, 10);
diff --git a/driver_italk.c b/driver_italk.c
index 4933164c..c21838f7 100644
--- a/driver_italk.c
+++ b/driver_italk.c
@@ -63,8 +63,9 @@ static gps_mask_t decode_itk_navfix(struct gps_device_t *session,
gps_week = (ushort) getlesw(buf, 7 + 82);
session->context->gps_week = gps_week;
tow = (uint) getleul(buf, 7 + 84);
- t = gpstime_to_unix((int)gps_week,
- tow / 1000.0) - session->context->leap_seconds;
+ 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;
mask |= TIME_IS;
@@ -138,8 +139,9 @@ static gps_mask_t decode_itk_prnstatus(struct gps_device_t *session,
gps_week = (ushort) getleuw(buf, 7 + 4);
session->context->gps_week = gps_week;
tow = (uint) getleul(buf, 7 + 6);
- t = gpstime_to_unix((int)gps_week,
- tow / 1000.0) - session->context->leap_seconds;
+ session->context->gps_tow = tow / 1000.0;
+ t = gpstime_to_unix((int)gps_week,session->context->gps_tow)
+ - session->context->leap_seconds;
session->gpsdata.skyview_time = t;
gpsd_zero_satellites(&session->gpsdata);
@@ -202,8 +204,9 @@ static gps_mask_t decode_itk_utcionomodel(struct gps_device_t *session,
gps_week = (ushort) getleuw(buf, 7 + 36);
session->context->gps_week = gps_week;
tow = (uint) getleul(buf, 7 + 38);
- t = gpstime_to_unix((int)gps_week,
- tow / 1000.0) - session->context->leap_seconds;
+ 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_report(LOG_DATA,
diff --git a/driver_navcom.c b/driver_navcom.c
index 9fb75624..94ef0b0a 100644
--- a/driver_navcom.c
+++ b/driver_navcom.c
@@ -416,9 +416,10 @@ static gps_mask_t handle_0xb1(struct gps_device_t *session)
week = (uint16_t) getleuw(buf, 3);
session->context->gps_week = week;
tow = (uint32_t) getleul(buf, 5);
+ session->context->gps_tow = tow / 1000.0;
session->newdata.time =
- gpstime_to_unix((int)week,
- tow / 1000.0) - session->context->leap_seconds;
+ gpstime_to_unix((int)week, session->context->gps_tow)
+ - session->context->leap_seconds;
/* Satellites used */
sats_used = (uint32_t) getleul(buf, 9);
@@ -656,7 +657,9 @@ static gps_mask_t handle_0x81(struct gps_device_t *session)
/*@ +predboolothers @*/
char time_str[24];
session->context->gps_week = wn;
- (void)unix_to_iso8601(gpstime_to_unix((int)wn, (double)(toc * SF_TOC)),
+ session->context->gps_tow = (double)(toc * SF_TOC);
+ /* leap second? */
+ (void)unix_to_iso8601(gpstime_to_unix((int)wn, session->context->gps_tow),
time_str, sizeof(time_str));
gpsd_report(LOG_PROG,
@@ -737,10 +740,11 @@ static gps_mask_t handle_0x86(struct gps_device_t *session)
/* Timestamp and PDOP */
session->context->gps_week = week;
+ session->context->gps_tow = tow / 1000.0f;
/*@ ignore @*//*@ splint is confused @ */
session->gpsdata.skyview_time =
- gpstime_to_unix((int)week,
- tow / 1000.0f) - session->context->leap_seconds;
+ gpstime_to_unix((int)week, session->context->gps_tow)
+ - session->context->leap_seconds;
/*@ end @*/
/* Give this driver a single point of truth about DOPs */
//session->gpsdata.dop.pdop = (int)pdop / 10.0;
@@ -839,7 +843,8 @@ static gps_mask_t handle_0xb0(struct gps_device_t *session)
char time_str[24];
session->context->gps_week = week;
- (void)unix_to_iso8601(gpstime_to_unix((int)week, (double)tow / 1000.0),
+ session->context->gps_tow = (double)tow / 1000.0;
+ (void)unix_to_iso8601(gpstime_to_unix((int)week, session->context->gps_tow),
time_str, sizeof(time_str));
gpsd_report(LOG_PROG,
@@ -932,10 +937,11 @@ static gps_mask_t handle_0xb5(struct gps_device_t *session)
mask |= (HERR_IS | VERR_IS);
#endif /* __UNUSED__ */
session->context->gps_week = week;
+ session->context->gps_tow = tow / 1000.0f;
/*@ ignore @*//*@ splint is confused @ */
session->newdata.time =
- gpstime_to_unix((int)week,
- tow / 1000.0f) - session->context->leap_seconds;
+ gpstime_to_unix((int)week, session->context->gps_tow)
+ - session->context->leap_seconds;
/*@ 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 a140c640..79fa4b7b 100644
--- a/driver_proto.c
+++ b/driver_proto.c
@@ -156,8 +156,10 @@ _proto__msg_utctime(struct gps_device_t *session, unsigned char *buf, size_t dat
gps_week = GET_WEEKNUMBER();
session->context->gps_week = gps_week;
session->context->leap_seconds = GET_GPS_LEAPSECONDS();
+ session->context->gps_tow = tow / 1000.0;
- t = gpstime_to_unix(gps_week, tow/1000.0) - session->context->leap_seconds;
+ t = gpstime_to_unix(gps_week, session->context->gps_tow)
+ - session->context->leap_seconds;
session->newdata.time = t;
return TIME_IS | ONLINE_IS;
diff --git a/driver_sirf.c b/driver_sirf.c
index 6d426ab1..2d2d676a 100644
--- a/driver_sirf.c
+++ b/driver_sirf.c
@@ -471,12 +471,12 @@ static gps_mask_t sirf_msg_svinfo(struct gps_device_t *session,
gpsd_zero_satellites(&session->gpsdata);
session->context->gps_week = getbesw(buf, 1);
+ session->context->gps_tow = getbeul(buf, 3) * 1e-2;
/*@ ignore @*//*@ splint is confused @ */
session->gpsdata.skyview_time
=
- gpstime_to_unix( session->context->gps_week,
- getbeul(buf,
- 3) * 1e-2) - session->context->leap_seconds;
+ gpstime_to_unix( session->context->gps_week, session->context->gps_tow)
+ - session->context->leap_seconds;
/*@ end @*/
for (i = st = 0; i < SIRF_CHANNELS; i++) {
int off = 8 + 15 * i;
@@ -614,9 +614,10 @@ static gps_mask_t sirf_msg_navsol(struct gps_device_t *session,
/* byte 20 is HDOP, see below */
/* byte 21 is "mode 2", not clear how to interpret that */
session->context->gps_week = getbesw(buf, 22);
+ session->context->gps_tow = getbeul(buf, 24) * 1e-2;
/*@ ignore @*//*@ splint is confused @ */
session->newdata.time =
- gpstime_to_unix(getbesw(buf, 22), getbeul(buf, 24) * 1e-2) -
+ gpstime_to_unix(session->context->gps_week, session->context->gps_tow) -
session->context->leap_seconds;
/*@ end @*/
#ifdef NTPSHM_ENABLE
diff --git a/driver_tsip.c b/driver_tsip.c
index 9d4109d0..1e82f18a 100644
--- a/driver_tsip.c
+++ b/driver_tsip.c
@@ -197,8 +197,10 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
session->context->gps_week = s1;
session->context->leap_seconds = (int)round(f2);
session->context->valid |= LEAP_SECOND_VALID;
+ session->context->gps_tow = f1;
- session->newdata.time = gpstime_to_unix((int)s1, f1) - f2;
+ session->newdata.time = gpstime_to_unix(session->context->gps_week
+ , session->context->gps_tow) - session->context->leap_seconds;
mask |= TIME_IS;
}
gpsd_report(LOG_INF, "GPS Time %f %d %f\n", f1, s1, f2);
@@ -290,10 +292,12 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
session->newdata.altitude = getbef(buf, 8);
f1 = getbef(buf, 12); /* clock bias */
f2 = getbef(buf, 16); /* time-of-fix */
+ session->context->gps_tow = f2;
if (session->context->gps_week) {
session->newdata.time =
gpstime_to_unix((int)session->context->gps_week,
- f2) - session->context->leap_seconds;
+ session->context->gps_tow)
+ - session->context->leap_seconds;
mask |= TIME_IS;
}
mask |= LATLON_IS | ALTITUDE_IS | CLEAR_IS | REPORT_IS;
@@ -551,10 +555,12 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
session->newdata.altitude = getbed(buf, 16);
d1 = getbed(buf, 24); /* clock bias */
f1 = getbef(buf, 32); /* time-of-fix */
+ session->context->gps_tow = f1;
if (session->context->gps_week) {
session->newdata.time =
gpstime_to_unix((int)session->context->gps_week,
- f1) - session->context->leap_seconds;
+ session->context->gps_tow)
+ - session->context->leap_seconds;
mask |= TIME_IS;
}
gpsd_report(LOG_INF, "GPS DP LLA %f %f %f %f\n",
@@ -649,10 +655,11 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
session->context->valid |= LEAP_SECOND_VALID;
}
session->context->gps_week = s4;
+ session->context->gps_tow = ul1 * 1e-3;
/*@ ignore @*//*@ splint is confused @ */
session->newdata.time =
- gpstime_to_unix((int)s4,
- ul1 * 1e-3) - session->context->leap_seconds;
+ gpstime_to_unix((int)s4, session->context->gps_tow)
+ - session->context->leap_seconds;
/*@ end @*/
mask |=
TIME_IS | LATLON_IS | ALTITUDE_IS | SPEED_IS | TRACK_IS |
@@ -690,10 +697,12 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
session->context->valid |= LEAP_SECOND_VALID;
}
session->context->gps_week = s1;
+ session->context->gps_tow = ul1 * 1e3;
/*@ ignore @*//*@ splint is confused @ */
session->newdata.time =
- gpstime_to_unix(session->context->gps_week,
- ul1 * 1e-3) - session->context->leap_seconds;
+ gpstime_to_unix(session->context->gps_week,
+ session->context->gps_tow)
+ - session->context->leap_seconds;
/*@ end @*/
session->gpsdata.status = STATUS_NO_FIX;
session->newdata.mode = MODE_NO_FIX;
@@ -758,8 +767,10 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
session->context->valid |= LEAP_SECOND_VALID;
session->context->gps_week = s1;
+ session->context->gps_tow = (double)ul1;
session->newdata.time =
- gpstime_to_unix((int)s1, (double)ul1) - (double)s2;
+ gpstime_to_unix((int)s1, session->context->gps_tow)
+ - (double)s2;
mask |= TIME_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 0bb61958..127f410f 100644
--- a/driver_ubx.c
+++ b/driver_ubx.c
@@ -73,9 +73,11 @@ ubx_msg_nav_sol(struct gps_device_t *session, unsigned char *buf,
tow = (unsigned int)getleul(buf, 0);
gw = (unsigned short)getlesw(buf, 8);
session->context->gps_week = gw;
+ session->context->gps_tow = tow / 1000.0;
- t = gpstime_to_unix((int)session->context->gps_week,
- tow / 1000.0) - session->context->leap_seconds;
+ t = gpstime_to_unix((int)session->context->gps_week,
+ session->context->gps_tow)
+ - session->context->leap_seconds;
session->newdata.time = t;
mask |= TIME_IS;
}
@@ -179,8 +181,10 @@ ubx_msg_nav_timegps(struct gps_device_t *session, unsigned char *buf,
if ((flags & 0x7) != 0)
session->context->leap_seconds = (int)getub(buf, 10);
+ session->context->gps_tow = tow / 1000.0;
t = gpstime_to_unix((int)session->context->gps_week,
- tow / 1000.0) - session->context->leap_seconds;
+ session->context->gps_tow)
+ - session->context->leap_seconds;
session->newdata.time = t;
gpsd_report(LOG_DATA, "TIMEGPS: time=%.2f mask={TIME}\n",
diff --git a/driver_zodiac.c b/driver_zodiac.c
index 58537dc1..f2a8d496 100644
--- a/driver_zodiac.c
+++ b/driver_zodiac.c
@@ -241,8 +241,9 @@ static gps_mask_t handle1002(struct gps_device_t *session)
}
}
session->context->gps_week = gps_week;
+ session->context->gps_tow = (double) gps_seconds;
session->gpsdata.skyview_time =
- gpstime_to_unix(gps_week, (double)gps_seconds);
+ gpstime_to_unix(gps_week, session->context->gps_tow);
gpsd_report(LOG_DATA, "1002: visible=%d used=%d mask={SATELLITE|USED}\n",
session->gpsdata.satellites_visible,
session->gpsdata.satellites_used);