gpsd-dev
[Top][All Lists]
Advanced

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

[gpsd-dev] [PATCH] Support UBX NAV-PVT


From: Clark Li
Subject: [gpsd-dev] [PATCH] Support UBX NAV-PVT
Date: Thu, 20 Jul 2017 09:15:16 +0000

NAV-SOL has only been retained for backwards compatibility; users are 
recommended to use the UBX-NAV-PVT message in preference.

A regression test case using ublox-neo-m8n is also added.

Also fix the checking on valid flags of iTOW and fTOW and process fTOW whose 
range is +-500us. Update test/dae/ublox-aek-4t.log.chk accordingly.
---
 driver_ubx.c                      | 170 ++++++++++++++++++++++++++++++++------
 driver_ubx.h                      |  11 +++
 test/daemon/ublox-aek-4t.log.chk  |   2 +-
 test/daemon/ublox-neo-m8n.log     | Bin 0 -> 5054 bytes
 test/daemon/ublox-neo-m8n.log.chk | 120 +++++++++++++++++++++++++++
 5 files changed, 279 insertions(+), 24 deletions(-)  create mode 100644 
test/daemon/ublox-neo-m8n.log  create mode 100644 
test/daemon/ublox-neo-m8n.log.chk

diff --git a/driver_ubx.c b/driver_ubx.c index 88be6c07..6236c25d 100644
--- a/driver_ubx.c
+++ b/driver_ubx.c
@@ -130,19 +130,129 @@ static gps_mask_t  ubx_msg_nav_pvt(struct gps_device_t 
*session, unsigned char *buf,
                size_t data_len)
 {
-    unsigned int flags;
+    uint8_t valid;
+    uint8_t flags;
+    uint8_t navmode;
+    struct tm unpacked_date;
+    double subseconds;
+    double hacc, vacc, sacc;
+    int *status = &session->gpsdata.status;
+    int *mode = &session->newdata.mode;
     gps_mask_t mask = 0;
 
     if (data_len != 92)
-       return 0;
+        return 0;
 
+    valid = (unsigned int)getub(buf, 11);
+    navmode = (unsigned char)getub(buf, 20);
     flags = (unsigned int)getub(buf, 21);
 
-    /* TODO: finish decoding UBX_MON_PVT
-     * no need until depreacaed UBX_MON_SOL is dead
-     */
+    switch (navmode)
+    {
+    case UBX_MODE_TMONLY:
+    {
+        if (*mode != MODE_NO_FIX) {
+            *mode = MODE_NO_FIX;
+            mask |= MODE_SET;
+        }
+        if (*status != STATUS_NO_FIX) {
+            *status = STATUS_NO_FIX;
+            mask |= STATUS_SET;
+        }
+        break;
+    }
+    case UBX_MODE_3D:
+    case UBX_MODE_GPSDR:
+    {
+        if (*mode != MODE_3D) {
+            *mode = MODE_3D;
+            mask |= MODE_SET;
+        }
+        if ((flags & UBX_NAV_PVT_FLAG_DGPS) == UBX_NAV_PVT_FLAG_DGPS) {
+            if (*status != STATUS_DGPS_FIX) {
+                *status = STATUS_DGPS_FIX;
+                mask |= STATUS_SET;
+            }
+        } else {
+            if (*status != STATUS_FIX) {
+                *status = STATUS_FIX;
+                mask |= STATUS_SET;
+            }
+        }
+        mask |=   LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLEAR_IS
+                | REPORT_IS;
+        break;
+    }
+    case UBX_MODE_2D:
+    case UBX_MODE_DR:        /* consider this too as 2D */
+    {
+        if (*mode != MODE_2D) {
+            *mode = MODE_2D;
+            mask |= MODE_SET;
+        };
+        if (*status != STATUS_FIX) {
+            *status = STATUS_FIX;
+            mask |= STATUS_SET;
+        }
+        mask |= LATLON_SET | SPEED_SET;
+        break;
+    }
+    default:
+    {
+        if (*mode != MODE_NO_FIX) {
+            *mode = MODE_NO_FIX;
+            mask |= MODE_SET;
+        };
+        if (*status != STATUS_NO_FIX) {
+            *status = STATUS_NO_FIX;
+            mask |= STATUS_SET;
+        }
+        break;
+    }
+    }
+
+    if ((valid & UBX_NAV_PVT_VALID_DATE_TIME) == UBX_NAV_PVT_VALID_DATE_TIME) {
+        unpacked_date.tm_year = (uint16_t)getleu16(buf, 4) - 1900;
+        unpacked_date.tm_mon = (uint8_t)getub(buf, 6) - 1;
+        unpacked_date.tm_mday = (uint8_t)getub(buf, 7);
+        unpacked_date.tm_hour = (uint8_t)getub(buf, 8);
+        unpacked_date.tm_min = (uint8_t)getub(buf, 9);
+        unpacked_date.tm_sec = (uint8_t)getub(buf, 10);
+        unpacked_date.tm_isdst = 0;
+        unpacked_date.tm_wday = 0;
+        unpacked_date.tm_yday = 0;
+        subseconds = 1e-9 * (int32_t)getles32(buf, 16);
+        session->newdata.time = \
+            (timestamp_t)mkgmtime(&unpacked_date) + subseconds;
+        mask |= TIME_SET | NTPTIME_IS;
+    }
+
+    session->newdata.longitude = 1e-7 * (int32_t)getles32(buf, 24);
+    session->newdata.latitude = 1e-7 * (int32_t)getles32(buf, 28);
+    session->newdata.altitude = 1e-3 * (int32_t)getles32(buf, 32);
+    session->newdata.speed = 1e-3 * (int32_t)getles32(buf, 60);
+    session->newdata.track = 1e-5 * (int32_t)getles32(buf, 64);
+    hacc = (double)(getles32(buf, 40) / 1000.0);
+    vacc = (double)(getles32(buf, 44) / 1000.0);
+    sacc = (double)(getles32(buf, 48) / 1000.0);
+    // epx ^ 2 + epy ^ 2 = hacc ^ 2
+    session->newdata.epx = session->newdata.epy = 0.707 * hacc;
+    session->newdata.epv = vacc;
+    session->newdata.eps = sacc;
+    mask |= HERR_SET | VERR_SET | SPEEDERR_SET;
     gpsd_log(&session->context->errout, LOG_DATA,
-            "NAV-PVT: flags:%02x\n", flags);
+         "NAV_PVT: flags=%02x time=%.2f lat=%.2f lon=%.2f alt=%.2f track=%.2f 
speed=%.2f climb=%.2f mode=%d status=%d used=%d\n",
+         flags,
+         session->newdata.time,
+         session->newdata.latitude,
+         session->newdata.longitude,
+         session->newdata.altitude,
+         session->newdata.track,
+         session->newdata.speed,
+         session->newdata.climb,
+         session->newdata.mode,
+         session->gpsdata.status,
+         session->gpsdata.satellites_used);
     return mask;
 }
 
@@ -166,10 +276,12 @@ ubx_msg_nav_sol(struct gps_device_t *session, unsigned 
char *buf,
 #define DATE_VALID     (UBX_SOL_VALID_WEEK | UBX_SOL_VALID_TIME)
     if ((flags & DATE_VALID) == DATE_VALID) {
        unsigned short gw;
-       unsigned int tow;
-       tow = (unsigned int)getleu32(buf, 0);
+       unsigned int iTOW;
+       int fTOW;
+       iTOW = (unsigned int)getleu32(buf, 0);
+       fTOW = (int)getles32(buf, 4);
        gw = (unsigned short)getles16(buf, 8);
-       session->newdata.time = gpsd_gpstime_resolve(session, gw, tow / 1000.0);
+       session->newdata.time = gpsd_gpstime_resolve(session, gw, (iTOW * 
+1e-3) + (fTOW * 1e-9));
        mask |= TIME_SET | NTPTIME_IS;
     }
 #undef DATE_VALID
@@ -292,24 +404,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;
+        return 0;
 
-    tow = (unsigned int)getleu32(buf, 0);
-    gw = (unsigned int)getles16(buf, 8);
     flags = (unsigned int)getub(buf, 11);
-    if ((flags & 0x7) != 0)
-       session->context->leap_seconds = (int)getub(buf, 10);
-    session->newdata.time = gpsd_gpstime_resolve(session,
-                                             (unsigned short int)gw,
-                                             (double)tow / 1000.0);
+    // Valid leap seconds
+    if ((flags & UBX_TIMEGPS_VALID_LEAP_SECOND) == 
UBX_TIMEGPS_VALID_LEAP_SECOND)
+        session->context->leap_seconds = (int)getub(buf, 10);
+    // 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) + ((double)fTOW * 1e-9));
+        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;
 }
 
 /**
@@ -486,8 +610,8 @@ gps_mask_t ubx_parse(struct gps_device_t * session, 
unsigned char *buf,
        break;
     case UBX_NAV_PVT:
        gpsd_log(&session->context->errout, LOG_PROG, "UBX_NAV_PVT\n");
-       mask = ubx_msg_nav_pvt(session, &buf[UBX_PREFIX_LEN], data_len);
-        break;
+       mask = ubx_msg_nav_pvt(session, &buf[UBX_PREFIX_LEN], data_len)
+             | (CLEAR_IS | REPORT_IS);
     case UBX_NAV_POSUTM:
        gpsd_log(&session->context->errout, LOG_DATA, "UBX_NAV_POSUTM\n");
        break;
diff --git a/driver_ubx.h b/driver_ubx.h index c23efdf7..99ef9b98 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
@@ -118,4 +122,11 @@ typedef enum {
 #define UBX_SIG_CDCRLK2 6
 #define UBX_SIG_NAVMSG 7
 
+#define UBX_NAV_PVT_VALID_DATE      0x01
+#define UBX_NAV_PVT_VALID_TIME      0x02
+#define UBX_NAV_PVT_VALID_DATE_TIME (UBX_NAV_PVT_VALID_DATE | 
+UBX_NAV_PVT_VALID_TIME)
+
+#define UBX_NAV_PVT_FLAG_GPS_FIX_OK 0x01
+#define UBX_NAV_PVT_FLAG_DGPS       0x02
+
 #endif /* _GPSD_UBX_H_ */
diff --git a/test/daemon/ublox-aek-4t.log.chk b/test/daemon/ublox-aek-4t.log.chk
index 45680ea6..31acd979 100644
--- a/test/daemon/ublox-aek-4t.log.chk
+++ b/test/daemon/ublox-aek-4t.log.chk
@@ -26,4 +26,4 @@ $GPZDA,231127.00,23,12,2007,00,00*65
 $GPGGA,231126,2037.7569,N,08704.0845,W,2,07,1.67,75.75,M,-13.865,M,,*4C
 $GPRMC,231126,A,2037.7569,N,08704.0845,W,0.0000,0.000,231207,,*36
 $GPGSA,A,3,15,2,30,5,12,18,135,,,,,,2.6,1.7,2.0*0F
-{"class":"TPV","status":2,"mode":3,"time":"2007-12-23T23:11:26.999Z","ept":0.005,"lat":20.629281718,"lon":-87.068075424,"alt":75.754,"epx":2.973,"epy":6.138,"epv":11.443,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.17,"epc":22.89}
+{"class":"TPV","status":2,"mode":3,"time":"2007-12-23T23:11:26.999Z","e
+pt":0.005,"lat":20.629281718,"lon":-87.068075424,"alt":75.754,"epx":2.9
+73,"epy":6.138,"epv":11.443,"track":0.0000,"speed":0.000,"climb":0.000,
+"eps":0.17,"epc":22.88}
diff --git a/test/daemon/ublox-neo-m8n.log b/test/daemon/ublox-neo-m8n.log new 
file mode 100644 index 
0000000000000000000000000000000000000000..28f7c1210cefc87390aced8960eaff133213e9f4
GIT binary patch
literal 5054
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
b4ww6*)f}BnE<4qGIzH#v((`SUVr%<9x0&gV

literal 0
HcmV?d00001

diff --git a/test/daemon/ublox-neo-m8n.log.chk 
b/test/daemon/ublox-neo-m8n.log.chk
new file mode 100644
index 00000000..b229a3aa
--- /dev/null
+++ b/test/daemon/ublox-neo-m8n.log.chk
@@ -0,0 +1,120 @@
+$GPZDA,085000.80,19,07,2017,00,00*68
+$GPGGA,085000,3454.3736,S,13836.4872,E,2,00,,25.42,M,,,*00
+$GPRMC,085000,A,3454.3736,S,13836.4872,E,0.0583,31.472,190717,,*08
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:00.800Z","e
+pt":0.005,"lat":-34.906226300,"lon":138.608119700,"alt":25.424,"epx":0.
+800,"epy":0.800,"epv":1.602,"track":31.4718,"speed":0.030,"eps":-0.01}
+$GPZDA,085001.00,19,07,2017,00,00*61
+$GPGGA,085000,3454.3736,S,13836.4872,E,2,00,,25.38,M,,,*0D
+$GPRMC,085000,A,3454.3736,S,13836.4872,E,0.0311,31.472,190717,,*05
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:00.000Z","e
+pt":0.005,"lat":-34.906226600,"lon":138.608119900,"alt":25.378,"epx":0.
+801,"epy":0.801,"epv":1.603,"track":31.4718,"speed":0.016,"climb":-0.23
+0,"eps":0.02,"epc":16.02}
+$GPZDA,085001.20,19,07,2017,00,00*63
+$GPGGA,085001,3454.3736,S,13836.4872,E,2,00,,25.31,M,,,*05
+$GPRMC,085001,A,3454.3736,S,13836.4872,E,0.0311,31.472,190717,,*04
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:01.200Z","e
+pt":0.005,"lat":-34.906226900,"lon":138.608119900,"alt":25.306,"epx":0.
+805,"epy":0.805,"epv":1.610,"track":31.4718,"speed":0.016,"climb":-0.36
+0,"eps":-0.01,"epc":16.06}
+$GPZDA,085001.40,19,07,2017,00,00*65
+$GPGGA,085001,3454.3736,S,13836.4872,E,2,00,,25.26,M,,,*03
+$GPRMC,085001,A,3454.3736,S,13836.4872,E,0.0583,31.472,190717,,*09
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:01.400Z","e
+pt":0.005,"lat":-34.906227100,"lon":138.608120200,"alt":25.258,"epx":0.
+807,"epy":0.807,"epv":1.616,"track":31.4718,"speed":0.030,"climb":-0.24
+0,"eps":0.02,"epc":16.13}
+$GPZDA,085001.60,19,07,2017,00,00*67
+$GPGGA,085001,3454.3736,S,13836.4872,E,2,00,,25.19,M,,,*0F
+$GPRMC,085001,A,3454.3736,S,13836.4872,E,0.0408,31.472,190717,,*0B
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:01.600Z","e
+pt":0.005,"lat":-34.906227500,"lon":138.608120300,"alt":25.194,"epx":0.
+809,"epy":0.809,"epv":1.619,"track":31.4718,"speed":0.021,"climb":-0.32
+0,"eps":-0.02,"epc":16.17}
+$GPZDA,085001.80,19,07,2017,00,00*69
+$GPGGA,085001,3454.3737,S,13836.4872,E,2,00,,25.14,M,,,*03
+$GPRMC,085001,A,3454.3737,S,13836.4872,E,0.0253,31.472,190717,,*02
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:01.800Z","e
+pt":0.005,"lat":-34.906227800,"lon":138.608120300,"alt":25.136,"epx":0.
+809,"epy":0.809,"epv":1.619,"track":31.4718,"speed":0.013,"climb":-0.29
+0,"eps":0.01,"epc":16.19}
+$GPZDA,085002.00,19,07,2017,00,00*62
+$GPGGA,085001,3454.3737,S,13836.4872,E,2,00,,25.07,M,,,*01
+$GPRMC,085001,A,3454.3737,S,13836.4872,E,0.0739,31.472,190717,,*0B
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:01.000Z","e
+pt":0.005,"lat":-34.906228100,"lon":138.608120400,"alt":25.073,"epx":0.
+810,"epy":0.810,"epv":1.620,"track":31.4718,"speed":0.038,"climb":-0.31
+5,"eps":0.03,"epc":16.19}
+$GPZDA,085002.20,19,07,2017,00,00*60
+$GPGGA,085002,3454.3737,S,13836.4872,E,2,00,,25.01,M,,,*04
+$GPRMC,085002,A,3454.3737,S,13836.4872,E,0.0058,31.472,190717,,*08
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:02.200Z","e
+pt":0.005,"lat":-34.906228400,"lon":138.608120500,"alt":25.008,"epx":0.
+808,"epy":0.808,"epv":1.617,"track":31.4718,"speed":0.003,"climb":-0.32
+5,"eps":-0.00,"epc":16.18}
+$GPZDA,085002.40,19,07,2017,00,00*66
+$GPGGA,085002,3454.3737,S,13836.4872,E,2,00,,24.95,M,,,*08
+$GPRMC,085002,A,3454.3737,S,13836.4872,E,0.0428,31.472,190717,,*0B
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:02.400Z","e
+pt":0.005,"lat":-34.906228700,"lon":138.608120500,"alt":24.952,"epx":0.
+801,"epy":0.801,"epv":1.603,"track":31.4718,"speed":0.022,"climb":-0.28
+0,"eps":0.02,"epc":16.10}
+$GPZDA,085002.60,19,07,2017,00,00*64
+$GPGGA,085002,3454.3737,S,13836.4872,E,2,00,,24.89,M,,,*05
+$GPRMC,085002,A,3454.3737,S,13836.4872,E,0.0233,31.472,190717,,*07
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:02.600Z","e
+pt":0.005,"lat":-34.906229100,"lon":138.608120700,"alt":24.892,"epx":0.
+803,"epy":0.803,"epv":1.608,"track":31.4718,"speed":0.012,"climb":-0.30
+0,"eps":-0.01,"epc":16.05}
+$GPZDA,085002.80,19,07,2017,00,00*6A
+$GPGGA,085002,3454.3738,S,13836.4872,E,2,00,,24.83,M,,,*00
+$GPRMC,085002,A,3454.3738,S,13836.4872,E,0.0564,31.472,190717,,*0D
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:02.800Z","e
+pt":0.005,"lat":-34.906229400,"lon":138.608120700,"alt":24.831,"epx":0.
+812,"epy":0.812,"epv":1.625,"track":31.4718,"speed":0.029,"climb":-0.30
+5,"eps":0.03,"epc":16.16}
+$GPZDA,085003.00,19,07,2017,00,00*63
+$GPGGA,085002,3454.3738,S,13836.4873,E,2,00,,24.76,M,,,*0B
+$GPRMC,085002,A,3454.3738,S,13836.4873,E,0.0505,31.472,190717,,*0B
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:02.000Z","e
+pt":0.005,"lat":-34.906229800,"lon":138.608120900,"alt":24.760,"epx":0.
+810,"epy":0.810,"epv":1.622,"track":31.4718,"speed":0.026,"climb":-0.35
+5,"eps":-0.02,"epc":16.23}
+$GPZDA,085003.20,19,07,2017,00,00*61
+$GPGGA,085003,3454.3738,S,13836.4873,E,2,00,,24.70,M,,,*0C
+$GPRMC,085003,A,3454.3738,S,13836.4873,E,0.0350,31.472,190717,,*0C
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:03.200Z","e
+pt":0.005,"lat":-34.906230200,"lon":138.608120900,"alt":24.695,"epx":0.
+807,"epy":0.807,"epv":1.616,"track":31.4718,"speed":0.018,"climb":-0.32
+5,"eps":0.01,"epc":16.19}
+$GPZDA,085003.40,19,07,2017,00,00*67
+$GPGGA,085003,3454.3738,S,13836.4873,E,2,00,,24.62,M,,,*0F
+$GPRMC,085003,A,3454.3738,S,13836.4873,E,0.0214,31.472,190717,,*0D
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:03.400Z","e
+pt":0.005,"lat":-34.906230500,"lon":138.608121000,"alt":24.617,"epx":0.
+805,"epy":0.805,"epv":1.609,"track":31.4718,"speed":0.011,"climb":-0.39
+0,"eps":0.01,"epc":16.12}
+$GPZDA,085003.60,19,07,2017,00,00*65
+$GPGGA,085003,3454.3739,S,13836.4873,E,2,00,,24.56,M,,,*09
+$GPRMC,085003,A,3454.3739,S,13836.4873,E,0.0253,31.472,190717,,*0F
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:03.600Z","e
+pt":0.005,"lat":-34.906230900,"lon":138.608121000,"alt":24.561,"epx":0.
+791,"epy":0.791,"epv":1.582,"track":31.4718,"speed":0.013,"climb":-0.28
+0,"eps":-0.01,"epc":15.95}
+$GPZDA,085003.80,19,07,2017,00,00*6B
+$GPGGA,085003,3454.3739,S,13836.4873,E,2,00,,24.49,M,,,*07
+$GPRMC,085003,A,3454.3739,S,13836.4873,E,0.0408,31.472,190717,,*07
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:03.800Z","e
+pt":0.005,"lat":-34.906231300,"lon":138.608120900,"alt":24.486,"epx":0.
+776,"epy":0.776,"epv":1.552,"track":31.4718,"speed":0.021,"climb":-0.37
+5,"eps":0.02,"epc":15.67}
+$GPZDA,085004.00,19,07,2017,00,00*64
+$GPGGA,085003,3454.3739,S,13836.4872,E,2,00,,24.39,M,,,*01
+$GPRMC,085003,A,3454.3739,S,13836.4872,E,0.0233,31.472,190717,,*08
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:03.000Z","e
+pt":0.005,"lat":-34.906231700,"lon":138.608120600,"alt":24.390,"epx":0.
+771,"epy":0.771,"epv":1.538,"track":31.4718,"speed":0.012,"climb":-0.48
+0,"eps":-0.00,"epc":15.45}
+$GPZDA,085004.20,19,07,2017,00,00*66
+$GPGGA,085004,3454.3739,S,13836.4872,E,2,00,,24.31,M,,,*0E
+$GPRMC,085004,A,3454.3739,S,13836.4872,E,0.0330,31.472,190717,,*0D
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:04.200Z","e
+pt":0.005,"lat":-34.906232200,"lon":138.608120300,"alt":24.309,"epx":0.
+759,"epy":0.759,"epv":1.516,"track":31.4718,"speed":0.017,"climb":-0.40
+5,"eps":-0.01,"epc":15.27}
+$GPZDA,085004.40,19,07,2017,00,00*60
+$GPGGA,085004,3454.3740,S,13836.4872,E,2,00,,24.23,M,,,*03
+$GPRMC,085004,A,3454.3740,S,13836.4872,E,0.0194,31.472,190717,,*0F
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:04.400Z","e
+pt":0.005,"lat":-34.906232600,"lon":138.608120000,"alt":24.225,"epx":0.
+745,"epy":0.745,"epv":1.487,"track":31.4718,"speed":0.010,"climb":-0.42
+0,"eps":-0.01,"epc":15.01}
+$GPZDA,085004.60,19,07,2017,00,00*62
+$GPGGA,085004,3454.3740,S,13836.4872,E,2,00,,24.15,M,,,*06
+$GPRMC,085004,A,3454.3740,S,13836.4872,E,0.0505,31.472,190717,,*03
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:04.600Z","e
+pt":0.005,"lat":-34.906233100,"lon":138.608119600,"alt":24.154,"epx":0.
+729,"epy":0.729,"epv":1.455,"track":31.4718,"speed":0.026,"climb":-0.35
+5,"eps":0.03,"epc":14.71}
+$GPZDA,085004.80,19,07,2017,00,00*6C
+$GPGGA,085004,3454.3740,S,13836.4872,E,2,00,,24.06,M,,,*04
+$GPRMC,085004,A,3454.3740,S,13836.4872,E,0.0700,31.472,190717,,*04
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:04.800Z","e
+pt":0.005,"lat":-34.906233600,"lon":138.608119300,"alt":24.063,"epx":0.
+715,"epy":0.715,"epv":1.428,"track":31.4718,"speed":0.036,"climb":-0.45
+5,"eps":-0.04,"epc":14.41}
+$GPZDA,085005.00,19,07,2017,00,00*65
+$GPGGA,085004,3454.3740,S,13836.4871,E,2,00,,23.98,M,,,*07
+$GPRMC,085004,A,3454.3740,S,13836.4871,E,0.0408,31.472,190717,,*0C
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:04.000Z","e
+pt":0.005,"lat":-34.906233900,"lon":138.608118900,"alt":23.975,"epx":0.
+705,"epy":0.705,"epv":1.405,"track":31.4718,"speed":0.021,"climb":-0.44
+0,"eps":0.02,"epc":14.16}
+$GPZDA,085005.20,19,07,2017,00,00*67
+$GPGGA,085005,3454.3741,S,13836.4871,E,2,00,,23.88,M,,,*06
+$GPRMC,085005,A,3454.3741,S,13836.4871,E,0.0156,31.472,190717,,*02
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:05.200Z","e
+pt":0.005,"lat":-34.906234400,"lon":138.608118500,"alt":23.884,"epx":0.
+697,"epy":0.697,"epv":1.388,"track":31.4718,"speed":0.008,"climb":-0.45
+5,"eps":0.01,"epc":13.96}
+$GPZDA,085005.40,19,07,2017,00,00*61
+$GPGGA,085005,3454.3741,S,13836.4871,E,2,00,,23.77,M,,,*06
+$GPRMC,085005,A,3454.3741,S,13836.4871,E,0.0330,31.472,190717,,*00
+$GPGSA,A,3,,,,,,,,,,,,,,,*1C
+{"class":"TPV","status":2,"mode":3,"time":"2017-07-19T08:50:05.400Z","e
+pt":0.005,"lat":-34.906234900,"lon":138.608118100,"alt":23.769,"epx":0.
+694,"epy":0.694,"epv":1.379,"track":31.4718,"speed":0.017,"climb":-0.57
+5,"eps":-0.01,"epc":13.83}
--
2.13.0

This communication may contain confidential or copyright information. If you 
are not an intended recipient, you must not keep, forward, copy, use, save or 
rely on this communication, and any such action is unauthorized and prohibited. 
If you have received this communication in error, please reply to this email to 
notify the sender of its incorrect delivery and then delete both the original 
message and your reply.



reply via email to

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