gpsd-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gpsd-dev] [PATCH 1/3] Check valid flags in NAV-TIMEGPS


From: Clark Li
Subject: [gpsd-dev] [PATCH 1/3] Check valid flags in NAV-TIMEGPS
Date: Sun, 17 Sep 2017 04:02:12 +0000

Split 22a020ec1c2bc85eff681ecacc6d2bb79fdddc9c Support UBX NAV-PVT
---
 driver_ubx.c | 32 ++++++++++++++++++++++----------
 driver_ubx.h |  4 ++++
 2 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/driver_ubx.c b/driver_ubx.c
index 88be6c0..e0055af 100644
--- a/driver_ubx.c
+++ b/driver_ubx.c
@@ -292,24 +292,36 @@ static gps_mask_t
 ubx_msg_nav_timegps(struct gps_device_t *session, unsigned char *buf,
                    size_t data_len)
 {
-    unsigned int gw, tow, flags;
+    unsigned int gw, iTOW, flags;
+    int fTOW;
+    gps_mask_t mask = 0;
 
     if (data_len != 16)
        return 0;
 
-    tow = (unsigned int)getleu32(buf, 0);
-    gw = (unsigned int)getles16(buf, 8);
     flags = (unsigned int)getub(buf, 11);
-    if ((flags & 0x7) != 0)
+    // Valid leap seconds
+    if ((flags & UBX_TIMEGPS_VALID_LEAP_SECOND) == 
UBX_TIMEGPS_VALID_LEAP_SECOND)
        session->context->leap_seconds = (int)getub(buf, 10);
-    session->newdata.time = gpsd_gpstime_resolve(session,
-                                             (unsigned short int)gw,
-                                             (double)tow / 1000.0);
+    // Valid GPS time of week and week number
+#define VALID_TIME (UBX_TIMEGPS_VALID_TIME | UBX_TIMEGPS_VALID_WEEK)
+    if ((flags & VALID_TIME) == VALID_TIME)
+#undef VALID_TIME
+    {
+       iTOW = (unsigned int)getleu32(buf, 0);
+       fTOW = (int)getles32(buf, 4);
+       gw = (unsigned int)getles16(buf, 8);
+       session->newdata.time =
+         gpsd_gpstime_resolve(session,
+                              (unsigned short int)gw,
+                              ((double)iTOW * 1e-3));
+       mask |= (TIME_SET | NTPTIME_IS);
+    }
 
     gpsd_log(&session->context->errout, LOG_DATA,
-            "TIMEGPS: time=%.2f leap=%d, mask={TIME}\n",
-            session->newdata.time, session->context->leap_seconds);
-    return TIME_SET | NTPTIME_IS;
+            "TIMEGPS: time=%.2f mask={TIME}\n",
+            session->newdata.time);
+    return mask;
 }
 
 /**
diff --git a/driver_ubx.h b/driver_ubx.h
index c23efdf..c4e28fe 100644
--- a/driver_ubx.h
+++ b/driver_ubx.h
@@ -102,6 +102,10 @@ typedef enum {
 #define UBX_SOL_VALID_WEEK 0x04
 #define UBX_SOL_VALID_TIME 0x08
 
+#define UBX_TIMEGPS_VALID_TIME        0x01
+#define UBX_TIMEGPS_VALID_WEEK        0x02
+#define UBX_TIMEGPS_VALID_LEAP_SECOND 0x04
+
 /* from UBX_NAV_SVINFO */
 #define UBX_SAT_USED 0x01
 #define UBX_SAT_DGPS 0x02
-- 
2.7.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]