summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--driver_garmin.c6
-rw-r--r--gpsd.h-tail7
-rw-r--r--monitor_garmin.c2
3 files changed, 11 insertions, 4 deletions
diff --git a/driver_garmin.c b/driver_garmin.c
index da09f9d6..fc03775d 100644
--- a/driver_garmin.c
+++ b/driver_garmin.c
@@ -368,8 +368,8 @@ gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id,
// 631065600, unix seconds for 31 Dec 1989 Zulu
time_l = (time_t) (631065600 + (GPSD_LE32TOH(pvt->grmn_days) * 86400));
// TODO, convert grmn_days to context->gps_week
- time_l -= GPSD_LE16TOH(pvt->leap_sec);
- session->context->leap_seconds = (int)GPSD_LE16TOH(pvt->leap_sec);
+ time_l -= GPSD_LE16TOH(pvt->leap_sec) + TAI_GPS_OFFSET;
+ session->context->leap_seconds = (int)GPSD_LE16TOH(pvt->leap_sec) + TAI_GPS_OFFSET;
session->context->valid = LEAP_SECOND_VALID;
// gps_tow is always like x.999 or x.998 so just round it
time_l += (time_t) round(pvt->gps_tow);
@@ -472,7 +472,7 @@ gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id,
pvt->alt, pvt->epe, pvt->eph, pvt->epv, GPSD_LE16TOH(pvt->fix),
pvt->gps_tow, session->newdata.latitude,
session->newdata.longitude, pvt->lon_vel, pvt->lat_vel,
- pvt->alt_vel, pvt->msl_hght, GPSD_LE16TOH(pvt->leap_sec),
+ pvt->alt_vel, pvt->msl_hght, GPSD_LE16TOH(pvt->leap_sec) + TAI_GPS_OFFSET,
GPSD_LE32TOH(pvt->grmn_days));
if (session->newdata.mode > MODE_NO_FIX) {
diff --git a/gpsd.h-tail b/gpsd.h-tail
index acff12f4..7b457642 100644
--- a/gpsd.h-tail
+++ b/gpsd.h-tail
@@ -89,6 +89,13 @@ enum isgpsstat_t {
*/
#define GPS_EPOCH 315964800 /* 6 Jan 1981 00:00:00 UTC */
+/*
+ * TAI - GPS = 19 seconds.
+ * Needed because some devices (notably Garmin binary GPSes)
+ * report GPS - UTC offset.
+ */
+#define TAI_GPS_OFFSET 19
+
struct gps_packet_t {
/* packet-getter internals */
int type;
diff --git a/monitor_garmin.c b/monitor_garmin.c
index a3cfc736..10489909 100644
--- a/monitor_garmin.c
+++ b/monitor_garmin.c
@@ -177,7 +177,7 @@ static void garmin_bin_update(uint16_t pkt_id, uint32_t pkt_size UNUSED, unsigne
display(mid51win, 4, 8, "%8.2f", pvt->alt + pvt->msl_hght);
display(mid51win, 5, 9, "%5.1f", hypot(pvt->lon_vel, pvt->lat_vel));
display(mid51win, 6, 9, "%5.1f", pvt->alt_vel);
- display(mid51win, 7, 8, "%d", (int)GPSD_LE16TOH(pvt->leap_sec));
+ display(mid51win, 7, 8, "%d", (int)GPSD_LE16TOH(pvt->leap_sec) + TAI_GPS_OFFSET);
display(mid51win, 8, 7, "%6.2f", pvt->epe);
display(mid51win, 9, 7, "%6.2f", pvt->eph);
display(mid51win, 10, 7, "%6.2f", pvt->epv);