summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Zeimetz <bernd@bzed.de>2010-04-16 01:47:06 +0200
committerBernd Zeimetz <bernd@bzed.de>2010-04-16 01:47:06 +0200
commit4c17d82c06fdfde6f15a4dec91e1498fd7f1f6c6 (patch)
treef2b391c79082a7ab9357261da930e772d2faa407
parent8dd5eaee9e662f7baccb05c57cb3748a95fd7cd8 (diff)
parent47fece8a2dac397757b40c34fd49c5b4c124a2a0 (diff)
downloadgpsd-4c17d82c06fdfde6f15a4dec91e1498fd7f1f6c6.tar.gz
Merge branch 'master' of git.berlios.de:/gitroot/gpsd
-rw-r--r--.gitignore3
-rw-r--r--INSTALL18
-rw-r--r--Makefile.am69
-rw-r--r--NEWS9
-rw-r--r--TODO61
-rw-r--r--ais_json.c60
-rw-r--r--bits.c22
-rw-r--r--bsd-base64.c338
-rw-r--r--cgps.c405
-rw-r--r--configure.ac36
-rw-r--r--crc24q.c151
-rw-r--r--devtools/README7
-rwxr-xr-xdevtools/ais.py3
-rwxr-xr-xdevtools/aivdmtable3
-rwxr-xr-xdevtools/cycle_analyzer3
-rwxr-xr-xdevtools/fakecompare3
-rwxr-xr-xdevtools/flocktest3
-rw-r--r--devtools/flocktest.ini1
-rw-r--r--devtools/gpsdfake50
-rwxr-xr-xdevtools/leapsecond.py3
-rwxr-xr-xdevtools/logextract3
-rwxr-xr-xdevtools/regress-builder3
-rwxr-xr-xdevtools/regressdiff3
-rwxr-xr-xdevtools/striplog3
-rw-r--r--driver_aivdm.c57
-rw-r--r--driver_evermore.c417
-rw-r--r--driver_garmin.c1065
-rw-r--r--driver_garmin_txt.c379
-rw-r--r--driver_italk.c271
-rw-r--r--driver_navcom.c678
-rw-r--r--driver_nmea.c913
-rw-r--r--driver_oncore.c340
-rw-r--r--driver_proto.c42
-rw-r--r--driver_rtcm2.c366
-rw-r--r--driver_rtcm3.c1135
-rw-r--r--driver_sirf.c1102
-rw-r--r--driver_superstar2.c420
-rw-r--r--driver_tsip.c910
-rw-r--r--driver_ubx.c729
-rw-r--r--driver_zodiac.c252
-rw-r--r--drivers.c465
-rw-r--r--geoid.c110
-rw-r--r--gps.h130
-rwxr-xr-xgps/gps.py90
-rw-r--r--gps_json.h3
-rw-r--r--gpsctl.c6
-rw-r--r--gpsd.c831
-rw-r--r--gpsd.h-tail63
-rw-r--r--gpsd.php78
-rw-r--r--gpsd.xml298
-rw-r--r--gpsd_dbus.c63
-rw-r--r--gpsd_json.c895
-rw-r--r--gpsd_report.c5
-rw-r--r--gpsdclient.c77
-rw-r--r--gpsdecode.c267
-rw-r--r--gpsmon.c774
-rw-r--r--gpspipe.c136
-rw-r--r--gpsutils.c453
-rw-r--r--gpxlogger.c191
-rw-r--r--hex.c212
-rw-r--r--isgps.c91
-rw-r--r--json.c216
-rw-r--r--libgps_core.c464
-rw-r--r--libgps_json.c151
-rw-r--r--libgpsd_core.c354
-rw-r--r--libgpsmm.h1
-rw-r--r--maskaudit.py.in72
-rw-r--r--monitor_italk.c391
-rw-r--r--monitor_nmea.c182
-rw-r--r--monitor_oncore.c476
-rw-r--r--monitor_proto.c7
-rw-r--r--monitor_sirf.c487
-rw-r--r--monitor_superstar2.c125
-rw-r--r--monitor_tnt.c147
-rw-r--r--monitor_ubx.c380
-rw-r--r--net_dgpsip.c68
-rw-r--r--net_gnss_dispatch.c41
-rw-r--r--net_ntrip.c197
-rw-r--r--netlib.c84
-rw-r--r--ntpshm.c139
-rw-r--r--packet.c473
-rw-r--r--pseudonmea.c165
-rwxr-xr-xregress-driver1
-rw-r--r--rtcm2_json.c31
-rw-r--r--serial.c247
-rw-r--r--shared_json.c16
-rw-r--r--srecord.c158
-rw-r--r--strl.c79
-rw-r--r--subframe.c45
-rw-r--r--test/daemon/ac12.log.chk14
-rw-r--r--test/daemon/blumax-gps009.log.chk12
-rw-r--r--test/daemon/bt451.log.chk198
-rw-r--r--test/daemon/bu303-climbing.log.chk142
-rw-r--r--test/daemon/bu303-moving.log.chk147
-rw-r--r--test/daemon/bu303-stillfix.log.chk57
-rw-r--r--test/daemon/ch-4711.log.chk20
-rw-r--r--test/daemon/com-1289.log.chk116
-rw-r--r--test/daemon/eXplorist210.log.chk9
-rw-r--r--test/daemon/garmin-geko201.log.chk70
-rw-r--r--test/daemon/garmin17n.log.chk2
-rw-r--r--test/daemon/garmin38.log.chk18
-rw-r--r--test/daemon/garmin48.log.chk38
-rw-r--r--test/daemon/gps-360.log.chk23
-rw-r--r--test/daemon/gpslim236.log.chk18
-rw-r--r--test/daemon/haicom-305N.log.chk46
-rw-r--r--test/daemon/humminbird-M37.log.chk1
-rw-r--r--test/daemon/iTrek.log.chk16
-rw-r--r--test/daemon/italk-binary.log.chk209
-rw-r--r--test/daemon/magellan315.log.chk8
-rw-r--r--test/daemon/navcom.log.chk45
-rw-r--r--test/daemon/nl402u.log.chk62
-rw-r--r--test/daemon/nokia-ld-4w.log.chk20
-rw-r--r--test/daemon/pharos-360.log.chk22
-rw-r--r--test/daemon/superstar2.log.chk168
-rw-r--r--test/daemon/tn204.log.chk14
-rw-r--r--test/daemon/tnt-revolution.log71
-rw-r--r--test/daemon/tnt-revolution.log.chk100
-rw-r--r--test/daemon/uBlox-aek-4t.log.chk56
-rw-r--r--test/daemon/uBlox-lea-4h.log.chk48
-rw-r--r--test/daemon/uBlox-lea-4s.log.chk6
-rw-r--r--test/daemon/uBlox-lea-4t.log.chk162
-rw-r--r--test/daemon/uBlox-sirf1.log.chk81
-rw-r--r--test_bits.c116
-rw-r--r--test_geoid.c18
-rw-r--r--test_json.c47
-rw-r--r--test_mkgmtime.c47
-rw-r--r--test_packet.c45
-rw-r--r--www/client-howto.txt11
-rw-r--r--www/faq.html35
-rw-r--r--www/future.html11
-rw-r--r--www/gpsd1.gifbin194921 -> 0 bytes
-rw-r--r--www/gpsd1.pngbin5571 -> 23140 bytes
-rw-r--r--www/gpsd2.gifbin194921 -> 0 bytes
-rw-r--r--www/gpsd2.pngbin6017 -> 27895 bytes
-rw-r--r--www/hacking.html5
-rw-r--r--www/history.html2
-rw-r--r--www/index.html.in31
-rw-r--r--www/protocol-evolution.txt29
-rw-r--r--www/upstream-bugs.html2
-rw-r--r--www/writing-a-driver.xml20
-rw-r--r--www/xgps-sample.html2
-rwxr-xr-xxgps26
142 files changed, 12738 insertions, 10499 deletions
diff --git a/.gitignore b/.gitignore
index 2dda8cc2..c009be43 100644
--- a/.gitignore
+++ b/.gitignore
@@ -55,7 +55,8 @@ srec.html
*.so
*.la
*~
-maskdump.c
+gps_maskdump.c
+gpsd_maskdump.c
gpsd.h
gpsd_config.h.in
gpsd_config.h
diff --git a/INSTALL b/INSTALL
index e38322b0..af031ce3 100644
--- a/INSTALL
+++ b/INSTALL
@@ -18,7 +18,7 @@ various additional capabilities and extensions:
C++ compiler -> libgpsmm C++ wrapper for the library
pthreads library -> support for PPS timekeeping on serial GPSes
DBUS -> gpsd will issue DBUS notifications
-X windows + lesstif -> two test clients depend on this
+X windows -> two test clients depend on this
ncurses -> two more test clients depend on this
Qt + qmake -> libQgpsmm depends on this
@@ -107,7 +107,7 @@ resembling "Xm/Xm.h: No such file or directory". If you're on a Linux
system, you may already have LessTif. Source code is available
from <http://www.lesstif.org/>.
-Under Ubuntu, you will require libmotif-dev, libxp-dev and libxaw7-dev
+Under Ubuntu, you will require libxp-dev and libxaw7-dev
in addition to the standard build-support packages. You can get
all the build prerequisites intalled with "apt-get build-dep gpsd".
@@ -132,11 +132,12 @@ a serial or USB port with a GPS attached to it.
greeting line that's a JSON object describing GPSD's version.
Now plug in your GPS (or AIS receiver, or RTCM2 receiver).
-6. Type '?WATCH={"raw":1};' to start raw and watcher modes. You
-should see NMEA data (text lines beginning with $) spewing out. You
-will also see lines beginning with '{' that are JSON objects
-representing reports from your GPS; these are packet translations in
-GPSD protocol.
+6. Type '?WATCH={"enable":true,"json":true,"raw":1};' to start raw and
+watcher modes. You should see NMEA data (text lines beginning with $)
+spewing out (if you have a non-NMEA device you may see long strings of
+hex instead). You will also see lines beginning with '{' that are
+JSON objects representing reports from your GPS; these are packet
+translations in GPSD protocol.
7. Start the xgps client. Calling it with no arguments should do the right
thing. You should see a GUI panel with position/velocity-time information,
@@ -207,5 +208,6 @@ building documentation
15. There are regression tests to verify proper operation of gpsd, and
it can be useful to run these to verify that all is well. To run the
regression tests, first build gpsd from sources, and then run "make
-check". It is not necessary to install first. Python is
+check". It is not necessary to install first, but you do need
+to have "." in your $PATH to run regressions uninstalled. Python is
required for regression tests.
diff --git a/Makefile.am b/Makefile.am
index dc95dfc0..b37ff368 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -41,20 +41,21 @@ if HAVE_XAW
XAW_PROGS = xgpsspeed
endif
+# Conditional includes.
+INCLUDES = $(INCUSB)
if HAVE_DBUS
-INCLUDES = $(DBUS_CFLAGS) $(DBUS_GLIB_CFLAGS) -DDBUS_API_SUBJECT_TO_CHANGE=1
+INCLUDES += $(DBUS_CFLAGS) $(DBUS_GLIB_CFLAGS) -DDBUS_API_SUBJECT_TO_CHANGE=1
endif
RTCM104PAGES_DIST = gpsdecode.1
if HAVE_RTCM104V2
-RTCM104PROGS = gpsdecode
-RTCM104PAGES = $(RTCM104PAGES_DIST)
-else
if HAVE_RTCM104V3
+if HAVE_AIVDM
RTCM104PROGS = gpsdecode
RTCM104PAGES = $(RTCM104PAGES_DIST)
endif
endif
+endif
bin_PROGRAMS = $(MOTIF_PROGS) $(XAW_PROGS) $(RTCM104PROGS) $(CURSESPROGS) gpsctl gpspipe gpxlogger lcdgps
sbin_PROGRAMS = gpsd
@@ -102,7 +103,7 @@ gpxlogger_LDADD = $(DBUS_GLIB_LIBS) libgps.la -lm
#
gpsd_c_sources = gpsd_dbus.c gpsd.c
gpsd_SOURCES = $(gpsd_c_sources) gpsd_dbus.h
-gpsd_LDADD = $(DBUS_LIBS) $(LIBM) libgps.la -lm $(LIBPTHREAD)
+gpsd_LDADD = $(DBUS_LIBS) $(LIBM) libgps.la -lm $(LIBPTHREAD) $(LIBUSB)
#
# Build gpsctl
@@ -127,7 +128,7 @@ lcdgps_LDADD = $(LIBM) libgps.la -lm
#
gpsmon_SOURCES = gpsmon.c monitor_nmea.c monitor_sirf.c \
monitor_italk.c monitor_ubx.c monitor_superstar2.c \
- monitor_oncore.c
+ monitor_oncore.c monitor_tnt.c
gpsmon_LDADD = $(LIBM) $(NCURSES_LIBS) libgps.la -lm $(LIBPTHREAD)
#
@@ -158,7 +159,8 @@ libgpsd_c_sources = \
libgps_json.c \
gpsdclient.c \
libgpsd_core.c \
- maskdump.c \
+ gps_maskdump.c \
+ gpsd_maskdump.c \
net_dgpsip.c \
net_gnss_dispatch.c \
net_ntrip.c \
@@ -196,7 +198,7 @@ libgpsd_h_sources = \
bits.h \
crc24q.h
-BUILT_SOURCES = packet_names.h gpsd.h revision.h ais_json.i maskdump.c
+BUILT_SOURCES = packet_names.h gpsd.h revision.h ais_json.i gps_maskdump.c gpsd_maskdump.c
packet_names.h: packet_states.h
rm -f packet_names.h && \
@@ -221,10 +223,15 @@ revision.h: Makefile
echo '#define' REVISION '"'`date -u +%Y-%m-%dT%H:%M:%S`'"' >revision.h && \
chmod a-w revision.h
-maskdump.c: gpsd.h-tail maskaudit.py
- rm -f maskdump.c && \
- $(PYTHON) maskaudit.py -c >maskdump.c && \
- chmod a-w maskdump.c
+gps_maskdump.c: gps.h maskaudit.py
+ rm -f gps_maskdump.c && \
+ $(PYTHON) maskaudit.py -c >gps_maskdump.c && \
+ chmod a-w gps_maskdump.c
+
+gpsd_maskdump.c: gpsd.h-tail maskaudit.py
+ rm -f gpsd_maskdump.c && \
+ $(PYTHON) maskaudit.py -d >gpsd_maskdump.c && \
+ chmod a-w gpsd_maskdump.c
libgps_la_SOURCES = $(libgpsd_c_sources) $(libgpsd_h_sources) \
driver_rtcm2.h packet_states.h
@@ -495,7 +502,9 @@ splint: gpsd.h packet_names.h
@echo "Running splint on gpspipe..."
-splint $(SPLINTOPTS) $(gpspipe_SOURCES)
@echo "Running splint on gpsdecode..."
- -splint $(SPLINTOPTS) -exportlocal gpsdecode.c
+ -splint $(SPLINTOPTS) $(gpsdecode_SOURCES)
+ @echo "Running splint on gpxlogger..."
+ -splint $(SPLINTOPTS) $(gpxlogger_SOURCES)
@echo "Running splint on test_bits test harness..."
-splint $(SPLINTOPTS) $(test_bits_SOURCES)
@echo "Running splint on test_packet test harness..."
@@ -511,15 +520,33 @@ splint: gpsd.h packet_names.h
cppcheck: gpsd.h packet_names.h
cppcheck --template gcc --all --force .
-# Re-indenting to a uniform style would be nice, and we leave this here
-# as a rough guide to the project style, but it turns out that indent is
-# an excessively blunt instrument. As of 2.2.10 it doesn't honor -nfca
-# and produces loads of spurious changes to splint directives. Nor does
-# it seem to honor -npcs.
+# Re-indent the codebase in aa uniform style for readability.
+# FIXME: Except for xgpsspeed - Tachometer.c makes GNI indent lose it.
+INDENT_FILES = $(gpsd_c_sources) $(libgpsd_c_sources) \
+ $(cgps_SOURCES) $(gpsmon_SOURCES) $(gpspipe_SOURCES) \
+ $(gpxlogger_SOURCES) $(gpsdecode_SOURCES) \
+ $(test_bits_SOURCES) $(test_packet_SOURCES) \
+ $(test_mkgmtime_SOURCES) $(test_geoid_SOURCES) $(test_json_SOURCES)
+INDENT_OPTIONS = --indent-level4 \
+ --honour-newlines \
+ --dont-break-procedure-type \
+ --cuddle-else \
+ --braces-on-if-line \
+ --case-brace-indentation0 \
+ --brace-indent0 \
+ --no-space-after-casts \
+ --no-space-after-function-call-names \
+ --start-left-side-of-comments \
+ --dont-format-comments
indent:
- chmod u+w maskdump.c
- indent -i4 -br -cbi0 -bli0 -ncs -npcs -nfca $(gpsd_c_sources) $(libgpsd_c_sources)
- chmod u-w maskdump.c
+ chmod u+w *maskdump.c
+ indent $(INDENT_OPTIONS) $(INDENT_FILES)
+ for f in $(INDENT_FILES); \
+ do \
+ sed <$${f} >/tmp/reindent$$$$ -e 's/@ \*/@*/' ; \
+ mv /tmp/reindent$$$$ $${f} ; \
+ done
+ chmod u-w *maskdump.c
@echo "Diff lines:" `git diff | wc -l`
version:
diff --git a/NEWS b/NEWS
index 7c6c4e6f..213a8442 100644
--- a/NEWS
+++ b/NEWS
@@ -12,9 +12,12 @@
now -L to -l can be used to enable logging (to stay consistent with
the l command). There is new FAQ material on improving fix and time
reference accuracy. New sections have been added to NMEA.txt on
- error status indications and satellite IDs. New POLL command
- brings back polling-mode operation. A Client-HOWTO has been added
- to the documentation.
+ error status indications and satellite IDs. New POLL command brings
+ back polling-mode operation. A Client-HOWTO has been added to the
+ documentation. gpsd no longer eats CPU when a device is unexpectedly
+ unplugged. Support for the TNT revolution is back (run mode only).
+ There is now a gpsdfake diagnostic tool that fakes being gpsd shipping
+ arbitrary specified data to clients.
* Wed Mar 3 2010 Eric S. Raymond <esr@snark.thyrsus.com> - 2.92
Fix a packaging error. The new Python library module was
diff --git a/TODO b/TODO
index 8b29c23d..d8d33761 100644
--- a/TODO
+++ b/TODO
@@ -8,29 +8,13 @@ For contribution guidelines and internals documentation, please see
The list of bugs exposed by gpsd in other software has moved to
<http://gpsd.berlios.de/upstream-bugs.html>.
-See also the GPSD bug tracker at
-<https://developer.berlios.de/bugs/?group_id=2116>
-
** Bugs in gpsd and its clients:
-*** Support for the True North magnetic compass is currently broken
-
-Massimo Burcheri reported that it broke somewhere between rev 3654 and
-3722. We think this is a shallow bug, but we can't fix it without
-test hardware. If TNT support is a problem for you, and you can't
-fix the driver yourself and send us the patch, contact Bill Powell
-<bpowell@tntc.com> at True North Technologies and tell him he needs
-to reverse his refusal to send us an eval unit.
+*** Tracker bugs
-*** time reference instability on loss of fix
-
-[23:14] <agcme> I've discovered when the gpsd feed to ntpd goes crazy
-[23:14] <agcme> it happens when the GPS receiver loses the fix
-[23:15] <agcme> these errors start popping up: gpsd: PPS ntpshm_pps: no current GPS seconds: 1247359355
-[23:17] <agcme> It did it several times but most of the time when the fix came back everything went back to normal. However, at some point regaining a fix does not restore the ntpd shm data and it stays completely lost.
-[23:18] <agcme> Right now ntpd says the PPS offset is currently -12885008 seconds
-[23:19] <agcme> The NMEA offset is only -129.3 seconds
-[23:20] <agcme> The receiver has a fix on six satellites right now
+See the GPSD bug tracker at https://developer.berlios.de/bugs/?group_id=2116
+but don't be surprised if it's empty or very sparse. Our rate of new defects
+per month is quite low.
*** Driver issues
@@ -39,8 +23,35 @@ to reverse his refusal to send us an eval unit.
Presently this means there's no way to kick a UBX into returning
binary data.
+*** gpsmon failures
+
+There have been persistent reports of gpsmon failing with 0-length
+reads or select(2) failures, in both daemon-mediated and
+direct-to-device modes. Cause is unknown, but is related to
+zero-length reads somehow.
+
** To do:
+*** Write advanced features for TNT Revolution device
+
+The baud-rate switcher in the TNT driver needs to be tested.
+
+gpsmon could support a number of TNT configuration commands, including
+unit changes. See http://gpsd.googlecode.com/truenorth-reference.pdf
+for possibilities.
+
+Jon Schlueter has one of these on a flock machine, so testing
+shouldn't be difficult.
+
+*** Python interface rework
+
+The Python client interface is buggy and overcomplicated and needs a
+rethink. (Much of the complication is a hangover from old protocol.)
+
+** Autodetect old-protocol daemons from library and leave in support?
+
+Might be possible to do this using a read-with-timeout.
+
*** Finish gpssim
It's blocked on skyview computation.
@@ -211,16 +222,6 @@ http://www.twinsun.com/tz/tz-link.htm
Free time-zone maps of the U.S.
http://www.manifold.net/download/freemaps.html
-** Documentation
-
-*** GeoClue
-
-Figure out how gpsd should relate to GeoClue and explain this. A
-particular question is the dbus interface to gpsd and the GeoClue
-provider interface. There is quite possibly nothing to do; GeoClue
-using gpsd's published interfaces seems sensible.
-http://www.freedesktop.org/wiki/Software/GeoClue
-
Local variables:
mode: outline
paragraph-separate: "[ ]*$"
diff --git a/ais_json.c b/ais_json.c
index 9f9658b2..d143190e 100644
--- a/ais_json.c
+++ b/ais_json.c
@@ -20,21 +20,21 @@ representations to libgps structures.
#include "gps_json.h"
/*@ -mustdefine @*/
-static void lenhex_unpack(const char *from,
- size_t *plen, /*@out@*/char *to, size_t maxlen)
+static void lenhex_unpack(const char *from,
+ size_t * plen, /*@out@*/ char *to, size_t maxlen)
{
char *colon = strchr(from, ':');
- *plen = (size_t)atoi(from);
+ *plen = (size_t) atoi(from);
if (colon != NULL)
- (void)gpsd_hexpack(colon+1, to, maxlen);
+ (void)gpsd_hexpack(colon + 1, to, maxlen);
}
+
/*@ +mustdefine @*/
-int json_ais_read(const char *buf,
- char *path, size_t pathlen,
- struct ais_t *ais,
- /*@null@*/const char **endptr)
+int json_ais_read(const char *buf,
+ char *path, size_t pathlen, struct ais_t *ais,
+ /*@null@*/ const char **endptr)
{
/* collected but not actually used yet */
bool scaled;
@@ -53,21 +53,24 @@ int json_ais_read(const char *buf,
int status;
-#include "ais_json.i" /* JSON parser template structures */
+#include "ais_json.i" /* JSON parser template structures */
#undef AIS_HEADER
memset(ais, '\0', sizeof(struct ais_t));
- if (strstr(buf, "\"type\":1,")!=NULL || strstr(buf, "\"type\":2,")!=NULL || strstr(buf, "\"type\":3,")!=NULL) {
+ if (strstr(buf, "\"type\":1,") != NULL
+ || strstr(buf, "\"type\":2,") != NULL
+ || strstr(buf, "\"type\":3,") != NULL) {
status = json_read_object(buf, json_ais1, endptr);
- } else if (strstr(buf, "\"type\":4,") != NULL || strstr(buf, "\"type\":11,")!=NULL) {
+ } else if (strstr(buf, "\"type\":4,") != NULL
+ || strstr(buf, "\"type\":11,") != NULL) {
status = json_read_object(buf, json_ais4, endptr);
if (status == 0) {
- ais->type4.year = AIS_YEAR_NOT_AVAILABLE;
- ais->type4.month = AIS_MONTH_NOT_AVAILABLE;
- ais->type4.day = AIS_DAY_NOT_AVAILABLE;
- ais->type4.hour = AIS_HOUR_NOT_AVAILABLE;
+ ais->type4.year = AIS_YEAR_NOT_AVAILABLE;
+ ais->type4.month = AIS_MONTH_NOT_AVAILABLE;
+ ais->type4.day = AIS_DAY_NOT_AVAILABLE;
+ ais->type4.hour = AIS_HOUR_NOT_AVAILABLE;
ais->type4.minute = AIS_MINUTE_NOT_AVAILABLE;
ais->type4.second = AIS_SECOND_NOT_AVAILABLE;
(void)sscanf(timestamp, "%4u-%02u-%02uT%02u:%02u:%02uZ",
@@ -75,34 +78,33 @@ int json_ais_read(const char *buf,
&ais->type4.month,
&ais->type4.day,
&ais->type4.hour,
- &ais->type4.minute,
- &ais->type4.second);
+ &ais->type4.minute, &ais->type4.second);
}
} else if (strstr(buf, "\"type\":5,") != NULL) {
status = json_read_object(buf, json_ais5, endptr);
if (status == 0) {
- ais->type5.month = AIS_MONTH_NOT_AVAILABLE;
- ais->type5.day = AIS_DAY_NOT_AVAILABLE;
- ais->type5.hour = AIS_HOUR_NOT_AVAILABLE;
+ ais->type5.month = AIS_MONTH_NOT_AVAILABLE;
+ ais->type5.day = AIS_DAY_NOT_AVAILABLE;
+ ais->type5.hour = AIS_HOUR_NOT_AVAILABLE;
ais->type5.minute = AIS_MINUTE_NOT_AVAILABLE;
(void)sscanf(eta, "%02u-%02uT%02u:%02uZ",
&ais->type5.month,
&ais->type5.day,
- &ais->type5.hour,
- &ais->type5.minute);
+ &ais->type5.hour, &ais->type5.minute);
}
} else if (strstr(buf, "\"type\":6,") != NULL) {
status = json_read_object(buf, json_ais6, endptr);
if (status == 0)
- lenhex_unpack(data, &ais->type6.bitcount,
- ais->type6.bitdata, sizeof(ais->type6.bitdata));
- } else if (strstr(buf, "\"type\":7,") != NULL || strstr(buf, "\"type\":13,") != NULL) {
+ lenhex_unpack(data, &ais->type6.bitcount,
+ ais->type6.bitdata, sizeof(ais->type6.bitdata));
+ } else if (strstr(buf, "\"type\":7,") != NULL
+ || strstr(buf, "\"type\":13,") != NULL) {
status = json_read_object(buf, json_ais7, endptr);
} else if (strstr(buf, "\"type\":8,") != NULL) {
status = json_read_object(buf, json_ais8, endptr);
if (status == 0)
- lenhex_unpack(data, &ais->type8.bitcount,
- ais->type8.bitdata, sizeof(ais->type8.bitdata));
+ lenhex_unpack(data, &ais->type8.bitcount,
+ ais->type8.bitdata, sizeof(ais->type8.bitdata));
} else if (strstr(buf, "\"type\":9,") != NULL) {
status = json_read_object(buf, json_ais9, endptr);
} else if (strstr(buf, "\"type\":10,") != NULL) {
@@ -118,8 +120,8 @@ int json_ais_read(const char *buf,
} else if (strstr(buf, "\"type\":17,") != NULL) {
status = json_read_object(buf, json_ais17, endptr);
if (status == 0)
- lenhex_unpack(data, &ais->type17.bitcount,
- ais->type17.bitdata, sizeof(ais->type17.bitdata));
+ lenhex_unpack(data, &ais->type17.bitcount,
+ ais->type17.bitdata, sizeof(ais->type17.bitdata));
} else if (strstr(buf, "\"type\":18,") != NULL) {
status = json_read_object(buf, json_ais18, endptr);
} else if (strstr(buf, "\"type\":18,") != NULL) {
diff --git a/bits.c b/bits.c
index e2e2e901..4e5299a6 100644
--- a/bits.c
+++ b/bits.c
@@ -27,14 +27,15 @@ unsigned long long ubits(char buf[], unsigned int start, unsigned int width)
unsigned int i;
unsigned end;
- /*@i1@*/assert(width <= sizeof(long long) * BITS_PER_BYTE);
- for (i = start / BITS_PER_BYTE; i < (start + width + BITS_PER_BYTE - 1) / BITS_PER_BYTE; i++) {
+ /*@i1@*/ assert(width <= sizeof(long long) * BITS_PER_BYTE);
+ for (i = start / BITS_PER_BYTE;
+ i < (start + width + BITS_PER_BYTE - 1) / BITS_PER_BYTE; i++) {
fld <<= BITS_PER_BYTE;
fld |= (unsigned char)buf[i];
}
#ifdef DEBUG
(void)printf("%d:%d from %s:\n", start, width, gpsd_hexdump(buf, 32));
-#endif
+#endif
#ifdef DEBUG
(void)printf(" segment=0x%llx,", fld);
@@ -43,7 +44,7 @@ unsigned long long ubits(char buf[], unsigned int start, unsigned int width)
if (end != 0) {
fld >>= (BITS_PER_BYTE - end);
#ifdef DEBUG
- (void)printf(" after downshifting by %d bits: 0x%llx",
+ (void)printf(" after downshifting by %d bits: 0x%llx",
BITS_PER_BYTE - end, fld);
#endif /* UDEBUG */
}
@@ -55,8 +56,9 @@ unsigned long long ubits(char buf[], unsigned int start, unsigned int width)
fld &= ~(-1LL << width);
/*@ +shiftimplementation @*/
#ifdef DEBUG
- (void)printf(" after selecting out the bottom %u bits: 0x%llx = %lld\n",
- width, fld, fld);
+ (void)
+ printf(" after selecting out the bottom %u bits: 0x%llx = %lld\n",
+ width, fld, fld);
#endif /* DEBUG */
return fld;
@@ -71,18 +73,18 @@ signed long long sbits(char buf[], unsigned int start, unsigned int width)
(void)fprintf(stderr, "sbits(%d, %d) extracts %llx\n", start, width, fld);
#endif /* SDEBUG */
/*@ +relaxtypes */
- if (fld & (1 << (width-1))) {
+ if (fld & (1 << (width - 1))) {
#ifdef SDEBUG
(void)fprintf(stderr, "%llx is signed\n", fld);
#endif /* SDEBUG */
/*@ -shiftimplementation @*/
- fld |= (-1LL << (width-1));
+ fld |= (-1LL << (width - 1));
/*@ +shiftimplementation @*/
}
#ifdef SDEBUG
- (void)fprintf(stderr, "sbits(%d, %d) returns %lld\n", start, width, (signed long long)fld);
+ (void)fprintf(stderr, "sbits(%d, %d) returns %lld\n", start, width,
+ (signed long long)fld);
#endif /* SDEBUG */
return (signed long long)fld;
/*@ -relaxtypes */
}
-
diff --git a/bsd-base64.c b/bsd-base64.c
index 90fbe64f..3ff88abe 100644
--- a/bsd-base64.c
+++ b/bsd-base64.c
@@ -56,7 +56,7 @@
#define Assert(Cond) if (!(Cond)) abort()
static const char Base64[] =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
static const char Pad64 = '=';
/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
@@ -124,65 +124,67 @@ static const char Pad64 = '=';
/*@ +matchanyintegral -type @*/
int
-b64_ntop(unsigned char const *src, size_t srclength, char *target, size_t targsize)
+b64_ntop(unsigned char const *src, size_t srclength, char *target,
+ size_t targsize)
{
- size_t datalength = 0;
- unsigned char input[3];
- unsigned char output[4];
- size_t i;
-
- while (2 < srclength) {
- input[0] = *src++;
- input[1] = *src++;
- input[2] = *src++;
- srclength -= 3;
-
- output[0] = input[0] >> 2;
- output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
- output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
- output[3] = input[2] & 0x3f;
- Assert(output[0] < 64);
- Assert(output[1] < 64);
- Assert(output[2] < 64);
- Assert(output[3] < 64);
-
- if (datalength + 4 > targsize)
- return (-1);
- target[datalength++] = Base64[output[0]];
- target[datalength++] = Base64[output[1]];
- target[datalength++] = Base64[output[2]];
- target[datalength++] = Base64[output[3]];
- }
-
- /* Now we worry about padding. */
- if (0 != srclength) {
- /* Get what's left. */
- input[0] = input[1] = input[2] = '\0';
- for (i = 0; i < srclength; i++)
- input[i] = *src++;
-
- output[0] = input[0] >> 2;
- output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
- output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
- Assert(output[0] < 64);
- Assert(output[1] < 64);
- Assert(output[2] < 64);
-
- if (datalength + 4 > targsize)
- return (-1);
- target[datalength++] = Base64[output[0]];
- target[datalength++] = Base64[output[1]];
- if (srclength == 1)
- target[datalength++] = Pad64;
- else
- target[datalength++] = Base64[output[2]];
- target[datalength++] = Pad64;
- }
- if (datalength >= targsize)
- return (-1);
- target[datalength] = '\0'; /* Returned value doesn't count \0. */
- return (datalength);
+ size_t datalength = 0;
+ unsigned char input[3];
+ unsigned char output[4];
+ size_t i;
+
+ while (2 < srclength) {
+ input[0] = *src++;
+ input[1] = *src++;
+ input[2] = *src++;
+ srclength -= 3;
+
+ output[0] = input[0] >> 2;
+ output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
+ output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
+ output[3] = input[2] & 0x3f;
+ Assert(output[0] < 64);
+ Assert(output[1] < 64);
+ Assert(output[2] < 64);
+ Assert(output[3] < 64);
+
+ if (datalength + 4 > targsize)
+ return (-1);
+ target[datalength++] = Base64[output[0]];
+ target[datalength++] = Base64[output[1]];
+ target[datalength++] = Base64[output[2]];
+ target[datalength++] = Base64[output[3]];
+ }
+
+ /* Now we worry about padding. */
+ if (0 != srclength) {
+ /* Get what's left. */
+ input[0] = input[1] = input[2] = '\0';
+ for (i = 0; i < srclength; i++)
+ input[i] = *src++;
+
+ output[0] = input[0] >> 2;
+ output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
+ output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
+ Assert(output[0] < 64);
+ Assert(output[1] < 64);
+ Assert(output[2] < 64);
+
+ if (datalength + 4 > targsize)
+ return (-1);
+ target[datalength++] = Base64[output[0]];
+ target[datalength++] = Base64[output[1]];
+ if (srclength == 1)
+ target[datalength++] = Pad64;
+ else
+ target[datalength++] = Base64[output[2]];
+ target[datalength++] = Pad64;
+ }
+ if (datalength >= targsize)
+ return (-1);
+ target[datalength] = '\0'; /* Returned value doesn't count \0. */
+ return (datalength);
}
+
/*@ -matchanyintegral +type @*/
/* skips all whitespace anywhere.
@@ -192,122 +194,122 @@ b64_ntop(unsigned char const *src, size_t srclength, char *target, size_t targsi
*/
/*@ +matchanyintegral +charint @*/
-int
-b64_pton(char const *src, unsigned char *target, size_t targsize)
+int b64_pton(char const *src, unsigned char *target, size_t targsize)
{
- size_t tarindex;
- int state, ch;
- char *pos;
-
- state = 0;
- tarindex = 0;
-
- while ((ch = *src++) != '\0') {
- if (isspace(ch)) /* Skip whitespace anywhere. */
- continue;
-
- if (ch == Pad64)
- break;
-
- if ((pos = strchr(Base64, ch)) == NULL) /* A non-base64 character. */
- return (-1);
-
- switch (state) {
- case 0:
- if (target) {
- if (tarindex >= targsize)
- return (-1);
- target[tarindex] = (pos - Base64) << 2;
- }
- state = 1;
- break;
- case 1:
- if (target) {
- if (tarindex + 1 >= targsize)
- return (-1);
- target[tarindex] |= (pos - Base64) >> 4;
- target[tarindex+1] = ((pos - Base64) & 0x0f)
- << 4 ;
- }
- tarindex++;
- state = 2;
- break;
- case 2:
- if (target) {
- if (tarindex + 1 >= targsize)
- return (-1);
- target[tarindex] |= (pos - Base64) >> 2;
- target[tarindex+1] = ((pos - Base64) & 0x03)
- << 6;
- }
- tarindex++;
- state = 3;
- break;
- case 3:
- if (target) {
- if (tarindex >= targsize)
- return (-1);
- target[tarindex] |= (pos - Base64);
- }
- tarindex++;
- state = 0;
- break;
- }
+ size_t tarindex;
+ int state, ch;
+ char *pos;
+
+ state = 0;
+ tarindex = 0;
+
+ while ((ch = *src++) != '\0') {
+ if (isspace(ch)) /* Skip whitespace anywhere. */
+ continue;
+
+ if (ch == Pad64)
+ break;
+
+ if ((pos = strchr(Base64, ch)) == NULL) /* A non-base64 character. */
+ return (-1);
+
+ switch (state) {
+ case 0:
+ if (target) {
+ if (tarindex >= targsize)
+ return (-1);
+ target[tarindex] = (pos - Base64) << 2;
+ }
+ state = 1;
+ break;
+ case 1:
+ if (target) {
+ if (tarindex + 1 >= targsize)
+ return (-1);
+ target[tarindex] |= (pos - Base64) >> 4;
+ target[tarindex + 1] = ((pos - Base64) & 0x0f)
+ << 4;
+ }
+ tarindex++;
+ state = 2;
+ break;
+ case 2:
+ if (target) {
+ if (tarindex + 1 >= targsize)
+ return (-1);
+ target[tarindex] |= (pos - Base64) >> 2;
+ target[tarindex + 1] = ((pos - Base64) & 0x03)
+ << 6;
+ }
+ tarindex++;
+ state = 3;
+ break;
+ case 3:
+ if (target) {
+ if (tarindex >= targsize)
+ return (-1);
+ target[tarindex] |= (pos - Base64);
+ }
+ tarindex++;
+ state = 0;
+ break;
}
-
+ }
+
+ /*
+ * We are done decoding Base-64 chars. Let's see if we ended
+ * on a byte boundary, and/or with erroneous trailing characters.
+ */
+
+ if (ch == Pad64) { /* We got a pad char. */
+ ch = *src++; /* Skip it, get next. */
+ switch (state) {
+ case 0: /* Invalid = in first position */
+ case 1: /* Invalid = in second position */
+ return (-1);
+
+ case 2: /* Valid, means one byte of info */
+ /* Skip any number of spaces. */
+ for (; ch != '\0'; ch = *src++)
+ if (!isspace(ch))
+ break;
+ /* Make sure there is another trailing = sign. */
+ if (ch != Pad64)
+ return (-1);
+ ch = *src++; /* Skip the = */
+ /* Fall through to "single trailing =" case. */
+ /* FALLTHROUGH */
+ /*@ -casebreak @*/
+ case 3: /* Valid, means two bytes of info */
+ /*
+ * We know this char is an =. Is there anything but
+ * whitespace after it?
+ */
+ for (; ch != '\0'; ch = *src++)
+ if (!isspace(ch))
+ return (-1);
+
+ /*
+ * Now make sure for cases 2 and 3 that the "extra"
+ * bits that slopped past the last full byte were
+ * zeros. If we don't check them, they become a
+ * subliminal channel.
+ */
+ if (target != 0 && target[tarindex] != 0)
+ return (-1);
+ }
+ } else {
/*
- * We are done decoding Base-64 chars. Let's see if we ended
- * on a byte boundary, and/or with erroneous trailing characters.
+ * We ended by seeing the end of the string. Make sure we
+ * have no partial bytes lying around.
*/
+ if (state != 0)
+ return (-1);
+ }
- if (ch == Pad64) { /* We got a pad char. */
- ch = *src++; /* Skip it, get next. */
- switch (state) {
- case 0: /* Invalid = in first position */
- case 1: /* Invalid = in second position */
- return (-1);
-
- case 2: /* Valid, means one byte of info */
- /* Skip any number of spaces. */
- for (; ch != '\0'; ch = *src++)
- if (!isspace(ch))
- break;
- /* Make sure there is another trailing = sign. */
- if (ch != Pad64)
- return (-1);
- ch = *src++; /* Skip the = */
- /* Fall through to "single trailing =" case. */
- /* FALLTHROUGH */
- /*@ -casebreak @*/
- case 3: /* Valid, means two bytes of info */
- /*
- * We know this char is an =. Is there anything but
- * whitespace after it?
- */
- for (; ch != '\0'; ch = *src++)
- if (!isspace(ch))
- return (-1);
-
- /*
- * Now make sure for cases 2 and 3 that the "extra"
- * bits that slopped past the last full byte were
- * zeros. If we don't check them, they become a
- * subliminal channel.
- */
- if (target!=0 && target[tarindex] != 0)
- return (-1);
- }
- } else {
- /*
- * We ended by seeing the end of the string. Make sure we
- * have no partial bytes lying around.
- */
- if (state != 0)
- return (-1);
- }
-
- return (tarindex);
+ return (tarindex);
}
+
/*@ +matchanyintegral -charint @*/
#endif /* !defined(HAVE_B64_NTOP) && !defined(HAVE___B64_NTOP) */
diff --git a/cgps.c b/cgps.c
index 207288d6..302694bd 100644
--- a/cgps.c
+++ b/cgps.c
@@ -112,8 +112,8 @@
#define EMIX(x, y) (((x) > (y)) ? (x) : (y))
static struct gps_data_t *gpsdata;
-static time_t status_timer; /* Time of last state change. */
-static int state = 0; /* or MODE_NO_FIX=1, MODE_2D=2, MODE_3D=3 */
+static time_t status_timer; /* Time of last state change. */
+static int state = 0; /* or MODE_NO_FIX=1, MODE_2D=2, MODE_3D=3 */
static float altfactor = METERS_TO_FEET;
static float speedfactor = MPS_TO_MPH;
static char *altunits = "ft";
@@ -125,13 +125,13 @@ static int debug;
static WINDOW *datawin, *satellites, *messages;
-static bool raw_flag=false;
-static bool silent_flag=false;
-static bool magnetic_flag=false;
+static bool raw_flag = false;
+static bool silent_flag = false;
+static bool magnetic_flag = false;
static int window_length;
static int display_sats;
#ifdef TRUENORTH
-static bool compass_flag=false;
+static bool compass_flag = false;
#endif /* TRUENORTH */
/* pseudo-signals indicating reason for termination */
@@ -160,40 +160,50 @@ static float true2magnetic(double lat, double lon, double heading)
{
/* Western Europe */
/*@ -evalorder +relaxtypes @*/
- if((lat > 36.0) && (lat < 68.0) &&
- (lon > -10.0) && (lon < 28.0)) {
- heading = ( 10.4768771667158 - (0.507385322418858 * lon) + (0.00753170031703826 * pow(lon, 2))
- - (1.40596203924748e-05 * pow(lon, 3)) - (0.535560699962353 * lat)
- + (0.0154348808069955 * lat * lon) - (8.07756425110592e-05 * lat * pow(lon, 2))
- + (0.00976887198864442 * pow(lat, 2)) - (0.000259163929798334 * lon * pow(lat, 2))
- - (3.69056939266123e-05 * pow(lat, 3)) + heading);
+ if ((lat > 36.0) && (lat < 68.0) && (lon > -10.0) && (lon < 28.0)) {
+ heading =
+ (10.4768771667158 - (0.507385322418858 * lon) +
+ (0.00753170031703826 * pow(lon, 2))
+ - (1.40596203924748e-05 * pow(lon, 3)) -
+ (0.535560699962353 * lat)
+ + (0.0154348808069955 * lat * lon) -
+ (8.07756425110592e-05 * lat * pow(lon, 2))
+ + (0.00976887198864442 * pow(lat, 2)) -
+ (0.000259163929798334 * lon * pow(lat, 2))
+ - (3.69056939266123e-05 * pow(lat, 3)) + heading);
}
/* USA */
- else if((lat > 24.0) && (lat < 50.0) &&
- (lon > 66.0) && (lon < 125.0)) {
- lon=0.0-lon;
- heading = ( (-65.6811) + (0.99 * lat) + (0.0128899 * pow(lat, 2)) - (0.0000905928 * pow(lat, 3)) + (2.87622 * lon)
- - (0.0116268 * lat * lon) - (0.00000603925 * lon * pow(lat, 2)) - (0.0389806 * pow(lon, 2))
- - (0.0000403488 * lat * pow(lon, 2)) + (0.000168556 * pow(lon, 3)) + heading);
+ else if ((lat > 24.0) && (lat < 50.0) && (lon > 66.0) && (lon < 125.0)) {
+ lon = 0.0 - lon;
+ heading =
+ ((-65.6811) + (0.99 * lat) + (0.0128899 * pow(lat, 2)) -
+ (0.0000905928 * pow(lat, 3)) + (2.87622 * lon)
+ - (0.0116268 * lat * lon) - (0.00000603925 * lon * pow(lat, 2)) -
+ (0.0389806 * pow(lon, 2))
+ - (0.0000403488 * lat * pow(lon, 2)) +
+ (0.000168556 * pow(lon, 3)) + heading);
}
/* AK */
- else if((lat > 54.0) &&
- (lon > 130.0) && (lon < 172.0)) {
- lon=0.0-lon;
- heading = ( 618.854 + (2.76049 * lat) - (0.556206 * pow(lat, 2)) + (0.00251582 * pow(lat, 3)) - (12.7974 * lon)
- + (0.408161 * lat * lon) + (0.000434097 * lon * pow(lat, 2)) - (0.00602173 * pow(lon, 2))
- - (0.00144712 * lat * pow(lon, 2)) + (0.000222521 * pow(lon, 3)) + heading);
+ else if ((lat > 54.0) && (lon > 130.0) && (lon < 172.0)) {
+ lon = 0.0 - lon;
+ heading =
+ (618.854 + (2.76049 * lat) - (0.556206 * pow(lat, 2)) +
+ (0.00251582 * pow(lat, 3)) - (12.7974 * lon)
+ + (0.408161 * lat * lon) + (0.000434097 * lon * pow(lat, 2)) -
+ (0.00602173 * pow(lon, 2))
+ - (0.00144712 * lat * pow(lon, 2)) +
+ (0.000222521 * pow(lon, 3)) + heading);
} else {
/* We don't know how to compute magnetic heading for this
- location. */
- magnetic_flag=false;
+ * location. */
+ magnetic_flag = false;
}
/* No negative headings. */
if (heading < 0.0)
heading += 360.0;
- return(heading);
+ return (heading);
/*@ +evalorder -relaxtypes @*/
}
@@ -201,11 +211,11 @@ static float true2magnetic(double lat, double lon, double heading)
static void die(int sig)
{
/* Ignore signals. */
- (void)signal(SIGINT,SIG_IGN);
- (void)signal(SIGHUP,SIG_IGN);
+ (void)signal(SIGINT, SIG_IGN);
+ (void)signal(SIGHUP, SIG_IGN);
/* Move the cursor to the bottom left corner. */
- (void)mvcur(0,COLS-1,LINES-1,0);
+ (void)mvcur(0, COLS - 1, LINES - 1, 0);
/* Put input attributes back the way they were. */
(void)echo();
@@ -237,41 +247,43 @@ static void die(int sig)
static enum deg_str_type deg_type = deg_dd;
/*@ -globstate @*/
-static void windowsetup(void)
+static void windowsetup(void)
{
/* Set the window sizes per the following criteria:
-
- 1. Set the window size to display the maximum number of
- satellites possible, but not more than the size required to
- display the maximum number of satellites gpsd is capable of
- tracking (MAXCHANNELS - 2).
-
- 2. If the screen size will not allow for the full complement of
- satellites to be displayed, set the windows sizes smaller, but
- not smaller than the number of lines necessary to display all of
- the fields in the 'datawin'. The list of displayed satellites
- will be truncated to fit the available window size. (TODO: If
- the satellite list is truncated, omit the satellites not used to
- obtain the current fix.)
-
- 3. If the screen is large enough to display all possible
- satellites (MAXCHANNELS - 2) with space still left at the bottom,
- add a window at the bottom in which to scroll raw gpsd data.
- */
+ *
+ * 1. Set the window size to display the maximum number of
+ * satellites possible, but not more than the size required to
+ * display the maximum number of satellites gpsd is capable of
+ * tracking (MAXCHANNELS - 2).
+ *
+ * 2. If the screen size will not allow for the full complement of
+ * satellites to be displayed, set the windows sizes smaller, but
+ * not smaller than the number of lines necessary to display all of
+ * the fields in the 'datawin'. The list of displayed satellites
+ * will be truncated to fit the available window size. (TODO: If
+ * the satellite list is truncated, omit the satellites not used to
+ * obtain the current fix.)
+ *
+ * 3. If the screen is large enough to display all possible
+ * satellites (MAXCHANNELS - 2) with space still left at the bottom,
+ * add a window at the bottom in which to scroll raw gpsd data.
+ */
int xsize, ysize;
- getmaxyx(stdscr,ysize,xsize);
+ getmaxyx(stdscr, ysize, xsize);
#ifdef TRUENORTH
- if(compass_flag) {
- if(ysize == MIN_COMPASS_DATAWIN_SIZE) {
+ if (compass_flag) {
+ if (ysize == MIN_COMPASS_DATAWIN_SIZE) {
raw_flag = false;
window_length = MIN_COMPASS_DATAWIN_SIZE;
- } else if(ysize > MIN_COMPASS_DATAWIN_SIZE) {
+ } else if (ysize > MIN_COMPASS_DATAWIN_SIZE) {
raw_flag = true;
window_length = MIN_COMPASS_DATAWIN_SIZE;
} else {
- (void)mvprintw(0, 0, "Your screen must be at least 80x%d to run cgps.",MIN_COMPASS_DATAWIN_SIZE);
+ (void)mvprintw(0, 0,
+ "Your screen must be at least 80x%d to run cgps.",
+ MIN_COMPASS_DATAWIN_SIZE);
/*@ -nullpass @*/
(void)refresh();
/*@ +nullpass @*/
@@ -281,28 +293,30 @@ static void windowsetup(void)
} else
#endif /* TRUENORTH */
{
- if(ysize == MAX_SATWIN_SIZE) {
+ if (ysize == MAX_SATWIN_SIZE) {
raw_flag = false;
window_length = MAX_SATWIN_SIZE;
display_sats = MAX_POSSIBLE_SATS;
- } else if(ysize == MAX_SATWIN_SIZE + 1) {
+ } else if (ysize == MAX_SATWIN_SIZE + 1) {
raw_flag = true;
window_length = MAX_SATWIN_SIZE;
display_sats = MAX_POSSIBLE_SATS;
- } else if(ysize > MAX_SATWIN_SIZE + 2) {
+ } else if (ysize > MAX_SATWIN_SIZE + 2) {
raw_flag = true;
window_length = MAX_SATWIN_SIZE;
display_sats = MAX_POSSIBLE_SATS;
- } else if(ysize > MIN_GPS_DATAWIN_SIZE) {
+ } else if (ysize > MIN_GPS_DATAWIN_SIZE) {
raw_flag = false;
window_length = ysize - (int)raw_flag;
display_sats = window_length - SATWIN_OVERHEAD - (int)raw_flag;
- } else if(ysize == MIN_GPS_DATAWIN_SIZE) {
+ } else if (ysize == MIN_GPS_DATAWIN_SIZE) {
raw_flag = false;
window_length = MIN_GPS_DATAWIN_SIZE;
display_sats = window_length - SATWIN_OVERHEAD - 1;
} else {
- (void)mvprintw(0, 0, "Your screen must be at least 80x%d to run cgps.",MIN_GPS_DATAWIN_SIZE);
+ (void)mvprintw(0, 0,
+ "Your screen must be at least 80x%d to run cgps.",
+ MIN_GPS_DATAWIN_SIZE);
/*@ -nullpass @*/
(void)refresh();
/*@ +nullpass @*/
@@ -313,14 +327,14 @@ static void windowsetup(void)
#ifdef TRUENORTH
/* Set up the screen for either a compass or a gps receiver. */
- if(compass_flag) {
+ if (compass_flag) {
/* We're a compass, set up accordingly. */
/*@ -onlytrans @*/
- datawin = newwin(window_length, DATAWIN_WIDTH, 0, 0);
- (void)nodelay(datawin,(bool)TRUE);
- if(raw_flag) {
- messages = newwin(0, 0, window_length, 0);
+ datawin = newwin(window_length, DATAWIN_WIDTH, 0, 0);
+ (void)nodelay(datawin, (bool) TRUE);
+ if (raw_flag) {
+ messages = newwin(0, 0, window_length, 0);
/*@ +onlytrans @*/
(void)scrollok(messages, true);
@@ -341,16 +355,18 @@ static void windowsetup(void)
(void)wborder(datawin, 0, 0, 0, 0, 0, 0, 0, 0);
} else
-#endif /* TRUENORTH */
+#endif /* TRUENORTH */
{
/* We're a GPS, set up accordingly. */
/*@ -onlytrans @*/
- datawin = newwin(window_length, DATAWIN_WIDTH, 0, 0);
- satellites = newwin(window_length, SATELLITES_WIDTH, 0, DATAWIN_WIDTH);
- (void)nodelay(datawin,(bool)TRUE);
- if(raw_flag) {
- messages = newwin(ysize - (window_length), xsize, window_length, 0);
+ datawin = newwin(window_length, DATAWIN_WIDTH, 0, 0);
+ satellites =
+ newwin(window_length, SATELLITES_WIDTH, 0, DATAWIN_WIDTH);
+ (void)nodelay(datawin, (bool) TRUE);
+ if (raw_flag) {
+ messages =
+ newwin(ysize - (window_length), xsize, window_length, 0);
/*@ +onlytrans @*/
(void)scrollok(messages, true);
@@ -373,64 +389,66 @@ static void windowsetup(void)
(void)mvwprintw(datawin, 9, DATAWIN_DESC_OFFSET, "GPS Type:");
/* Note that the following four fields are exceptions to the
- sizing rule. The minimum window size does not include these
- fields, if the window is too small, they get excluded. This
- may or may not change if/when the output for these fields is
- fixed and/or people request their permanance. They're only
- there in the first place because I arbitrarily thought they
- sounded interesting. ;^) */
-
- if(window_length >= (MIN_GPS_DATAWIN_SIZE + 4)) {
- (void)mvwprintw(datawin, 10, DATAWIN_DESC_OFFSET, "Horizontal Err:");
- (void)mvwprintw(datawin, 11, DATAWIN_DESC_OFFSET, "Vertical Err:");
+ * sizing rule. The minimum window size does not include these
+ * fields, if the window is too small, they get excluded. This
+ * may or may not change if/when the output for these fields is
+ * fixed and/or people request their permanance. They're only
+ * there in the first place because I arbitrarily thought they
+ * sounded interesting. ;^) */
+
+ if (window_length >= (MIN_GPS_DATAWIN_SIZE + 4)) {
+ (void)mvwprintw(datawin, 10, DATAWIN_DESC_OFFSET,
+ "Horizontal Err:");
+ (void)mvwprintw(datawin, 11, DATAWIN_DESC_OFFSET,
+ "Vertical Err:");
(void)mvwprintw(datawin, 12, DATAWIN_DESC_OFFSET, "Course Err:");
(void)mvwprintw(datawin, 13, DATAWIN_DESC_OFFSET, "Speed Err:");
}
(void)wborder(datawin, 0, 0, 0, 0, 0, 0, 0, 0);
- (void)mvwprintw(satellites, 1,1, "PRN: Elev: Azim: SNR: Used:");
+ (void)mvwprintw(satellites, 1, 1, "PRN: Elev: Azim: SNR: Used:");
(void)wborder(satellites, 0, 0, 0, 0, 0, 0, 0, 0);
}
}
+
/*@ +globstate @*/
#ifdef TRUENORTH
/* This gets called once for each new compass sentence. */
static void update_compass_panel(struct gps_data_t *gpsdata,
- char *message,
- size_t len UNUSED)
+ char *message, size_t len UNUSED)
{
char scr[128];
/* Print time/date. */
- if (isnan(gpsdata->fix.time)==0) {
+ if (isnan(gpsdata->fix.time) == 0) {
(void)unix_to_iso8601(gpsdata->fix.time, scr, sizeof(scr));
} else
(void)snprintf(scr, sizeof(scr), "n/a");
(void)mvwprintw(datawin, 1, DATAWIN_VALUE_OFFSET, "%-*s", 27, scr);
/* Fill in the heading. */
- if (isnan(gpsdata->fix.track)==0) {
+ if (isnan(gpsdata->fix.track) == 0) {
(void)snprintf(scr, sizeof(scr), "%.1f degrees", gpsdata->fix.track);
} else
(void)snprintf(scr, sizeof(scr), "n/a");
(void)mvwprintw(datawin, 2, DATAWIN_VALUE_OFFSET, "%-*s", 27, scr);
/* Fill in the pitch. */
- if (isnan(gpsdata->fix.climb)==0) {
+ if (isnan(gpsdata->fix.climb) == 0) {
(void)snprintf(scr, sizeof(scr), "%.1f", gpsdata->fix.climb);
} else
(void)snprintf(scr, sizeof(scr), "n/a");
(void)mvwprintw(datawin, 3, DATAWIN_VALUE_OFFSET, "%-*s", 27, scr);
/* Fill in the roll. */
- if (isnan(gpsdata->fix.speed)==0)
- (void)snprintf(scr, sizeof(scr), "%.1f",gpsdata->fix.speed);
+ if (isnan(gpsdata->fix.speed) == 0)
+ (void)snprintf(scr, sizeof(scr), "%.1f", gpsdata->fix.speed);
else
(void)snprintf(scr, sizeof(scr), "n/a");
(void)mvwprintw(datawin, 4, DATAWIN_VALUE_OFFSET, "%-*s", 27, scr);
/* Fill in the speed. */
- if (isnan(gpsdata->fix.altitude)==0)
+ if (isnan(gpsdata->fix.altitude) == 0)
(void)snprintf(scr, sizeof(scr), "%.1f", gpsdata->fix.altitude);
else
(void)snprintf(scr, sizeof(scr), "n/a");
@@ -440,12 +458,12 @@ static void update_compass_panel(struct gps_data_t *gpsdata,
(void)mvwprintw(datawin, 6, DATAWIN_VALUE_OFFSET, "%-*s", 27, scr);
/* Be quiet if the user requests silence. */
- if(!silent_flag && raw_flag) {
+ if (!silent_flag && raw_flag) {
(void)waddstr(messages, message);
}
(void)wrefresh(datawin);
- if(raw_flag) {
+ if (raw_flag) {
(void)wrefresh(messages);
}
}
@@ -453,31 +471,31 @@ static void update_compass_panel(struct gps_data_t *gpsdata,
/* This gets called once for each new GPS sentence. */
static void update_gps_panel(struct gps_data_t *gpsdata,
- char *message,
- size_t len UNUSED)
+ char *message, size_t len UNUSED)
{
- int i,j, n;
+ int i, j, n;
int newstate;
char scr[128];
bool usedflags[MAXCHANNELS];
/* this is where we implement source-device filtering */
- if (gpsdata->dev.path[0]!='\0' && source.device!=NULL && strcmp(source.device, gpsdata->dev.path) != 0)
+ if (gpsdata->dev.path[0] != '\0' && source.device != NULL
+ && strcmp(source.device, gpsdata->dev.path) != 0)
return;
/* must build bit vector of which statellites are used from list */
for (i = 0; i < MAXCHANNELS; i++) {
- usedflags [i] = false;
+ usedflags[i] = false;
for (j = 0; j < gpsdata->satellites_used; j++)
if (gpsdata->used[j] == gpsdata->PRN[i])
usedflags[i] = true;
}
/* This is for the satellite status display. Originally lifted from
- xgps.c. Note that the satellite list may be truncated based on
- available screen size, or may only show satellites used for the
- fix. */
- if (gpsdata->satellites_visible!=0) {
+ * xgps.c. Note that the satellite list may be truncated based on
+ * available screen size, or may only show satellites used for the
+ * fix. */
+ if (gpsdata->satellites_visible != 0) {
if (display_sats >= MAX_POSSIBLE_SATS) {
for (i = 0; i < MAX_POSSIBLE_SATS; i++) {
if (i < gpsdata->satellites_visible) {
@@ -485,31 +503,38 @@ static void update_gps_panel(struct gps_data_t *gpsdata,
" %3d %02d %03d %02d %c",
gpsdata->PRN[i],
gpsdata->elevation[i], gpsdata->azimuth[i],
- (int)gpsdata->ss[i], usedflags[i] ? 'Y' : 'N');
+ (int)gpsdata->ss[i],
+ usedflags[i] ? 'Y' : 'N');
} else {
(void)strlcpy(scr, "", sizeof(scr));
}
- (void)mvwprintw(satellites, i+2, 1, "%-*s", SATELLITES_WIDTH - 3, scr);
+ (void)mvwprintw(satellites, i + 2, 1, "%-*s",
+ SATELLITES_WIDTH - 3, scr);
}
} else {
- n=0;
+ n = 0;
for (i = 0; i < MAX_POSSIBLE_SATS; i++) {
if (n < display_sats) {
- if ((i < gpsdata->satellites_visible) && ((gpsdata->used[i]!=0) || (gpsdata->satellites_visible <= display_sats))) {
+ if ((i < gpsdata->satellites_visible)
+ && ((gpsdata->used[i] != 0)
+ || (gpsdata->satellites_visible <= display_sats))) {
(void)snprintf(scr, sizeof(scr),
" %3d %02d %03d %02d %c",
- gpsdata->PRN[i],
- gpsdata->elevation[i], gpsdata->azimuth[i],
- (int)gpsdata->ss[i],gpsdata->used[i] ? 'Y' : 'N');
- (void)mvwprintw(satellites, n+2, 1, "%-*s", SATELLITES_WIDTH - 3, scr);
+ gpsdata->PRN[i], gpsdata->elevation[i],
+ gpsdata->azimuth[i],
+ (int)gpsdata->ss[i],
+ gpsdata->used[i] ? 'Y' : 'N');
+ (void)mvwprintw(satellites, n + 2, 1, "%-*s",
+ SATELLITES_WIDTH - 3, scr);
n++;
}
}
}
- if(n < display_sats) {
+ if (n < display_sats) {
for (i = n; i <= display_sats; i++) {
- (void)mvwprintw(satellites, i+2, 1, "%-*s", SATELLITES_WIDTH - 3, "");
+ (void)mvwprintw(satellites, i + 2, 1, "%-*s",
+ SATELLITES_WIDTH - 3, "");
}
}
@@ -517,7 +542,7 @@ static void update_gps_panel(struct gps_data_t *gpsdata,
}
/* Print time/date. */
- if (isnan(gpsdata->fix.time)==0) {
+ if (isnan(gpsdata->fix.time) == 0) {
(void)unix_to_iso8601(gpsdata->fix.time, scr, sizeof(scr));
} else
(void)snprintf(scr, sizeof(scr), "n/a");
@@ -525,50 +550,55 @@ static void update_gps_panel(struct gps_data_t *gpsdata,
/* Fill in the latitude. */
- if (gpsdata->fix.mode >= MODE_2D && isnan(gpsdata->fix.latitude)==0) {
+ if (gpsdata->fix.mode >= MODE_2D && isnan(gpsdata->fix.latitude) == 0) {
(void)snprintf(scr, sizeof(scr), "%s %c",
- deg_to_str(deg_type, fabs(gpsdata->fix.latitude)),
+ deg_to_str(deg_type, fabs(gpsdata->fix.latitude)),
(gpsdata->fix.latitude < 0) ? 'S' : 'N');
} else
(void)snprintf(scr, sizeof(scr), "n/a");
(void)mvwprintw(datawin, 2, DATAWIN_VALUE_OFFSET, "%-*s", 27, scr);
/* Fill in the longitude. */
- if (gpsdata->fix.mode >= MODE_2D && isnan(gpsdata->fix.longitude)==0) {
+ if (gpsdata->fix.mode >= MODE_2D && isnan(gpsdata->fix.longitude) == 0) {
(void)snprintf(scr, sizeof(scr), "%s %c",
- deg_to_str(deg_type, fabs(gpsdata->fix.longitude)),
+ deg_to_str(deg_type, fabs(gpsdata->fix.longitude)),
(gpsdata->fix.longitude < 0) ? 'W' : 'E');
} else
(void)snprintf(scr, sizeof(scr), "n/a");
(void)mvwprintw(datawin, 3, DATAWIN_VALUE_OFFSET, "%-*s", 27, scr);
/* Fill in the altitude. */
- if (gpsdata->fix.mode == MODE_3D && isnan(gpsdata->fix.altitude)==0)
- (void)snprintf(scr, sizeof(scr), "%.1f %s",gpsdata->fix.altitude*altfactor, altunits);
+ if (gpsdata->fix.mode == MODE_3D && isnan(gpsdata->fix.altitude) == 0)
+ (void)snprintf(scr, sizeof(scr), "%.1f %s",
+ gpsdata->fix.altitude * altfactor, altunits);
else
(void)snprintf(scr, sizeof(scr), "n/a");
(void)mvwprintw(datawin, 4, DATAWIN_VALUE_OFFSET, "%-*s", 27, scr);
/* Fill in the speed. */
- if (gpsdata->fix.mode >= MODE_2D && isnan(gpsdata->fix.track)==0)
- (void)snprintf(scr, sizeof(scr), "%.1f %s", gpsdata->fix.speed*speedfactor, speedunits);
+ if (gpsdata->fix.mode >= MODE_2D && isnan(gpsdata->fix.track) == 0)
+ (void)snprintf(scr, sizeof(scr), "%.1f %s",
+ gpsdata->fix.speed * speedfactor, speedunits);
else
(void)snprintf(scr, sizeof(scr), "n/a");
(void)mvwprintw(datawin, 5, DATAWIN_VALUE_OFFSET, "%-*s", 27, scr);
/* Fill in the heading. */
- if (gpsdata->fix.mode >= MODE_2D && isnan(gpsdata->fix.track)==0)
- if(!magnetic_flag) {
- (void)snprintf(scr, sizeof(scr), "%.1f deg (true)", gpsdata->fix.track);
+ if (gpsdata->fix.mode >= MODE_2D && isnan(gpsdata->fix.track) == 0)
+ if (!magnetic_flag) {
+ (void)snprintf(scr, sizeof(scr), "%.1f deg (true)",
+ gpsdata->fix.track);
} else {
- (void)snprintf(scr, sizeof(scr), "%.1f deg (mag) ", true2magnetic(gpsdata->fix.latitude, gpsdata->fix.longitude, gpsdata->fix.track));
- }
- else
+ (void)snprintf(scr, sizeof(scr), "%.1f deg (mag) ",
+ true2magnetic(gpsdata->fix.latitude,
+ gpsdata->fix.longitude,
+ gpsdata->fix.track));
+ } else
(void)snprintf(scr, sizeof(scr), "n/a");
(void)mvwprintw(datawin, 6, DATAWIN_VALUE_OFFSET, "%-*s", 27, scr);
/* Fill in the rate of climb. */
- if (gpsdata->fix.mode == MODE_3D && isnan(gpsdata->fix.climb)==0)
+ if (gpsdata->fix.mode == MODE_3D && isnan(gpsdata->fix.climb) == 0)
(void)snprintf(scr, sizeof(scr), "%.1f %s/min",
gpsdata->fix.climb * altfactor * 60, altunits);
else
@@ -576,7 +606,7 @@ static void update_gps_panel(struct gps_data_t *gpsdata,
(void)mvwprintw(datawin, 7, DATAWIN_VALUE_OFFSET, "%-*s", 27, scr);
/* Fill in the GPS status and the time since the last state
- change. */
+ * change. */
if (gpsdata->online == 0) {
newstate = 0;
(void)snprintf(scr, sizeof(scr), "OFFLINE");
@@ -584,13 +614,20 @@ static void update_gps_panel(struct gps_data_t *gpsdata,
newstate = gpsdata->fix.mode;
switch (gpsdata->fix.mode) {
case MODE_2D:
- (void)snprintf(scr, sizeof(scr), "2D %sFIX (%d secs)",(gpsdata->status==STATUS_DGPS_FIX)?"DIFF ":"", (int) (time(NULL) - status_timer));
+ (void)snprintf(scr, sizeof(scr), "2D %sFIX (%d secs)",
+ (gpsdata->status ==
+ STATUS_DGPS_FIX) ? "DIFF " : "",
+ (int)(time(NULL) - status_timer));
break;
case MODE_3D:
- (void)snprintf(scr, sizeof(scr), "3D %sFIX (%d secs)",(gpsdata->status==STATUS_DGPS_FIX)?"DIFF ":"", (int) (time(NULL) - status_timer));
+ (void)snprintf(scr, sizeof(scr), "3D %sFIX (%d secs)",
+ (gpsdata->status ==
+ STATUS_DGPS_FIX) ? "DIFF " : "",
+ (int)(time(NULL) - status_timer));
break;
default:
- (void)snprintf(scr, sizeof(scr), "NO FIX (%d secs)", (int) (time(NULL) - status_timer));
+ (void)snprintf(scr, sizeof(scr), "NO FIX (%d secs)",
+ (int)(time(NULL) - status_timer));
break;
}
}
@@ -605,55 +642,65 @@ static void update_gps_panel(struct gps_data_t *gpsdata,
if (gpsdata->set & DEVICE_SET) {
(void)snprintf(scr, sizeof(scr), "%s", gpsdata->dev.driver);
} else if (gpsdata->devices.ndevices == 1) {
- (void)snprintf(scr, sizeof(scr), "%s", gpsdata->devices.list[0].driver);
+ (void)snprintf(scr, sizeof(scr), "%s",
+ gpsdata->devices.list[0].driver);
} else {
- (void)snprintf(scr, sizeof(scr), "%d devices",
+ (void)snprintf(scr, sizeof(scr), "%d devices",
gpsdata->devices.ndevices);
- }
+ }
(void)mvwprintw(datawin, 9, DATAWIN_VALUE_OFFSET, "%-*s", 27, scr);
}
/* Note that the following four fields are exceptions to the
- sizing rule. The minimum window size does not include these
- fields, if the window is too small, they get excluded. This
- may or may not change if/when the output for these fields is
- fixed and/or people request their permanance. They're only
- there in the first place because I arbitrarily thought they
- sounded interesting. ;^) */
+ * sizing rule. The minimum window size does not include these
+ * fields, if the window is too small, they get excluded. This
+ * may or may not change if/when the output for these fields is
+ * fixed and/or people request their permanance. They're only
+ * there in the first place because I arbitrarily thought they
+ * sounded interesting. ;^) */
- if(window_length >= (MIN_GPS_DATAWIN_SIZE + 4)) {
+ if (window_length >= (MIN_GPS_DATAWIN_SIZE + 4)) {
// FIXME: Report both epx and epy!
/* Fill in the estimated horizontal position error. */
- if (isnan(gpsdata->fix.epx)==0 && isnan(gpsdata->fix.epx)==0)
- (void)snprintf(scr, sizeof(scr), "+/- %d %s", (int) (EMIX(gpsdata->fix.epx,gpsdata->fix.epy) * altfactor), altunits);
+ if (isnan(gpsdata->fix.epx) == 0 && isnan(gpsdata->fix.epx) == 0)
+ (void)snprintf(scr, sizeof(scr), "+/- %d %s",
+ (int)(EMIX(gpsdata->fix.epx, gpsdata->fix.epy) *
+ altfactor), altunits);
else
(void)snprintf(scr, sizeof(scr), "n/a");
- (void)mvwprintw(datawin, 10, DATAWIN_VALUE_OFFSET + 5, "%-*s", 22, scr);
+ (void)mvwprintw(datawin, 10, DATAWIN_VALUE_OFFSET + 5, "%-*s", 22,
+ scr);
/* Fill in the estimated vertical position error. */
- if (isnan(gpsdata->fix.epv)==0)
- (void)snprintf(scr, sizeof(scr), "+/- %d %s", (int)(gpsdata->fix.epv * altfactor), altunits);
+ if (isnan(gpsdata->fix.epv) == 0)
+ (void)snprintf(scr, sizeof(scr), "+/- %d %s",
+ (int)(gpsdata->fix.epv * altfactor), altunits);
else
(void)snprintf(scr, sizeof(scr), "n/a");
- (void)mvwprintw(datawin, 11, DATAWIN_VALUE_OFFSET + 5, "%-*s", 22, scr);
+ (void)mvwprintw(datawin, 11, DATAWIN_VALUE_OFFSET + 5, "%-*s", 22,
+ scr);
/* Fill in the estimated track error. */
- if (isnan(gpsdata->fix.epd)==0)
- (void)snprintf(scr, sizeof(scr), "+/- %d deg", (int)(gpsdata->fix.epd));
+ if (isnan(gpsdata->fix.epd) == 0)
+ (void)snprintf(scr, sizeof(scr), "+/- %d deg",
+ (int)(gpsdata->fix.epd));
else
(void)snprintf(scr, sizeof(scr), "n/a");
- (void)mvwprintw(datawin, 12, DATAWIN_VALUE_OFFSET + 5, "%-*s", 22, scr);
+ (void)mvwprintw(datawin, 12, DATAWIN_VALUE_OFFSET + 5, "%-*s", 22,
+ scr);
/* Fill in the estimated speed error. */
- if (isnan(gpsdata->fix.eps)==0)
- (void)snprintf(scr, sizeof(scr), "+/- %d %s", (int)(gpsdata->fix.eps * speedfactor), speedunits);
+ if (isnan(gpsdata->fix.eps) == 0)
+ (void)snprintf(scr, sizeof(scr), "+/- %d %s",
+ (int)(gpsdata->fix.eps * speedfactor), speedunits);
else
(void)snprintf(scr, sizeof(scr), "n/a");
- (void)mvwprintw(datawin, 13, DATAWIN_VALUE_OFFSET + 5, "%-*s", 22, scr);
+ (void)mvwprintw(datawin, 13, DATAWIN_VALUE_OFFSET + 5, "%-*s", 22,
+ scr);
}
/* Be quiet if the user requests silence. */
- if(!silent_flag && raw_flag) {
+ if (!silent_flag && raw_flag) {
(void)waddstr(messages, message);
}
@@ -665,12 +712,12 @@ static void update_gps_panel(struct gps_data_t *gpsdata,
(void)wrefresh(datawin);
(void)wrefresh(satellites);
- if(raw_flag) {
+ if (raw_flag) {
(void)wrefresh(messages);
}
}
-static void usage( char *prog)
+static void usage(char *prog)
{
(void)fprintf(stderr,
"Usage: %s [-h] [-V] [-l {d|m|s}] [server[:port:[device]]]\n\n"
@@ -682,8 +729,8 @@ static void usage( char *prog)
" m = DD MM.mmmm'\n"
" s = DD MM' SS.sss\"\n"
" -m Display heading as the estimated magnetic heading\n"
- " Valid only for USA (Lower 48 + AK) and Western Europe.\n"
- , prog);
+ " Valid only for USA (Lower 48 + AK) and Western Europe.\n",
+ prog);
exit(1);
}
@@ -702,8 +749,7 @@ int main(int argc, char *argv[])
int data;
/*@ -observertrans @*/
- switch (gpsd_units())
- {
+ switch (gpsd_units()) {
case imperial:
altfactor = METERS_TO_FEET;
altunits = "ft";
@@ -738,14 +784,14 @@ int main(int argc, char *argv[])
break;
#endif /* CLIENTDEBUG_ENABLE */
case 'm':
- magnetic_flag=true;
+ magnetic_flag = true;
break;
case 's':
- silent_flag=true;
+ silent_flag = true;
break;
case 'u':
/*@ -observertrans @*/
- switch ( optarg[0] ) {
+ switch (optarg[0]) {
case 'i':
altfactor = METERS_TO_FEET;
altunits = "ft";
@@ -770,11 +816,11 @@ int main(int argc, char *argv[])
break;
/*@ +observertrans @*/
case 'V':
- (void)fprintf(stderr, "xgps: %s (revision %s)\n",
+ (void)fprintf(stderr, "cgps: %s (revision %s)\n",
VERSION, REVISION);
exit(0);
case 'l':
- switch ( optarg[0] ) {
+ switch (optarg[0]) {
case 'd':
deg_type = deg_dd;
continue;
@@ -789,7 +835,8 @@ int main(int argc, char *argv[])
/*@ -casebreak @*/
}
break;
- case 'h': default:
+ case 'h':
+ default:
usage(argv[0]);
break;
}
@@ -802,25 +849,25 @@ int main(int argc, char *argv[])
gpsd_source_spec(NULL, &source);
/* Open the stream to gpsd. */
- /*@i@*/gpsdata = gps_open(source.server, source.port);
+ /*@i@*/ gpsdata = gps_open(source.server, source.port);
if (!gpsdata) {
- (void)fprintf( stderr,
- "cgps: no gpsd running or network error: %d, %s\n",
- errno, gps_errstr(errno));
+ (void)fprintf(stderr,
+ "cgps: no gpsd running or network error: %d, %s\n",
+ errno, gps_errstr(errno));
exit(2);
}
/* Fire up curses. */
(void)initscr();
(void)noecho();
- (void)signal(SIGINT,die);
- (void)signal(SIGHUP,die);
+ (void)signal(SIGINT, die);
+ (void)signal(SIGHUP, die);
windowsetup();
/* Here's where updates go now that things are established. */
#ifdef TRUENORTH
- if(compass_flag) {
+ if (compass_flag) {
gps_set_raw_hook(gpsdata, update_compass_panel);
} else
#endif /* TRUENORTH */
@@ -847,20 +894,20 @@ int main(int argc, char *argv[])
data = select(gpsdata->gps_fd + 1, &rfds, NULL, NULL, &timeout);
if (data == -1) {
- fprintf( stderr, "cgps: socket error 3\n");
+ fprintf(stderr, "cgps: socket error 3\n");
exit(2);
- } else if( data ) {
+ } else if (data) {
errno = 0;
if (gps_poll(gpsdata) != 0) {
- fprintf( stderr, "cgps: socket error 4\n");
+ fprintf(stderr, "cgps: socket error 4\n");
die(errno == 0 ? GPS_GONE : GPS_ERROR);
}
}
/* Check for user input. */
- c=wgetch(datawin);
+ c = wgetch(datawin);
- switch ( c ) {
+ switch (c) {
/* Quit */
case 'q':
die(CGPS_QUIT);
diff --git a/configure.ac b/configure.ac
index e1c30fa3..a7914f89 100644
--- a/configure.ac
+++ b/configure.ac
@@ -228,6 +228,29 @@ AC_CHECK_LIB(pthread, pthread_setcancelstate,
AC_DEFINE([HAVE_LIBPTHREAD], [], [pthread libraries are present])])
AC_SUBST(LIBPTHREAD)
+#
+# We want libusb-1.x or later. Checking for this is messy in 2010
+# since many Linux systems ship with .0,1.x versions and that's
+# what you get if you check naively for -lusb.
+#
+# We use the fact that the obsolete versions put their include file in
+# /usr/include/usb.h, while the newer ones have it in
+# /usr/include/libusb-*/libusb.h
+#
+AC_MSG_CHECKING([for libusb version >= 1.0.0])
+if test -f /usr/include/libusb-*/libusb.h ;
+then
+ usb=$(basename /usr/lib/libusb-*.so | sed -e s/\.so// -e s/^lib//)
+ AC_DEFINE([HAVE_LIBUSB], [], [will link with -l$usb; ])
+ LIBUSB=-l${usb}
+ INCUSB=-I/usr/include/lib${usb}
+ AC_MSG_RESULT([found.])
+else
+ AC_MSG_RESULT([not found.])
+fi
+AC_SUBST(LIBUSB)
+AC_SUBST(INCUSB)
+
AH_VERBATIM([_GNU_SOURCE],
[/* Some libc's don't have strlcat/strlcpy. Local copies are provided */
#ifndef HAVE_STRLCAT
@@ -507,8 +530,8 @@ fi
dnl check for True North support
AC_ARG_ENABLE(tnt,
AC_HELP_STRING([--enable-tnt],
- [enable True North Technologies support]),
- [ac_tnt=$enableval], [ac_tnt=no])
+ [disable True North Technologies support]),
+ [ac_tnt=$enableval], [ac_tnt=yes])
AC_MSG_CHECKING([for True North support])
if test x"$ac_tnt" = "xyes"; then
ac_nmea=yes
@@ -521,9 +544,9 @@ fi
dnl check for OceanServer support
AC_ARG_ENABLE(oceanserver,
- AC_HELP_STRING([--enable-oceanserver],
- [enable OceanServer support]),
- [ac_oceanserver=$enableval], [ac_oceanserver=no])
+ AC_HELP_STRING([--disble-oceanserver],
+ [disable OceanServer support]),
+ [ac_oceanserver=$enableval], [ac_oceanserver=yes])
AC_MSG_CHECKING([for OceanServer support])
if test x"$ac_oceanserver" = "xyes"; then
ac_nmea=yes
@@ -651,6 +674,7 @@ if test x"$ac_aivdm" = "xyes"; then
else
AC_MSG_RESULT([no])
fi
+AM_CONDITIONAL([HAVE_AIVDM], [test "$ac_aivdm" = "yes"])
dnl check for latency timing support
AC_ARG_ENABLE(timing,
@@ -1044,7 +1068,6 @@ echo "MTK-3301 : $ac_mtk3301"
dnl Below this line are non-protocol switches
echo " Daemon Features"
echo " ---------------"
-echo "Old protocol : $ac_oldstyle"
echo "NTP SHM : $ac_ntpshm"
echo "NTP PPS : $ac_pps"
echo -n "PPS input on : " ; case $ac_ppsoncts in yes) echo "CTS" ;; no) echo "DCD" ;; *) echo "Not defined" ;; esac
@@ -1061,6 +1084,7 @@ echo "Squelch logging/hexdump : $ac_squelch"
echo "Raw Measurements : $ac_raw"
echo " Client Features"
echo " ---------------"
+echo "Old protocol in libgps : $ac_oldstyle"
echo "Build ncurses programs : $ac_ncurses"
echo "Enable X11 support : $ac_x"
echo "Enable Python support : $ac_python"
diff --git a/crc24q.c b/crc24q.c
index 0cb88a68..c58e0427 100644
--- a/crc24q.c
+++ b/crc24q.c
@@ -40,10 +40,9 @@
unsigned table[25];
#define CRCSEED 0 /* could be NZ to detect leading zeros */
-#define CRCPOLY 0x1864CFB /* encodes all info about the polynomial */
+#define CRCPOLY 0x1864CFB /* encodes all info about the polynomial */
-static void
-crc_init(unsigned table[256])
+static void crc_init(unsigned table[256])
{
unsigned i, j;
unsigned h;
@@ -55,7 +54,7 @@ crc_init(unsigned table[256])
if ((h <<= 1) & 0x1000000)
h ^= CRCPOLY;
for (j = 0; j < i; j++)
- table[i+j] = table[j] ^ h;
+ table[i + j] = table[j] ^ h;
}
}
@@ -76,70 +75,70 @@ int main(int argc, char *argv[])
#endif
static const unsigned crc24q[256] = {
- 0x00000000, 0x01864CFB, 0x028AD50D, 0x030C99F6,
- 0x0493E6E1, 0x0515AA1A, 0x061933EC, 0x079F7F17,
- 0x08A18139, 0x0927CDC2, 0x0A2B5434, 0x0BAD18CF,
- 0x0C3267D8, 0x0DB42B23, 0x0EB8B2D5, 0x0F3EFE2E,
- 0x10C54E89, 0x11430272, 0x124F9B84, 0x13C9D77F,
- 0x1456A868, 0x15D0E493, 0x16DC7D65, 0x175A319E,
- 0x1864CFB0, 0x19E2834B, 0x1AEE1ABD, 0x1B685646,
- 0x1CF72951, 0x1D7165AA, 0x1E7DFC5C, 0x1FFBB0A7,
- 0x200CD1E9, 0x218A9D12, 0x228604E4, 0x2300481F,
- 0x249F3708, 0x25197BF3, 0x2615E205, 0x2793AEFE,
- 0x28AD50D0, 0x292B1C2B, 0x2A2785DD, 0x2BA1C926,
- 0x2C3EB631, 0x2DB8FACA, 0x2EB4633C, 0x2F322FC7,
- 0x30C99F60, 0x314FD39B, 0x32434A6D, 0x33C50696,
- 0x345A7981, 0x35DC357A, 0x36D0AC8C, 0x3756E077,
- 0x38681E59, 0x39EE52A2, 0x3AE2CB54, 0x3B6487AF,
- 0x3CFBF8B8, 0x3D7DB443, 0x3E712DB5, 0x3FF7614E,
- 0x4019A3D2, 0x419FEF29, 0x429376DF, 0x43153A24,
- 0x448A4533, 0x450C09C8, 0x4600903E, 0x4786DCC5,
- 0x48B822EB, 0x493E6E10, 0x4A32F7E6, 0x4BB4BB1D,
- 0x4C2BC40A, 0x4DAD88F1, 0x4EA11107, 0x4F275DFC,
- 0x50DCED5B, 0x515AA1A0, 0x52563856, 0x53D074AD,
- 0x544F0BBA, 0x55C94741, 0x56C5DEB7, 0x5743924C,
- 0x587D6C62, 0x59FB2099, 0x5AF7B96F, 0x5B71F594,
- 0x5CEE8A83, 0x5D68C678, 0x5E645F8E, 0x5FE21375,
- 0x6015723B, 0x61933EC0, 0x629FA736, 0x6319EBCD,
- 0x648694DA, 0x6500D821, 0x660C41D7, 0x678A0D2C,
- 0x68B4F302, 0x6932BFF9, 0x6A3E260F, 0x6BB86AF4,
- 0x6C2715E3, 0x6DA15918, 0x6EADC0EE, 0x6F2B8C15,
- 0x70D03CB2, 0x71567049, 0x725AE9BF, 0x73DCA544,
- 0x7443DA53, 0x75C596A8, 0x76C90F5E, 0x774F43A5,
- 0x7871BD8B, 0x79F7F170, 0x7AFB6886, 0x7B7D247D,
- 0x7CE25B6A, 0x7D641791, 0x7E688E67, 0x7FEEC29C,
- 0x803347A4, 0x81B50B5F, 0x82B992A9, 0x833FDE52,
- 0x84A0A145, 0x8526EDBE, 0x862A7448, 0x87AC38B3,
- 0x8892C69D, 0x89148A66, 0x8A181390, 0x8B9E5F6B,
- 0x8C01207C, 0x8D876C87, 0x8E8BF571, 0x8F0DB98A,
- 0x90F6092D, 0x917045D6, 0x927CDC20, 0x93FA90DB,
- 0x9465EFCC, 0x95E3A337, 0x96EF3AC1, 0x9769763A,
- 0x98578814, 0x99D1C4EF, 0x9ADD5D19, 0x9B5B11E2,
- 0x9CC46EF5, 0x9D42220E, 0x9E4EBBF8, 0x9FC8F703,
- 0xA03F964D, 0xA1B9DAB6, 0xA2B54340, 0xA3330FBB,
- 0xA4AC70AC, 0xA52A3C57, 0xA626A5A1, 0xA7A0E95A,
- 0xA89E1774, 0xA9185B8F, 0xAA14C279, 0xAB928E82,
- 0xAC0DF195, 0xAD8BBD6E, 0xAE872498, 0xAF016863,
- 0xB0FAD8C4, 0xB17C943F, 0xB2700DC9, 0xB3F64132,
- 0xB4693E25, 0xB5EF72DE, 0xB6E3EB28, 0xB765A7D3,
- 0xB85B59FD, 0xB9DD1506, 0xBAD18CF0, 0xBB57C00B,
- 0xBCC8BF1C, 0xBD4EF3E7, 0xBE426A11, 0xBFC426EA,
- 0xC02AE476, 0xC1ACA88D, 0xC2A0317B, 0xC3267D80,
- 0xC4B90297, 0xC53F4E6C, 0xC633D79A, 0xC7B59B61,
- 0xC88B654F, 0xC90D29B4, 0xCA01B042, 0xCB87FCB9,
- 0xCC1883AE, 0xCD9ECF55, 0xCE9256A3, 0xCF141A58,
- 0xD0EFAAFF, 0xD169E604, 0xD2657FF2, 0xD3E33309,
- 0xD47C4C1E, 0xD5FA00E5, 0xD6F69913, 0xD770D5E8,
- 0xD84E2BC6, 0xD9C8673D, 0xDAC4FECB, 0xDB42B230,
- 0xDCDDCD27, 0xDD5B81DC, 0xDE57182A, 0xDFD154D1,
- 0xE026359F, 0xE1A07964, 0xE2ACE092, 0xE32AAC69,
- 0xE4B5D37E, 0xE5339F85, 0xE63F0673, 0xE7B94A88,
- 0xE887B4A6, 0xE901F85D, 0xEA0D61AB, 0xEB8B2D50,
- 0xEC145247, 0xED921EBC, 0xEE9E874A, 0xEF18CBB1,
- 0xF0E37B16, 0xF16537ED, 0xF269AE1B, 0xF3EFE2E0,
- 0xF4709DF7, 0xF5F6D10C, 0xF6FA48FA, 0xF77C0401,
- 0xF842FA2F, 0xF9C4B6D4, 0xFAC82F22, 0xFB4E63D9,
- 0xFCD11CCE, 0xFD575035, 0xFE5BC9C3, 0xFFDD8538,
+ 0x00000000, 0x01864CFB, 0x028AD50D, 0x030C99F6,
+ 0x0493E6E1, 0x0515AA1A, 0x061933EC, 0x079F7F17,
+ 0x08A18139, 0x0927CDC2, 0x0A2B5434, 0x0BAD18CF,
+ 0x0C3267D8, 0x0DB42B23, 0x0EB8B2D5, 0x0F3EFE2E,
+ 0x10C54E89, 0x11430272, 0x124F9B84, 0x13C9D77F,
+ 0x1456A868, 0x15D0E493, 0x16DC7D65, 0x175A319E,
+ 0x1864CFB0, 0x19E2834B, 0x1AEE1ABD, 0x1B685646,
+ 0x1CF72951, 0x1D7165AA, 0x1E7DFC5C, 0x1FFBB0A7,
+ 0x200CD1E9, 0x218A9D12, 0x228604E4, 0x2300481F,
+ 0x249F3708, 0x25197BF3, 0x2615E205, 0x2793AEFE,
+ 0x28AD50D0, 0x292B1C2B, 0x2A2785DD, 0x2BA1C926,
+ 0x2C3EB631, 0x2DB8FACA, 0x2EB4633C, 0x2F322FC7,
+ 0x30C99F60, 0x314FD39B, 0x32434A6D, 0x33C50696,
+ 0x345A7981, 0x35DC357A, 0x36D0AC8C, 0x3756E077,
+ 0x38681E59, 0x39EE52A2, 0x3AE2CB54, 0x3B6487AF,
+ 0x3CFBF8B8, 0x3D7DB443, 0x3E712DB5, 0x3FF7614E,
+ 0x4019A3D2, 0x419FEF29, 0x429376DF, 0x43153A24,
+ 0x448A4533, 0x450C09C8, 0x4600903E, 0x4786DCC5,
+ 0x48B822EB, 0x493E6E10, 0x4A32F7E6, 0x4BB4BB1D,
+ 0x4C2BC40A, 0x4DAD88F1, 0x4EA11107, 0x4F275DFC,
+ 0x50DCED5B, 0x515AA1A0, 0x52563856, 0x53D074AD,
+ 0x544F0BBA, 0x55C94741, 0x56C5DEB7, 0x5743924C,
+ 0x587D6C62, 0x59FB2099, 0x5AF7B96F, 0x5B71F594,
+ 0x5CEE8A83, 0x5D68C678, 0x5E645F8E, 0x5FE21375,
+ 0x6015723B, 0x61933EC0, 0x629FA736, 0x6319EBCD,
+ 0x648694DA, 0x6500D821, 0x660C41D7, 0x678A0D2C,
+ 0x68B4F302, 0x6932BFF9, 0x6A3E260F, 0x6BB86AF4,
+ 0x6C2715E3, 0x6DA15918, 0x6EADC0EE, 0x6F2B8C15,
+ 0x70D03CB2, 0x71567049, 0x725AE9BF, 0x73DCA544,
+ 0x7443DA53, 0x75C596A8, 0x76C90F5E, 0x774F43A5,
+ 0x7871BD8B, 0x79F7F170, 0x7AFB6886, 0x7B7D247D,
+ 0x7CE25B6A, 0x7D641791, 0x7E688E67, 0x7FEEC29C,
+ 0x803347A4, 0x81B50B5F, 0x82B992A9, 0x833FDE52,
+ 0x84A0A145, 0x8526EDBE, 0x862A7448, 0x87AC38B3,
+ 0x8892C69D, 0x89148A66, 0x8A181390, 0x8B9E5F6B,
+ 0x8C01207C, 0x8D876C87, 0x8E8BF571, 0x8F0DB98A,
+ 0x90F6092D, 0x917045D6, 0x927CDC20, 0x93FA90DB,
+ 0x9465EFCC, 0x95E3A337, 0x96EF3AC1, 0x9769763A,
+ 0x98578814, 0x99D1C4EF, 0x9ADD5D19, 0x9B5B11E2,
+ 0x9CC46EF5, 0x9D42220E, 0x9E4EBBF8, 0x9FC8F703,
+ 0xA03F964D, 0xA1B9DAB6, 0xA2B54340, 0xA3330FBB,
+ 0xA4AC70AC, 0xA52A3C57, 0xA626A5A1, 0xA7A0E95A,
+ 0xA89E1774, 0xA9185B8F, 0xAA14C279, 0xAB928E82,
+ 0xAC0DF195, 0xAD8BBD6E, 0xAE872498, 0xAF016863,
+ 0xB0FAD8C4, 0xB17C943F, 0xB2700DC9, 0xB3F64132,
+ 0xB4693E25, 0xB5EF72DE, 0xB6E3EB28, 0xB765A7D3,
+ 0xB85B59FD, 0xB9DD1506, 0xBAD18CF0, 0xBB57C00B,
+ 0xBCC8BF1C, 0xBD4EF3E7, 0xBE426A11, 0xBFC426EA,
+ 0xC02AE476, 0xC1ACA88D, 0xC2A0317B, 0xC3267D80,
+ 0xC4B90297, 0xC53F4E6C, 0xC633D79A, 0xC7B59B61,
+ 0xC88B654F, 0xC90D29B4, 0xCA01B042, 0xCB87FCB9,
+ 0xCC1883AE, 0xCD9ECF55, 0xCE9256A3, 0xCF141A58,
+ 0xD0EFAAFF, 0xD169E604, 0xD2657FF2, 0xD3E33309,
+ 0xD47C4C1E, 0xD5FA00E5, 0xD6F69913, 0xD770D5E8,
+ 0xD84E2BC6, 0xD9C8673D, 0xDAC4FECB, 0xDB42B230,
+ 0xDCDDCD27, 0xDD5B81DC, 0xDE57182A, 0xDFD154D1,
+ 0xE026359F, 0xE1A07964, 0xE2ACE092, 0xE32AAC69,
+ 0xE4B5D37E, 0xE5339F85, 0xE63F0673, 0xE7B94A88,
+ 0xE887B4A6, 0xE901F85D, 0xEA0D61AB, 0xEB8B2D50,
+ 0xEC145247, 0xED921EBC, 0xEE9E874A, 0xEF18CBB1,
+ 0xF0E37B16, 0xF16537ED, 0xF269AE1B, 0xF3EFE2E0,
+ 0xF4709DF7, 0xF5F6D10C, 0xF6FA48FA, 0xF77C0401,
+ 0xF842FA2F, 0xF9C4B6D4, 0xFAC82F22, 0xFB4E63D9,
+ 0xFCD11CCE, 0xFD575035, 0xFE5BC9C3, 0xFFDD8538,
};
unsigned crc24q_hash(unsigned char *data, int len)
@@ -148,7 +147,7 @@ unsigned crc24q_hash(unsigned char *data, int len)
unsigned crc = 0;
for (i = 0; i < len; i++) {
- crc = (crc << 8) ^ crc24q[data[i] ^ (unsigned char)(crc>>16)];
+ crc = (crc << 8) ^ crc24q[data[i] ^ (unsigned char)(crc >> 16)];
}
crc = (crc & 0x00ffffff);
@@ -164,17 +163,15 @@ void crc24q_sign(unsigned char *data, int len)
{
unsigned crc = crc24q_hash(data, len);
- data[len] = HI(crc);
- data[len+1] = MID(crc);
- data[len+2] = LO(crc);
+ data[len] = HI(crc);
+ data[len + 1] = MID(crc);
+ data[len + 2] = LO(crc);
}
bool crc24q_check(unsigned char *data, int len)
{
- unsigned crc = crc24q_hash(data, len-3);
+ unsigned crc = crc24q_hash(data, len - 3);
- return (((data[len-3] == HI(crc)) &&
- (data[len-2] == MID(crc)) &&
- (data[len-1] == LO(crc))));
+ return (((data[len - 3] == HI(crc)) &&
+ (data[len - 2] == MID(crc)) && (data[len - 1] == LO(crc))));
}
-
diff --git a/devtools/README b/devtools/README
index 50bf4d7e..9c71b06f 100644
--- a/devtools/README
+++ b/devtools/README
@@ -22,6 +22,11 @@ Usual caveats apply; the edited one and all commits after will change IDs,
and pushing them to a repo with the old commits will wreak havoc.
Note also that this cavalierly overwrites refs/original.
+== fakeserver ==
+
+Analogue of gpsfake. Impersonates a gpsd, spewing specified data to
+clients connecting to localhost:2947
+
== fakecompare ==
Compare the results from running gpsfake on a logfile between this
@@ -50,7 +55,7 @@ looking for ones that break the build.
== regressdiff ==
-Walk through a pair of textfiles looking for where they begin to differ.
+Walk through a pair of text files looking for where they begin to differ.
May be useful for comparing logs when regression tests break.
== striplog ==
diff --git a/devtools/ais.py b/devtools/ais.py
index e5e4f9c7..319f5f3d 100755
--- a/devtools/ais.py
+++ b/devtools/ais.py
@@ -2,6 +2,9 @@
#
# A Python AIVDM/AIVDO decoder
#
+# This file is Copyright (c) 2010 by the GPSD project
+# BSD terms apply: see the file COPYING in the distribution root for details.
+#
# This decoder works by defining a declarative pseudolanguage in which
# to describe the process of extracting packed bitfields from an AIS
# message, a set of tables which contain instructions in the pseudolanguage,
diff --git a/devtools/aivdmtable b/devtools/aivdmtable
index b1a1e550..aef8a6ad 100755
--- a/devtools/aivdmtable
+++ b/devtools/aivdmtable
@@ -1,6 +1,9 @@
#!/usr/bin/env python
#
# Generate an asciidoc table of the six-bit encoding used in AIVDM packets.
+#
+# This file is Copyright (c) 2010 by the GPSD project
+# BSD terms apply: see the file COPYING in the distribution root for details.
sixbits = (
"000000", "000001", "000010", "000011", "000100",
diff --git a/devtools/cycle_analyzer b/devtools/cycle_analyzer
index f80cc445..f38c3859 100755
--- a/devtools/cycle_analyzer
+++ b/devtools/cycle_analyzer
@@ -1,4 +1,7 @@
#!/usr/bin/env python
+#
+# This file is Copyright (c) 2010 by the GPSD project
+# BSD terms apply: see the file COPYING in the distribution root for details.
"""
cycle_analyzer - perform cycle analysis on GPS log files
diff --git a/devtools/fakecompare b/devtools/fakecompare
index 81cc3ce6..d7b0d4c7 100755
--- a/devtools/fakecompare
+++ b/devtools/fakecompare
@@ -4,6 +4,9 @@
# machine and a remote one. Especially useful when remote and local
# have different word lengths.
#
+# This file is Copyright (c) 2010 by the GPSD project
+# BSD terms apply: see the file COPYING in the distribution root for details.
+#
file=$1
remote=$2
diff --git a/devtools/flocktest b/devtools/flocktest
index be90e545..6e1894a3 100755
--- a/devtools/flocktest
+++ b/devtools/flocktest
@@ -1,5 +1,8 @@
#!/usr/bin/env python
#
+# This file is Copyright (c) 2010 by the GPSD project
+# BSD terms apply: see the file COPYING in the distribution root for details.
+#
"""\
flocktest - shepherd script for the GPSD test flock
diff --git a/devtools/flocktest.ini b/devtools/flocktest.ini
index 93b88d3f..7b2bfb5a 100644
--- a/devtools/flocktest.ini
+++ b/devtools/flocktest.ini
@@ -49,6 +49,7 @@ admin = jon.schlueter@gmail.com
login = gpsd
devices = Garmin GPS18 USB
status = all GPS tests always fail, probably permissions-related
+devices = TNT Revolution on /dev/ttyS0, Garmin GPS-18 on USB (probably USB0)
[quark.yazug.com]
os = Linux
diff --git a/devtools/gpsdfake b/devtools/gpsdfake
new file mode 100644
index 00000000..72557e0d
--- /dev/null
+++ b/devtools/gpsdfake
@@ -0,0 +1,50 @@
+# This file is Copyright (c) 2010 by the GPSD project
+# BSD terms apply: see the file COPYING in the distribution root for details.
+"""
+gpsdfake - a fake gpsd server that spews specified data at gpsd clients.
+"""
+
+import sys, SocketServer
+
+class FakeHandler(SocketServer.BaseRequestHandler):
+ "Instantiated once per connection to the server."
+ def handle(self):
+ global lines
+ # self.request is the TCP socket connected to the client
+ # Read the client's ?WATCH request.
+ self.data = self.request.recv(1024).strip()
+ # We'd like to send a fake banner to the client on startup,
+ # but there's no (documented) method for that. We settle
+ # for shipping on first request.
+ self.request.send('{"class":"VERSION",'
+ '"version":"gpsdfake","rev":"gpsdfake",'
+ '"proto_major":3,"proto_minor":1}\r\n')
+ # Perpetually resend the data we have specified
+ while True:
+ for line in lines:
+ self.request.send(line)
+
+if __name__ == "__main__":
+ (HOST, PORT) = "localhost", 2947
+
+ try:
+ if len(sys.argv) <= 1:
+ sys.stderr.write("gpsdfake: requires a file argument.\n")
+ sys.exit(1)
+
+ lines = open(sys.argv[1]).readlines()
+
+ # Create the server, binding to localhost on port 2947
+ server = SocketServer.TCPServer((HOST, PORT), FakeHandler)
+
+ # Activate the server; this will keep running until you
+ # interrupt the program with Ctrl-C
+ server.serve_forever()
+ except KeyboardInterrupt:
+ pass
+ sys.exit(0)
+
+# The following sets edit modes for GNU EMACS
+# Local Variables:
+# mode:python
+# End:
diff --git a/devtools/leapsecond.py b/devtools/leapsecond.py
index 8c1e5ab2..a2c83136 100755
--- a/devtools/leapsecond.py
+++ b/devtools/leapsecond.py
@@ -4,6 +4,9 @@
# GPS time, which changes occasionally due to variations in the Earth's
# rotation.
#
+# This file is Copyright (c) 2010 by the GPSD project
+# BSD terms apply: see the file COPYING in the distribution root for details.
+#
import os, urllib, re, random, time, calendar
__locations = [
diff --git a/devtools/logextract b/devtools/logextract
index ed427e0e..42a08480 100755
--- a/devtools/logextract
+++ b/devtools/logextract
@@ -1,6 +1,9 @@
#!/bin/sh
# Extract pure NMEA from an emailed gpsd error log.
# The output can be fed to gpsfake.
+#
+# This file is Copyright (c) 2010 by the GPSD project
+# BSD terms apply: see the file COPYING in the distribution root for details.
sed -n -e "/^> */s///" -e "/gpsd: <= GPS: /s///" -e '/^\$/p'
diff --git a/devtools/regress-builder b/devtools/regress-builder
index eef5f9d7..c16e4ff2 100755
--- a/devtools/regress-builder
+++ b/devtools/regress-builder
@@ -1,4 +1,7 @@
#!/bin/env python
+#
+# This file is Copyright (c) 2010 by the GPSD project
+# BSD terms apply: see the file COPYING in the distribution root for details.
"""
usage: regress-builder [-r limit] [-s seed]
diff --git a/devtools/regressdiff b/devtools/regressdiff
index 89c72a6d..947fa8aa 100755
--- a/devtools/regressdiff
+++ b/devtools/regressdiff
@@ -2,6 +2,9 @@
#
# Walk through a pair of textfiles looking for where they begin to differ.
# May be useful for comparing logs when regression tests break.
+#
+# This file is Copyright (c) 2010 by the GPSD project
+# BSD terms apply: see the file COPYING in the distribution root for details.
import sys
diff --git a/devtools/striplog b/devtools/striplog
index 8bd46d6d..bb73044e 100755
--- a/devtools/striplog
+++ b/devtools/striplog
@@ -5,6 +5,9 @@
# striplog -1 strips the first line only.
# striplog with no option strips all leading lines beginning with #
#
+# This file is Copyright (c) 2010 by the GPSD project
+# BSD terms apply: see the file COPYING in the distribution root for details.
+#
import getopt, sys
firstline = False
diff --git a/driver_aivdm.c b/driver_aivdm.c
index 7a0cb020..587afd9d 100644
--- a/driver_aivdm.c
+++ b/driver_aivdm.c
@@ -36,14 +36,15 @@ static void from_sixbit(char *bitvec, uint start, int count, char *to)
/* the real string causes a splint internal error */
const char sixchr[] = "abcd";
#else
- const char sixchr[64] = "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^- !\"#$%&`()*+,-./0123456789:;<=>?";
+ const char sixchr[64] =
+ "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^- !\"#$%&`()*+,-./0123456789:;<=>?";
#endif /* S_SPLINT_S */
int i;
char newchar;
/* six-bit to ASCII */
- for (i = 0; i < count-1; i++) {
- newchar = sixchr[ubits(bitvec, start + 6*i, 6U)];
+ for (i = 0; i < count - 1; i++) {
+ newchar = sixchr[ubits(bitvec, start + 6 * i, 6U)];
if (newchar == '@')
break;
else
@@ -51,7 +52,7 @@ static void from_sixbit(char *bitvec, uint start, int count, char *to)
}
to[i] = '\0';
/* trim spaces on right end */
- for (i = count-2; i >= 0; i--)
+ for (i = count - 2; i >= 0; i--)
if (to[i] == ' ' || to[i] == '@')
to[i] = '\0';
else
@@ -60,24 +61,24 @@ static void from_sixbit(char *bitvec, uint start, int count, char *to)
}
/*@ +charint @*/
-bool aivdm_decode(const char *buf, size_t buflen,
+bool aivdm_decode(const char *buf, size_t buflen,
struct aivdm_context_t *ais_context, struct ais_t *ais)
{
#ifdef __UNUSED_DEBUG__
char *sixbits[64] = {
"000000", "000001", "000010", "000011", "000100",
"000101", "000110", "000111", "001000", "001001",
- "001010", "001011", "001100", "001101", "001110",
+ "001010", "001011", "001100", "001101", "001110",
"001111", "010000", "010001", "010010", "010011",
- "010100", "010101", "010110", "010111", "011000",
- "011001", "011010", "011011", "011100", "011101",
- "011110", "011111", "100000", "100001", "100010",
- "100011", "100100", "100101", "100110", "100111",
- "101000", "101001", "101010", "101011", "101100",
- "101101", "101110", "101111", "110000", "110001",
- "110010", "110011", "110100", "110101", "110110",
- "110111", "111000", "111001", "111010", "111011",
- "111100", "111101", "111110", "111111",
+ "010100", "010101", "010110", "010111", "011000",
+ "011001", "011010", "011011", "011100", "011101",
+ "011110", "011111", "100000", "100001", "100010",
+ "100011", "100100", "100101", "100110", "100111",
+ "101000", "101001", "101010", "101011", "101100",
+ "101101", "101110", "101111", "110000", "110001",
+ "110010", "110011", "110100", "110101", "110110",
+ "110111", "111000", "111001", "111010", "111011",
+ "111100", "111101", "111110", "111111",
};
#endif /* __UNUSED_DEBUG__ */
int nfields = 0;
@@ -95,8 +96,7 @@ bool aivdm_decode(const char *buf, size_t buflen,
(void)strlcpy((char *)ais_context->fieldcopy, buf, buflen);
ais_context->field[nfields++] = (unsigned char *)buf;
for (cp = ais_context->fieldcopy;
- cp < ais_context->fieldcopy + buflen;
- cp++)
+ cp < ais_context->fieldcopy + buflen; cp++)
if (*cp == ',') {
*cp = '\0';
ais_context->field[nfields++] = cp + 1;
@@ -106,9 +106,7 @@ bool aivdm_decode(const char *buf, size_t buflen,
data = ais_context->field[5];
pad = ais_context->field[6][0];
gpsd_report(LOG_PROG, "await=%d, part=%d, data=%s\n",
- ais_context->await,
- ais_context->part,
- data);
+ ais_context->await, ais_context->part, data);
/* assemble the binary data */
if (ais_context->part == 1) {
@@ -129,7 +127,8 @@ bool aivdm_decode(const char *buf, size_t buflen,
/*@ -shiftnegative @*/
for (i = 5; i >= 0; i--) {
if ((ch >> i) & 0x01) {
- ais_context->bits[ais_context->bitlen / 8] |= (1 << (7 - ais_context->bitlen % 8));
+ ais_context->bits[ais_context->bitlen / 8] |=
+ (1 << (7 - ais_context->bitlen % 8));
}
ais_context->bitlen++;
}
@@ -141,11 +140,10 @@ bool aivdm_decode(const char *buf, size_t buflen,
/* time to pass buffered-up data to where it's actually processed? */
if (ais_context->part == ais_context->await) {
- size_t clen = (ais_context->bitlen + 7)/8;
+ size_t clen = (ais_context->bitlen + 7) / 8;
gpsd_report(LOG_INF, "AIVDM payload is %zd bits, %zd chars: %s\n",
ais_context->bitlen, clen,
- gpsd_hexdump_wrapper(ais_context->bits,
- clen, LOG_INF));
+ gpsd_hexdump_wrapper(ais_context->bits, clen, LOG_INF));
#define BITS_PER_BYTE 8
@@ -157,6 +155,12 @@ bool aivdm_decode(const char *buf, size_t buflen,
ais->mmsi = UBITS(8, 30);
gpsd_report(LOG_INF, "AIVDM message type %d, MMSI %09d:\n",
ais->type, ais->mmsi);
+ /*
+ * Something about the shape of this switch statement confuses
+ * GNU indent so badly that there is no point in trying to be
+ * finer-grained than leaving it all alone.
+ */
+ /* *INDENT-OFF* */
switch (ais->type) {
case 1: /* Position Report */
case 2:
@@ -700,7 +704,7 @@ bool aivdm_decode(const char *buf, size_t buflen,
ais->type26.addressed = (bool)UBITS(38, 1);
ais->type26.structured = (bool)UBITS(39, 1);
if (ais->type26.addressed)
- ais->type26.dest_mmsi = UBITS(40, 30);
+ ais->type26.dest_mmsi = UBITS(40, 30);
if (ais->type26.structured)
ais->type26.app_id = UBITS(40+ais->type26.addressed*30,16);
ais->type26.bitcount = ais_context->bitlen - 60 - 16*ais->type26.structured;
@@ -719,6 +723,7 @@ bool aivdm_decode(const char *buf, size_t buflen,
gpsd_report(LOG_ERROR, "Unparsed AIVDM message type %d.\n",ais->type);
break;
}
+ /* *INDENT-ON* */
#undef UCHARS
#undef SBITS
#undef UBITS
@@ -731,7 +736,7 @@ bool aivdm_decode(const char *buf, size_t buflen,
/* we're still waiting on another sentence */
return false;
}
+
/*@ -charint @*/
/* driver_aivdm.c ends here */
-
diff --git a/driver_evermore.c b/driver_evermore.c
index b6e2cc7d..b775891c 100644
--- a/driver_evermore.c
+++ b/driver_evermore.c
@@ -136,7 +136,8 @@
#define EVERMORE_CHANNELS 12
/*@ +charint @*/
-gps_mask_t evermore_parse(struct gps_device_t *session, unsigned char *buf, size_t len)
+gps_mask_t evermore_parse(struct gps_device_t * session, unsigned char *buf,
+ size_t len)
{
unsigned char buf2[MAX_PACKET_LENGTH], *cp, *tp;
size_t i, datalen;
@@ -150,18 +151,20 @@ gps_mask_t evermore_parse(struct gps_device_t *session, unsigned char *buf, size
/* time to unstuff it and discard the header and footer */
cp = buf + 2;
tp = buf2;
- if (*cp == 0x10) cp++;
- datalen = (size_t)*cp++;
+ if (*cp == 0x10)
+ cp++;
+ datalen = (size_t) * cp++;
gpsd_report(LOG_RAW, "raw EverMore packet type 0x%02x, length %zd: %s\n",
- *cp, len, gpsd_hexdump_wrapper(buf, len, LOG_RAW));
+ *cp, len, gpsd_hexdump_wrapper(buf, len, LOG_RAW));
datalen -= 2;
/*@ -usedef @*/
- for (i = 0; i < (size_t)datalen; i++) {
+ for (i = 0; i < (size_t) datalen; i++) {
*tp = *cp++;
- if (*tp == 0x10) cp++;
+ if (*tp == 0x10)
+ cp++;
tp++;
}
@@ -170,7 +173,7 @@ gps_mask_t evermore_parse(struct gps_device_t *session, unsigned char *buf, size
/*@ -usedef -compdef @*/
gpsd_report(LOG_RAW, "EverMore packet type 0x%02x, length %zd: %s\n",
- type, datalen, gpsd_hexdump_wrapper(buf2, datalen, LOG_RAW));
+ type, datalen, gpsd_hexdump_wrapper(buf2, datalen, LOG_RAW));
/*@ +usedef +compdef @*/
(void)snprintf(session->gpsdata.tag, sizeof(session->gpsdata.tag),
@@ -178,19 +181,22 @@ gps_mask_t evermore_parse(struct gps_device_t *session, unsigned char *buf, size
session->cycle_end_reliable = true;
- switch (type)
- {
- case 0x02: /* Navigation Data Output */
- /*@ ignore @*//*@ splint is confused @*/
+ switch (type) {
+ case 0x02: /* Navigation Data Output */
+ /*@ ignore @*//*@ splint is confused @ */
session->newdata.time =
- gpstime_to_unix((int)getleuw(buf2, 2), getleul(buf2, 4)*0.01) - session->context->leap_seconds;
+ gpstime_to_unix((int)getleuw(buf2, 2),
+ getleul(buf2,
+ 4) * 0.01) -
+ session->context->leap_seconds;
/*@ end @*/
ecef_to_wgs84fix(&session->newdata, &session->gpsdata.separation,
- getlesl(buf2, 8)*1.0, getlesl(buf2, 12)*1.0, getlesl(buf2, 16)*1.0,
- getlesw(buf2, 20)/10.0, getlesw(buf2, 22)/10.0, getlesw(buf2, 24)/10.0);
+ getlesl(buf2, 8) * 1.0, getlesl(buf2, 12) * 1.0,
+ getlesl(buf2, 16) * 1.0, getlesw(buf2, 20) / 10.0,
+ getlesw(buf2, 22) / 10.0, getlesw(buf2, 24) / 10.0);
used = (unsigned char)getub(buf2, 26) & 0x0f;
//visible = (getub(buf2, 26) & 0xf0) >> 4;
- version = (uint)getleuw(buf2, 27)/100.0;
+ version = (uint) getleuw(buf2, 27) / 100.0;
/* that's all the information in this packet */
if (used < 3)
session->newdata.mode = MODE_NO_FIX;
@@ -198,93 +204,97 @@ gps_mask_t evermore_parse(struct gps_device_t *session, unsigned char *buf, size
session->newdata.mode = MODE_2D;
else {
session->newdata.mode = MODE_3D;
- mask |= ALTITUDE_SET | CLIMB_SET;
+ mask |= ALTITUDE_IS | CLIMB_IS;
}
- mask |= TIME_SET | LATLON_SET | TRACK_SET | SPEED_SET | MODE_SET;
+ mask |= TIME_IS | LATLON_IS | TRACK_IS | SPEED_IS | MODE_IS;
if (session->subtype[0] == '\0') {
- (void)snprintf(session->subtype, sizeof(session->subtype),
- "%3.2f", version);
- mask |= DEVICEID_SET;
+ (void)snprintf(session->subtype, sizeof(session->subtype),
+ "%3.2f", version);
+ mask |= DEVICEID_IS;
}
- gpsd_report(LOG_DATA, "NDO 0x02: time=%.2f, lat=%.2f lon=%.2f alt=%.2f speed=%.2f track=%.2f climb=%.2f mode=%d subtype='%s' mask=%s\n",
- session->newdata.time,
- session->newdata.latitude,
- session->newdata.longitude,
- session->newdata.altitude,
- session->newdata.speed,
- session->newdata.track,
- session->newdata.climb,
- session->newdata.mode,
- session->gpsdata.dev.subtype,
- gpsd_maskdump(mask));
- return mask | CLEAR_SET | REPORT_SET;
-
- case 0x04: /* DOP Data Output */
- /*@ ignore @*//*@ splint is confused @*/
+ gpsd_report(LOG_DATA,
+ "NDO 0x02: time=%.2f, lat=%.2f lon=%.2f alt=%.2f speed=%.2f track=%.2f climb=%.2f mode=%d subtype='%s' mask=%s\n",
+ session->newdata.time, session->newdata.latitude,
+ session->newdata.longitude, session->newdata.altitude,
+ session->newdata.speed, session->newdata.track,
+ session->newdata.climb, session->newdata.mode,
+ session->gpsdata.dev.subtype, gpsd_maskdump(mask));
+ return mask | CLEAR_IS | REPORT_IS;
+
+ case 0x04: /* DOP Data Output */
+ /*@ ignore @*//*@ splint is confused @ */
session->newdata.time =
- gpstime_to_unix((int)getleuw(buf2, 2), getleul(buf2, 4)*0.01) - session->context->leap_seconds;
+ gpstime_to_unix((int)getleuw(buf2, 2),
+ getleul(buf2,
+ 4) * 0.01) -
+ session->context->leap_seconds;
/*@ end @*/
clear_dop(&session->gpsdata.dop);
- session->gpsdata.dop.gdop = (double)getub(buf2, 8)*0.1;
- session->gpsdata.dop.pdop = (double)getub(buf2, 9)*0.1;
- session->gpsdata.dop.hdop = (double)getub(buf2, 10)*0.1;
- session->gpsdata.dop.vdop = (double)getub(buf2, 11)*0.1;
- session->gpsdata.dop.tdop = (double)getub(buf2, 12)*0.1;
+ session->gpsdata.dop.gdop = (double)getub(buf2, 8) * 0.1;
+ session->gpsdata.dop.pdop = (double)getub(buf2, 9) * 0.1;
+ session->gpsdata.dop.hdop = (double)getub(buf2, 10) * 0.1;
+ session->gpsdata.dop.vdop = (double)getub(buf2, 11) * 0.1;
+ session->gpsdata.dop.tdop = (double)getub(buf2, 12) * 0.1;
switch (getub(buf2, 13)) {
- case 0: /* no position fix */
- case 1: /* manual calls this "1D navigation" */
+ case 0: /* no position fix */
+ case 1: /* manual calls this "1D navigation" */
session->gpsdata.status = STATUS_NO_FIX;
session->newdata.mode = MODE_NO_FIX;
break;
- case 2: /* 2D navigation */
+ case 2: /* 2D navigation */
session->gpsdata.status = STATUS_FIX;
session->newdata.mode = MODE_2D;
break;
- case 3: /* 3D navigation */
+ case 3: /* 3D navigation */
session->gpsdata.status = STATUS_FIX;
session->newdata.mode = MODE_3D;
break;
- case 4: /* 3D navigation with DGPS */
+ case 4: /* 3D navigation with DGPS */
session->gpsdata.status = STATUS_DGPS_FIX;
session->newdata.mode = MODE_3D;
break;
}
/* that's all the information in this packet */
- mask = TIME_SET | DOP_SET | MODE_SET | STATUS_SET;
- gpsd_report(LOG_DATA, "DDO 0x04: gdop=%.2f pdop=%.2f hdop=%.2f vdop=%.2f tdop=%.2f mode=%d, status=%d mask={TIME| DOP|MODE|STATUS}\n",
- session->gpsdata.dop.gdop,
- session->gpsdata.dop.pdop,
- session->gpsdata.dop.hdop,
- session->gpsdata.dop.vdop,
- session->gpsdata.dop.tdop,
- session->newdata.mode,
+ mask = TIME_IS | DOP_IS | MODE_IS | STATUS_IS;
+ gpsd_report(LOG_DATA,
+ "DDO 0x04: gdop=%.2f pdop=%.2f hdop=%.2f vdop=%.2f tdop=%.2f mode=%d, status=%d mask={TIME| DOP|MODE|STATUS}\n",
+ session->gpsdata.dop.gdop, session->gpsdata.dop.pdop,
+ session->gpsdata.dop.hdop, session->gpsdata.dop.vdop,
+ session->gpsdata.dop.tdop, session->newdata.mode,
session->gpsdata.status);
return mask;
- case 0x06: /* Channel Status Output */
- /*@ ignore @*//*@ splint is confused @*/
+ case 0x06: /* Channel Status Output */
+ /*@ ignore @*//*@ splint is confused @ */
session->gpsdata.skyview_time =
- gpstime_to_unix((int)getleuw(buf2, 2), getleul(buf2, 4)*0.01) - session->context->leap_seconds;
+ gpstime_to_unix((int)getleuw(buf2, 2),
+ getleul(buf2,
+ 4) * 0.01) -
+ session->context->leap_seconds;
/*@ end @*/
session->gpsdata.satellites_visible = (int)getub(buf2, 8);
session->gpsdata.satellites_used = 0;
memset(session->gpsdata.used, 0, sizeof(session->gpsdata.used));
if (session->gpsdata.satellites_visible > 12) {
- gpsd_report(LOG_WARN, "Warning: EverMore packet has information about %d satellites!\n",
- session->gpsdata.satellites_visible);
+ gpsd_report(LOG_WARN,
+ "Warning: EverMore packet has information about %d satellites!\n",
+ session->gpsdata.satellites_visible);
}
- if (session->gpsdata.satellites_visible > EVERMORE_CHANNELS)
+ if (session->gpsdata.satellites_visible > EVERMORE_CHANNELS)
session->gpsdata.satellites_visible = EVERMORE_CHANNELS;
satcnt = 0;
- for (i = 0; i < (size_t)session->gpsdata.satellites_visible; i++) {
+ for (i = 0; i < (size_t) session->gpsdata.satellites_visible; i++) {
int prn;
// channel = getub(buf2, 7*i+7+2)
- prn = (int)getub(buf2, 7*i+7+3);
- if (prn == 0) continue; /* satellite record is not valid */
+ prn = (int)getub(buf2, 7 * i + 7 + 3);
+ if (prn == 0)
+ continue; /* satellite record is not valid */
session->gpsdata.PRN[satcnt] = prn;
- session->gpsdata.azimuth[satcnt] = (int)getleuw(buf2, 7*i+7+4);
- session->gpsdata.elevation[satcnt] = (int)getub(buf2, 7*i+7+6);
- session->gpsdata.ss[satcnt] = (float)getub(buf2, 7*i+7+7);
+ session->gpsdata.azimuth[satcnt] =
+ (int)getleuw(buf2, 7 * i + 7 + 4);
+ session->gpsdata.elevation[satcnt] =
+ (int)getub(buf2, 7 * i + 7 + 6);
+ session->gpsdata.ss[satcnt] = (float)getub(buf2, 7 * i + 7 + 7);
/*
* Status bits at offset 8:
* bit0 = 1 satellite acquired
@@ -295,27 +305,31 @@ gps_mask_t evermore_parse(struct gps_device_t *session, unsigned char *buf, size
* bit5 = 1 ephemeris data collected
* bit6 = 1 used for position fix
*/
- if (getub(buf2, 7*i+7+8) & 0x40) {
- session->gpsdata.used[session->gpsdata.satellites_used++]=prn;
+ if (getub(buf2, 7 * i + 7 + 8) & 0x40) {
+ session->gpsdata.used[session->gpsdata.satellites_used++] =
+ prn;
}
satcnt++;
}
session->gpsdata.satellites_visible = (int)satcnt;
/* that's all the information in this packet */
- mask = SATELLITE_SET | USED_SET;
- gpsd_report(LOG_DATA, "CSO 0x06: time=%.2f used=%d visible=%d mask={TIME|SATELLITE|USED}\n",
- session->newdata.time,
- session->gpsdata.satellites_used,
+ mask = SATELLITE_IS | USED_IS;
+ gpsd_report(LOG_DATA,
+ "CSO 0x06: time=%.2f used=%d visible=%d mask={TIME|SATELLITE|USED}\n",
+ session->newdata.time, session->gpsdata.satellites_used,
session->gpsdata.satellites_visible);
return mask;
- case 0x08: /* Measurement Data Output */
+ case 0x08: /* Measurement Data Output */
/* clock offset is a manufacturer diagnostic */
/* (int)getleuw(buf2, 8); clock offset, 29000..29850 ?? */
- /*@ ignore @*//*@ splint is confused @*/
- session->newdata.time =
- gpstime_to_unix((int)getleuw(buf2, 2), getleul(buf2, 4)*0.01) - session->context->leap_seconds;
+ /*@ ignore @*//*@ splint is confused @ */
+ session->newdata.time =
+ gpstime_to_unix((int)getleuw(buf2, 2),
+ getleul(buf2,
+ 4) * 0.01) -
+ session->context->leap_seconds;
/*@ end @*/
visible = (unsigned char)getub(buf2, 10);
/* FIXME: read full statellite status for each channel */
@@ -323,29 +337,31 @@ gps_mask_t evermore_parse(struct gps_device_t *session, unsigned char *buf, size
/* gpsd_report(LOG_PROG, "MDO 0x04: visible=%d\n", visible); */
gpsd_report(LOG_DATA, "MDO 0x04: time=%.2f mask={TIME}\n",
session->newdata.time);
- return TIME_SET;
+ return TIME_IS;
- case 0x20: /* LogConfig Info, could be used as a probe for EverMore GPS */
+ case 0x20: /* LogConfig Info, could be used as a probe for EverMore GPS */
gpsd_report(LOG_IO, "LogConfig EverMore packet, length %zd: %s\n",
- datalen, gpsd_hexdump_wrapper(buf2, datalen, LOG_IO));
- return ONLINE_SET;
+ datalen, gpsd_hexdump_wrapper(buf2, datalen, LOG_IO));
+ return ONLINE_IS;
- case 0x22: /* LogData */
+ case 0x22: /* LogData */
gpsd_report(LOG_IO, "LogData EverMore packet, length %zd: %s\n",
- datalen, gpsd_hexdump_wrapper(buf2, datalen, LOG_IO));
- return ONLINE_SET;
+ datalen, gpsd_hexdump_wrapper(buf2, datalen, LOG_IO));
+ return ONLINE_IS;
- case 0x38: /* ACK */
+ case 0x38: /* ACK */
gpsd_report(LOG_PROG, "EverMore command %02X ACK\n", getub(buf2, 2));
- return ONLINE_SET;
+ return ONLINE_IS;
default:
gpsd_report(LOG_WARN,
- "unknown EverMore packet EID 0x%02x, length %zd: %s\n", buf2[0],
- datalen, gpsd_hexdump_wrapper(buf2, datalen, LOG_IO));
+ "unknown EverMore packet EID 0x%02x, length %zd: %s\n",
+ buf2[0], datalen, gpsd_hexdump_wrapper(buf2, datalen,
+ LOG_IO));
return 0;
}
}
+
/*@ -charint @*/
static gps_mask_t evermore_parse_input(struct gps_device_t *session)
@@ -353,7 +369,8 @@ static gps_mask_t evermore_parse_input(struct gps_device_t *session)
gps_mask_t st;
if (session->packet.type == EVERMORE_PACKET) {
- st = evermore_parse(session, session->packet.outbuffer, session->packet.outbuflen);
+ st = evermore_parse(session, session->packet.outbuffer,
+ session->packet.outbuflen);
return st;
#ifdef NMEA_ENABLE
} else if (session->packet.type == NMEA_PACKET) {
@@ -365,46 +382,49 @@ static gps_mask_t evermore_parse_input(struct gps_device_t *session)
}
/*@ +charint -usedef -compdef @*/
-static ssize_t evermore_control_send(struct gps_device_t *session, char *buf, size_t len)
+static ssize_t evermore_control_send(struct gps_device_t *session, char *buf,
+ size_t len)
{
- unsigned int crc;
- size_t i;
- char *cp;
-
- /*@ +charint +ignoresigns @*/
- /* prepare a DLE-stuffed copy of the message */
- cp = session->msgbuf;
- *cp++ = 0x10; /* message starts with DLE STX */
- *cp++ = 0x02;
-
- session->msgbuflen = (size_t)(len + 2); /* len < 254 !! */
- *cp++ = (char)session->msgbuflen; /* message length */
- if (session->msgbuflen == 0x10) *cp++ = 0x10;
-
- /* payload */
- crc = 0;
- for (i = 0; i < len; i++) {
- *cp++ = buf[i];
- if (buf[i] == 0x10)
- *cp++ = 0x10;
- crc += buf[i];
- }
-
- crc &= 0xff;
-
- /* enter CRC after payload */
- *cp++ = crc;
- if (crc == 0x10)
- *cp++ = 0x10;
-
- *cp++ = 0x10; /* message ends with DLE ETX */
- *cp++ = 0x03;
-
- session->msgbuflen = (size_t)(cp - session->msgbuf);
- /*@ -charint -ignoresigns @*/
-
- return gpsd_write(session, session->msgbuf, session->msgbuflen);
+ unsigned int crc;
+ size_t i;
+ char *cp;
+
+ /*@ +charint +ignoresigns @*/
+ /* prepare a DLE-stuffed copy of the message */
+ cp = session->msgbuf;
+ *cp++ = 0x10; /* message starts with DLE STX */
+ *cp++ = 0x02;
+
+ session->msgbuflen = (size_t) (len + 2); /* len < 254 !! */
+ *cp++ = (char)session->msgbuflen; /* message length */
+ if (session->msgbuflen == 0x10)
+ *cp++ = 0x10;
+
+ /* payload */
+ crc = 0;
+ for (i = 0; i < len; i++) {
+ *cp++ = buf[i];
+ if (buf[i] == 0x10)
+ *cp++ = 0x10;
+ crc += buf[i];
+ }
+
+ crc &= 0xff;
+
+ /* enter CRC after payload */
+ *cp++ = crc;
+ if (crc == 0x10)
+ *cp++ = 0x10;
+
+ *cp++ = 0x10; /* message ends with DLE ETX */
+ *cp++ = 0x03;
+
+ session->msgbuflen = (size_t) (cp - session->msgbuf);
+ /*@ -charint -ignoresigns @*/
+
+ return gpsd_write(session, session->msgbuf, session->msgbuflen);
}
+
/*@ -charint +usedef +compdef @*/
static bool evermore_protocol(struct gps_device_t *session, int protocol)
@@ -412,16 +432,19 @@ static bool evermore_protocol(struct gps_device_t *session, int protocol)
/*@ +charint */
char tmp8;
char evrm_protocol_config[] = {
- (char)0x84, /* 0: msg ID, Protocol Configuration */
- (char)0x00, /* 1: mode; EverMore binary(0), NMEA(1) */
- (char)0x00, /* 2: reserved */
- (char)0x00, /* 3: reserved */
+ (char)0x84, /* 0: msg ID, Protocol Configuration */
+ (char)0x00, /* 1: mode; EverMore binary(0), NMEA(1) */
+ (char)0x00, /* 2: reserved */
+ (char)0x00, /* 3: reserved */
};
/*@ -charint */
gpsd_report(LOG_PROG, "evermore_protocol(%d)\n", protocol);
- /*@i1@*/tmp8 = (protocol != 0) ? 1 : 0; /* NMEA : binary */
+ /*@i1@*/ tmp8 = (protocol != 0) ? 1 : 0;
+ /* NMEA : binary */
evrm_protocol_config[1] = tmp8;
- return (evermore_control_send(session, evrm_protocol_config, sizeof(evrm_protocol_config)) != -1);
+ return (evermore_control_send
+ (session, evrm_protocol_config,
+ sizeof(evrm_protocol_config)) != -1);
}
static bool evermore_nmea_config(struct gps_device_t *session, int mode)
@@ -429,43 +452,47 @@ static bool evermore_nmea_config(struct gps_device_t *session, int mode)
/* mode = 1 : gpsd best */
/* mode = 2 : EverMore search, activate PEMT101 message */
{
- char tmp8;
+ unsigned char tmp8;
/*@ +charint */
- char evrm_nmeaout_config[] = {
- 0x8e, /* 0: msg ID, NMEA Message Control */
- 0xff, /* 1: NMEA sentence bitmask, GGA(0), GLL(1), GSA(2), GSV(3), ... */
- 0x01, /* 2: nmea checksum no(0), yes(1) */
- 1, /* 3: GPGGA, interval 0-255s */
- 0, /* 4: GPGLL, interval 0-255s */
- 1, /* 5: GPGSA, interval 0-255s */
- 1, /* 6: GPGSV, interval 0-255s */
- 1, /* 7: GPRMC, interval 0-255s */
- 0, /* 8: GPVTG, interval 0-255s */
- 0, /* 9: PEMT,101, interval 0-255s */
- 0, 0, 0, 0, 0, 0, /* 10-15: reserved */
+ unsigned char evrm_nmeaout_config[] = {
+ 0x8e, /* 0: msg ID, NMEA Message Control */
+ 0xff, /* 1: NMEA sentence bitmask, GGA(0), GLL(1), GSA(2), GSV(3), ... */
+ 0x01, /* 2: nmea checksum no(0), yes(1) */
+ 1, /* 3: GPGGA, interval 0-255s */
+ 0, /* 4: GPGLL, interval 0-255s */
+ 1, /* 5: GPGSA, interval 0-255s */
+ 1, /* 6: GPGSV, interval 0-255s */
+ 1, /* 7: GPRMC, interval 0-255s */
+ 0, /* 8: GPVTG, interval 0-255s */
+ 0, /* 9: PEMT,101, interval 0-255s */
+ 0, 0, 0, 0, 0, 0, /* 10-15: reserved */
};
/*@ -charint */
gpsd_report(LOG_PROG, "evermore_nmea_config(%d)\n", mode);
- /*@i1@*/tmp8 = (mode == 1) ? 5 : 1; /* NMEA GPGSV, gpsd */
- evrm_nmeaout_config[6] = tmp8; /* GPGSV, 1s or 5s */
- /*@i1@*/tmp8 = (mode == 2) ? 1 : 0; /* NMEA PEMT101 */
- evrm_nmeaout_config[9] = tmp8; /* PEMT101, 1s or 0s */
- return (evermore_control_send(session, evrm_nmeaout_config, sizeof(evrm_nmeaout_config)) != -1);
+ /*@i1@*/ tmp8 = (mode == 1) ? 5 : 1;
+ /* NMEA GPGSV, gpsd */
+ evrm_nmeaout_config[6] = tmp8; /* GPGSV, 1s or 5s */
+ /*@i1@*/ tmp8 = (mode == 2) ? 1 : 0;
+ /* NMEA PEMT101 */
+ evrm_nmeaout_config[9] = tmp8; /* PEMT101, 1s or 0s */
+ return (evermore_control_send(session, (char *)evrm_nmeaout_config,
+ sizeof(evrm_nmeaout_config)) != -1);
}
static void evermore_mode(struct gps_device_t *session, int mode)
{
- gpsd_report(LOG_PROG, "evermore_mode(%d), %d\n", mode, session->back_to_nmea ? 1 : 0);
+ gpsd_report(LOG_PROG, "evermore_mode(%d), %d\n", mode,
+ session->back_to_nmea ? 1 : 0);
if (mode == MODE_NMEA) {
- /* NMEA */
- (void) evermore_protocol(session, 1);
- session->gpsdata.dev.driver_mode = MODE_NMEA;
- (void) evermore_nmea_config(session, 1); /* configure NMEA messages for gpsd */
+ /* NMEA */
+ (void)evermore_protocol(session, 1);
+ session->gpsdata.dev.driver_mode = MODE_NMEA;
+ (void)evermore_nmea_config(session, 1); /* configure NMEA messages for gpsd */
} else {
- /* binary */
- (void) evermore_protocol(session, 0);
- session->back_to_nmea = false;
- session->gpsdata.dev.driver_mode = MODE_BINARY;
+ /* binary */
+ (void)evermore_protocol(session, 0);
+ session->back_to_nmea = false;
+ session->gpsdata.dev.driver_mode = MODE_BINARY;
}
}
@@ -476,42 +503,54 @@ static void evermore_event_hook(struct gps_device_t *session, event_t event)
* Experiment to see if the holds its settings through a close.
*/
if (event == event_identified || event == event_reactivate) {
- if (session->packet.type == NMEA_PACKET) {
- (void) evermore_nmea_config(session, 1); /* configure NMEA messages for gpsd (GPGSV every 5s) */
- }
- (void) evermore_mode(session, 1); /* switch GPS to binary mode */
- session->back_to_nmea = true;
+ if (session->packet.type == NMEA_PACKET) {
+ (void)evermore_nmea_config(session, 1); /* configure NMEA messages for gpsd (GPGSV every 5s) */
+ }
+ (void)evermore_mode(session, 1); /* switch GPS to binary mode */
+ session->back_to_nmea = true;
} else if (event == event_deactivate) {
- (void) evermore_nmea_config(session, 0); /* configure NMEA messages to default */
+ (void)evermore_nmea_config(session, 0); /* configure NMEA messages to default */
}
}
#ifdef ALLOW_RECONFIGURE
-static bool evermore_speed(struct gps_device_t *session,
+static bool evermore_speed(struct gps_device_t *session,
speed_t speed, char parity, int stopbits)
{
/*@ -type @*/
- gpsd_report(LOG_PROG, "evermore_speed(%u%c%d)\n", speed, parity, stopbits);
+ gpsd_report(LOG_PROG, "evermore_speed(%u%c%d)\n", speed, parity,
+ stopbits);
/* parity and stopbit switching aren't available on this chip */
- if (parity!=session->gpsdata.dev.parity || stopbits!=(int)session->gpsdata.dev.parity) {
+ if (parity != session->gpsdata.dev.parity
+ || stopbits != (int)session->gpsdata.dev.parity) {
return false;
} else {
unsigned char tmp8;
- char msg[] = {
- 0x89, /* 0: msg ID, Serial Port Configuration */
- 0x01, /* 1: bit 0 cfg for main serial, bit 1 cfg for DGPS port */
- 0x00, /* 2: baud rate for main serial; 4800(0), 9600(1), 19200(2), 38400(3) */
- 0x00, /* 3: baud rate for DGPS serial port; 4800(0), 9600(1), etc */
+ unsigned char msg[] = {
+ 0x89, /* 0: msg ID, Serial Port Configuration */
+ 0x01, /* 1: bit 0 cfg for main serial, bit 1 cfg for DGPS port */
+ 0x00, /* 2: baud rate for main serial; 4800(0), 9600(1), 19200(2), 38400(3) */
+ 0x00, /* 3: baud rate for DGPS serial port; 4800(0), 9600(1), etc */
};
switch (speed) {
- case 4800: tmp8 = 0; break;
- case 9600: tmp8 = 1; break;
- case 19200: tmp8 = 2; break;
- case 38400: tmp8 = 3; break;
- default: return false;
+ case 4800:
+ tmp8 = 0;
+ break;
+ case 9600:
+ tmp8 = 1;
+ break;
+ case 19200:
+ tmp8 = 2;
+ break;
+ case 38400:
+ tmp8 = 3;
+ break;
+ default:
+ return false;
}
msg[2] = tmp8;
- return (evermore_control_send(session, msg, sizeof(msg)) != -1);
+ return (evermore_control_send(session, (char *)msg, sizeof(msg)) !=
+ -1);
}
/*@ +type @*/
}
@@ -520,19 +559,20 @@ static bool evermore_rate_switcher(struct gps_device_t *session, double rate)
/* change the sample rate of the GPS */
{
/*@ +charint @*/
- char evrm_rate_config[] = {
- 0x84, /* 1: msg ID, Operating Mode Configuration */
- 0x02, /* 2: normal mode with 1PPS */
- 0x00, /* 3: navigation update rate */
- 0x00, /* 4: RF/GPSBBP On Time */
+ unsigned char evrm_rate_config[] = {
+ 0x84, /* 1: msg ID, Operating Mode Configuration */
+ 0x02, /* 2: normal mode with 1PPS */
+ 0x00, /* 3: navigation update rate */
+ 0x00, /* 4: RF/GPSBBP On Time */
};
if (rate < 1 || rate > 10) {
gpsd_report(LOG_ERROR, "valid rate range is 1-10.\n");
return false;
} else {
- evrm_rate_config[2] = (char)trunc(rate);
- return (evermore_control_send(session, evrm_rate_config, sizeof(evrm_rate_config)) != -1);
+ evrm_rate_config[2] = (unsigned char)trunc(rate);
+ return (evermore_control_send(session, (char *)evrm_rate_config,
+ sizeof(evrm_rate_config)) != -1);
}
/*@ -charint @*/
}
@@ -540,6 +580,7 @@ static bool evermore_rate_switcher(struct gps_device_t *session, double rate)
/* this is everything we export */
+/* *INDENT-OFF* */
const struct gps_type_t evermore_binary =
{
.type_name = "EverMore binary", /* full name of type */
@@ -560,5 +601,9 @@ const struct gps_type_t evermore_binary =
#ifdef ALLOW_CONTROLSEND
.control_send = evermore_control_send, /* how to send a control string */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL, /* no method for NTP fudge factor */
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* defined(EVERMORE_ENABLE) && defined(BINARY_ENABLE) */
diff --git a/driver_garmin.c b/driver_garmin.c
index d3b2a220..b53d61e9 100644
--- a/driver_garmin.c
+++ b/driver_garmin.c
@@ -79,7 +79,7 @@
#define __USE_POSIX199309 1
#include <sys/types.h>
-#include <time.h> // for nanosleep()
+#include <time.h> // for nanosleep()
#include <stdio.h>
#include <stdlib.h>
@@ -168,118 +168,128 @@
#pragma pack(1)
// This is the data format of the satellite data from the garmin USB
-typedef struct {
- uint8_t svid;
- int16_t snr; // 0 - 0xffff
- uint8_t elev;
- uint16_t azmth;
- uint8_t status; // bit 0, has ephemeris, 1, has diff correction
- // bit 2 used in solution
- // bit 3??
+typedef struct
+{
+ uint8_t svid;
+ int16_t snr; // 0 - 0xffff
+ uint8_t elev;
+ uint16_t azmth;
+ uint8_t status; // bit 0, has ephemeris, 1, has diff correction
+ // bit 2 used in solution
+ // bit 3??
} cpo_sat_data;
/* Garmin D800_Pvt_Datetype_Type */
/* packet type: GARMIN_PKTID_PVT_DATA 52 */
/* This is the data format of the position data from the garmin USB */
-typedef struct {
- float alt; /* altitude above WGS 84 (meters) */
- float epe; /* estimated position error, 2 sigma (meters) */
- float eph; /* epe, but horizontal only (meters) */
- float epv; /* epe but vertical only (meters ) */
- int16_t fix; /* 0 - failed integrity check
- * 1 - invalid or unavailable fix
- * 2 - 2D
- * 3 - 3D
- * 4 - 2D Diff
- * 5 - 3D Diff
- */
- double gps_tow; /* gps time os week (seconds) */
- double lat; /* ->latitude (radians) */
- double lon; /* ->longitude (radians) */
- float lon_vel; /* velocity east (meters/second) */
- float lat_vel; /* velocity north (meters/second) */
- float alt_vel; /* velocity up (meters/sec) */
- // Garmin GPS25 uses pkt_id 0x28 and does not output the
- // next 3 items
- float msl_hght; /* height of WGS 84 above MSL (meters) */
- int16_t leap_sec; /* diff between GPS and UTC (seconds) */
- int32_t grmn_days;
+typedef struct
+{
+ float alt; /* altitude above WGS 84 (meters) */
+ float epe; /* estimated position error, 2 sigma (meters) */
+ float eph; /* epe, but horizontal only (meters) */
+ float epv; /* epe but vertical only (meters ) */
+ int16_t fix; /* 0 - failed integrity check
+ * 1 - invalid or unavailable fix
+ * 2 - 2D
+ * 3 - 3D
+ * 4 - 2D Diff
+ * 5 - 3D Diff
+ */
+ double gps_tow; /* gps time os week (seconds) */
+ double lat; /* ->latitude (radians) */
+ double lon; /* ->longitude (radians) */
+ float lon_vel; /* velocity east (meters/second) */
+ float lat_vel; /* velocity north (meters/second) */
+ float alt_vel; /* velocity up (meters/sec) */
+ // Garmin GPS25 uses pkt_id 0x28 and does not output the
+ // next 3 items
+ float msl_hght; /* height of WGS 84 above MSL (meters) */
+ int16_t leap_sec; /* diff between GPS and UTC (seconds) */
+ int32_t grmn_days;
} cpo_pvt_data;
-typedef struct {
- uint32_t cycles;
- double pr;
- uint16_t phase;
- int8_t slp_dtct;
- uint8_t snr_dbhz;
- uint8_t svid;
- int8_t valid;
+typedef struct
+{
+ uint32_t cycles;
+ double pr;
+ uint16_t phase;
+ int8_t slp_dtct;
+ uint8_t snr_dbhz;
+ uint8_t svid;
+ int8_t valid;
} cpo_rcv_sv_data;
/* packet type: GARMIN_PKTID_RMD_DATA 53 */
/* seems identical to the packet id 0x29 from the Garmin GPS 25 */
-typedef struct {
- double rcvr_tow;
- int16_t rcvr_wn;
- cpo_rcv_sv_data sv[GARMIN_CHANNELS];
+typedef struct
+{
+ double rcvr_tow;
+ int16_t rcvr_wn;
+ cpo_rcv_sv_data sv[GARMIN_CHANNELS];
} cpo_rcv_data;
// This is the packet format to/from the Garmin USB
-typedef struct {
- uint8_t mPacketType;
- uint8_t mReserved1;
+typedef struct
+{
+ uint8_t mPacketType;
+ uint8_t mReserved1;
uint16_t mReserved2;
uint16_t mPacketId;
uint16_t mReserved3;
- uint32_t mDataSize;
- union {
- int8_t chars[MAX_BUFFER_SIZE];
- uint8_t uchars[MAX_BUFFER_SIZE];
- cpo_pvt_data pvt;
- cpo_sat_data sats;
+ uint32_t mDataSize;
+ union
+ {
+ int8_t chars[MAX_BUFFER_SIZE];
+ uint8_t uchars[MAX_BUFFER_SIZE];
+ cpo_pvt_data pvt;
+ cpo_sat_data sats;
} mData;
} Packet_t;
// useful funcs to read/write ints
// floats and doubles are Intel order only...
-static inline void set_int16(uint8_t *buf, uint32_t value)
+static inline void set_int16(uint8_t * buf, uint32_t value)
{
- buf[0] = (uint8_t)(0x0FF & value);
- buf[1] = (uint8_t)(0x0FF & (value >> 8));
+ buf[0] = (uint8_t) (0x0FF & value);
+ buf[1] = (uint8_t) (0x0FF & (value >> 8));
}
-static inline void set_int32(uint8_t *buf, uint32_t value)
+static inline void set_int32(uint8_t * buf, uint32_t value)
{
- buf[0] = (uint8_t)(0x0FF & value);
- buf[1] = (uint8_t)(0x0FF & (value >> 8));
- buf[2] = (uint8_t)(0x0FF & (value >> 16));
- buf[3] = (uint8_t)(0x0FF & (value >> 24));
+ buf[0] = (uint8_t) (0x0FF & value);
+ buf[1] = (uint8_t) (0x0FF & (value >> 8));
+ buf[2] = (uint8_t) (0x0FF & (value >> 16));
+ buf[3] = (uint8_t) (0x0FF & (value >> 24));
}
-static inline uint16_t get_uint16(const uint8_t *buf)
+static inline uint16_t get_uint16(const uint8_t * buf)
{
- return (uint16_t)(0xFF & buf[0])
- | ((uint16_t)(0xFF & buf[1]) << 8);
+ return (uint16_t) (0xFF & buf[0])
+ | ((uint16_t) (0xFF & buf[1]) << 8);
}
-static inline uint32_t get_int32(const uint8_t *buf)
+static inline uint32_t get_int32(const uint8_t * buf)
{
- return (uint32_t)(0xFF & buf[0])
- | ((uint32_t)(0xFF & buf[1]) << 8)
- | ((uint32_t)(0xFF & buf[2]) << 16)
- | ((uint32_t)(0xFF & buf[3]) << 24);
+ return (uint32_t) (0xFF & buf[0])
+ | ((uint32_t) (0xFF & buf[1]) << 8)
+ | ((uint32_t) (0xFF & buf[2]) << 16)
+ | ((uint32_t) (0xFF & buf[3]) << 24);
}
// convert radians to degrees
-static inline double radtodeg( double rad) {
- return (double)(rad * RAD_2_DEG );
+static inline double radtodeg(double rad)
+{
+ return (double)(rad * RAD_2_DEG);
}
-static gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id, int pkt_len, unsigned char *buf );
-static gps_mask_t PrintUSBPacket(struct gps_device_t *session, Packet_t *pkt );
+static gps_mask_t PrintSERPacket(struct gps_device_t *session,
+ unsigned char pkt_id, int pkt_len,
+ unsigned char *buf);
+static gps_mask_t PrintUSBPacket(struct gps_device_t *session,
+ Packet_t * pkt);
-gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id
- , int pkt_len, unsigned char *buf )
+gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id,
+ int pkt_len, unsigned char *buf)
{
gps_mask_t mask = 0;
@@ -296,21 +306,22 @@ gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id
cpo_pvt_data *pvt = NULL;
cpo_rcv_data *rmd = NULL;
- gpsd_report(LOG_IO, "PrintSERPacket(, %#02x, %#02x, )\n", pkt_id, pkt_len);
+ gpsd_report(LOG_IO, "Garmin: PrintSERPacket(, %#02x, %#02x, )\n", pkt_id,
+ pkt_len);
session->cycle_end_reliable = true;
- switch( pkt_id ) {
+ switch (pkt_id) {
case ACK:
- gpsd_report(LOG_PROG, "ACK\n");
+ gpsd_report(LOG_PROG, "Garmin: ACK\n");
break;
case NAK:
- gpsd_report(LOG_PROG, "NAK\n");
+ gpsd_report(LOG_PROG, "Garmin: NAK\n");
break;
case GARMIN_PKTID_L001_COMMAND_DATA:
- prod_id = get_uint16((uint8_t *)buf);
+ prod_id = get_uint16((uint8_t *) buf);
/*@ -branchstate @*/
- switch ( prod_id ) {
+ switch (prod_id) {
case CMND_ABORT:
msg = "Abort current xfer";
break;
@@ -325,68 +336,67 @@ gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id
break;
default:
(void)snprintf(msg_buf, sizeof(msg_buf), "Unknown: %u",
- (unsigned int)prod_id);
+ (unsigned int)prod_id);
msg = msg_buf;
break;
}
/*@ +branchstate @*/
- gpsd_report(LOG_PROG, "Appl, Command Data: %s\n", msg);
+ gpsd_report(LOG_PROG, "Garmin: Appl, Command Data: %s\n", msg);
break;
case GARMIN_PKTID_PRODUCT_RQST:
- gpsd_report(LOG_PROG, "Appl, Product Data req\n");
+ gpsd_report(LOG_PROG, "Garmin: Appl, Product Data req\n");
break;
case GARMIN_PKTID_PRODUCT_DATA:
- prod_id = get_uint16((uint8_t *)buf);
- ver = get_uint16((uint8_t *)&buf[2]);
+ prod_id = get_uint16((uint8_t *) buf);
+ ver = get_uint16((uint8_t *) & buf[2]);
maj_ver = (int)(ver / 100);
min_ver = (int)(ver - (maj_ver * 100));
- gpsd_report(LOG_PROG, "Appl, Product Data, sz: %d\n", pkt_len);
+ gpsd_report(LOG_PROG, "Garmin: Appl, Product Data, sz: %d\n",
+ pkt_len);
(void)snprintf(session->subtype, sizeof(session->subtype),
- "%d: %d.%02d"
- , (int)prod_id, maj_ver, min_ver);
- gpsd_report(LOG_INF, "Garmin Product ID: %d, SoftVer: %d.%02d\n"
- , prod_id, maj_ver, min_ver);
- gpsd_report(LOG_INF, "Garmin Product Desc: %s\n"
- , &buf[4]);
- mask |= DEVICEID_SET;
- gpsd_report(LOG_DATA, "PRODUCT_DATA: subtype=%s mask=%s\n",
+ "%d: %d.%02d", (int)prod_id, maj_ver, min_ver);
+ gpsd_report(LOG_INF, "Garmin: Product ID: %d, SoftVer: %d.%02d\n",
+ prod_id, maj_ver, min_ver);
+ gpsd_report(LOG_INF, "Garmin: Product Desc: %s\n", &buf[4]);
+ mask |= DEVICEID_IS;
+ gpsd_report(LOG_DATA, "Garmin: PRODUCT_DATA: subtype=%s mask=%s\n",
session->subtype, gpsd_maskdump(mask));
break;
case GARMIN_PKTID_PVT_DATA:
- gpsd_report(LOG_PROG, "Appl, PVT Data Sz: %d\n", pkt_len);
+ gpsd_report(LOG_PROG, "Garmin: Appl, PVT Data Sz: %d\n", pkt_len);
- pvt = (cpo_pvt_data*) buf;
+ pvt = (cpo_pvt_data *) buf;
// 631065600, unix seconds for 31 Dec 1989 Zulu
- time_l = (time_t)(631065600 + (pvt->grmn_days * 86400));
+ time_l = (time_t) (631065600 + (pvt->grmn_days * 86400));
time_l -= pvt->leap_sec;
session->context->leap_seconds = pvt->leap_sec;
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);
- session->newdata.time
- = (double)time_l;
- gpsd_report(LOG_PROG, "time_l: %ld\n", (long int)time_l);
+ session->newdata.time = (double)time_l;
+ gpsd_report(LOG_PROG, "Garmin: time_l: %ld\n", (long int)time_l);
session->newdata.latitude = radtodeg(pvt->lat);
/* sanity check the lat */
- if ( 90.0 < session->newdata.latitude ) {
- session->newdata.latitude = 90.0;
- gpsd_report(LOG_INF, "ERROR: Latitude overrange\n");
- } else if ( -90.0 > session->newdata.latitude ) {
- session->newdata.latitude = -90.0;
- gpsd_report(LOG_INF, "ERROR: Latitude negative overrange\n");
+ if (90.0 < session->newdata.latitude) {
+ session->newdata.latitude = 90.0;
+ gpsd_report(LOG_INF, "Garmin: ERROR: Latitude overrange\n");
+ } else if (-90.0 > session->newdata.latitude) {
+ session->newdata.latitude = -90.0;
+ gpsd_report(LOG_INF,
+ "Garmin: ERROR: Latitude negative overrange\n");
}
session->newdata.longitude = radtodeg(pvt->lon);
/* sanity check the lon */
- if ( 180.0 < session->newdata.longitude ) {
- session->newdata.longitude = 180.0;
- gpsd_report(LOG_INF, "ERROR: Longitude overrange\n");
- } else if ( -180.0 > session->newdata.longitude ) {
- session->newdata.longitude = -180.0;
- gpsd_report(LOG_INF, "ERROR: Longitude negative overrange\n");
+ if (180.0 < session->newdata.longitude) {
+ session->newdata.longitude = 180.0;
+ gpsd_report(LOG_INF, "Garmin: ERROR: Longitude overrange\n");
+ } else if (-180.0 > session->newdata.longitude) {
+ session->newdata.longitude = -180.0;
+ gpsd_report(LOG_INF,
+ "Garmin: ERROR: Longitude negative overrange\n");
}
-
// altitude over WGS84 converted to MSL
session->newdata.altitude = pvt->alt + pvt->msl_hght;
@@ -398,10 +408,11 @@ gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id
// We follow the advice at <http://gpsinformation.net/main/errors.htm>.
// If this assumption changes here, it should also change in
// nmea_parse.c where we analyze PGRME.
- session->gpsdata.epe = pvt->epe * (GPSD_CONFIDENCE/CEP50_SIGMA);
+ session->gpsdata.epe = pvt->epe * (GPSD_CONFIDENCE / CEP50_SIGMA);
/* eph is a circular error, sqrt(epx**2 + epy**2) */
- session->newdata.epx = session->newdata.epy = pvt->eph * (1/sqrt(2)) * (GPSD_CONFIDENCE/CEP50_SIGMA);
- session->newdata.epv = pvt->epv * (GPSD_CONFIDENCE/CEP50_SIGMA);
+ session->newdata.epx = session->newdata.epy =
+ pvt->eph * (1 / sqrt(2)) * (GPSD_CONFIDENCE / CEP50_SIGMA);
+ session->newdata.epv = pvt->epv * (GPSD_CONFIDENCE / CEP50_SIGMA);
// convert lat/lon to directionless speed
session->newdata.speed = hypot(pvt->lon_vel, pvt->lat_vel);
@@ -415,7 +426,7 @@ gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id
}
session->newdata.track = radtodeg(track);
- switch ( pvt->fix) {
+ switch (pvt->fix) {
case 0:
case 1:
default:
@@ -444,44 +455,35 @@ gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id
session->newdata.mode = MODE_3D;
break;
}
-#ifdef NTPSHM_ENABLE
- if (session->context->enable_ntpshm
- && session->newdata.mode > MODE_NO_FIX) {
- // Garmin SerBin fudge 0.430 valid at 4800bps
- (void) ntpshm_put(session, session->newdata.time, 0.430);
- }
-#endif /* NTPSHM_ENABLE */
- gpsd_report(LOG_PROG, "Appl, mode %d, status %d\n"
- , session->newdata.mode
- , session->gpsdata.status);
-
- gpsd_report(LOG_INF, "UTC Time: %lf\n", session->newdata.time);
- gpsd_report(LOG_INF
- , "Geoid Separation (MSL-WGS84): from garmin %lf, calculated %lf\n"
- , -pvt->msl_hght
- , wgs84_separation(session->newdata.latitude
- , session->newdata.longitude));
-
- gpsd_report(LOG_INF, "Alt: %.3f, Epe: %.3f, Eph: %.3f, Epv: %.3f, Fix: %d, Gps_tow: %f, Lat: %.3f, Lon: %.3f, LonVel: %.3f, LatVel: %.3f, AltVel: %.3f, MslHgt: %.3f, Leap: %d, GarminDays: %d\n"
- , pvt->alt
- , pvt->epe
- , pvt->eph
- , pvt->epv
- , pvt->fix
- , pvt->gps_tow
- , session->newdata.latitude
- , session->newdata.longitude
- , pvt->lon_vel
- , pvt->lat_vel
- , pvt->alt_vel
- , pvt->msl_hght
- , pvt->leap_sec
- , pvt->grmn_days);
-
- mask |= TIME_SET | LATLON_SET | ALTITUDE_SET | STATUS_SET | MODE_SET | SPEED_SET | TRACK_SET | CLIMB_SET | HERR_SET | VERR_SET | PERR_SET | CLEAR_SET | REPORT_SET;
+ gpsd_report(LOG_PROG, "Garmin: Appl, mode %d, status %d\n",
+ session->newdata.mode, session->gpsdata.status);
+
+ gpsd_report(LOG_INF, "Garmin: UTC Time: %lf\n",
+ session->newdata.time);
+ gpsd_report(LOG_INF,
+ "Garmin: Geoid Separation (MSL-WGS84): from garmin %lf, calculated %lf\n",
+ -pvt->msl_hght,
+ wgs84_separation(session->newdata.latitude,
+ session->newdata.longitude));
+
+ gpsd_report(LOG_INF,
+ "Garmin: Alt: %.3f, Epe: %.3f, Eph: %.3f, Epv: %.3f, Fix: %d, Gps_tow: %f, Lat: %.3f, Lon: %.3f, LonVel: %.3f, LatVel: %.3f, AltVel: %.3f, MslHgt: %.3f, Leap: %d, GarminDays: %d\n",
+ pvt->alt, pvt->epe, pvt->eph, pvt->epv, pvt->fix,
+ pvt->gps_tow, session->newdata.latitude,
+ session->newdata.longitude, pvt->lon_vel, pvt->lat_vel,
+ pvt->alt_vel, pvt->msl_hght, pvt->leap_sec,
+ pvt->grmn_days);
+
+ if (session->newdata.mode > MODE_NO_FIX) {
+ /* data only valid with a fix */
+ mask |=
+ TIME_IS | LATLON_IS | ALTITUDE_IS | STATUS_IS | MODE_IS |
+ SPEED_IS | TRACK_IS | CLIMB_IS | HERR_IS | VERR_IS | PERR_IS |
+ CLEAR_IS | REPORT_IS;
+ }
gpsd_report(LOG_DATA,
- "PVT_DATA: time=%.2f, lat=%.2f lon=%.2f "
+ "Garmin: PVT_DATA: time=%.2f, lat=%.2f lon=%.2f "
"speed=%.2f track=%.2f climb=%.2f "
"epx=%.2f epy=%.2f epv=%.2f "
"mode=%d status=%d mask=%s\n",
@@ -495,50 +497,47 @@ gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id
session->newdata.epy,
session->newdata.epv,
session->newdata.mode,
- session->gpsdata.status,
- gpsd_maskdump(mask));
+ session->gpsdata.status, gpsd_maskdump(mask));
break;
case GARMIN_PKTID_RMD_DATA:
case GARMIN_PKTID_RMD41_DATA:
rmd = (cpo_rcv_data *) buf;
- gpsd_report(LOG_IO, "PVT RMD Data Sz: %d\n", pkt_len);
- gpsd_report(LOG_PROG, "PVT RMD rcvr_tow: %f, rcvr_wn: %d\n",
+ gpsd_report(LOG_IO, "Garmin: PVT RMD Data Sz: %d\n", pkt_len);
+ gpsd_report(LOG_PROG, "Garmin: PVT RMD rcvr_tow: %f, rcvr_wn: %d\n",
rmd->rcvr_tow, rmd->rcvr_wn);
- for ( i = 0 ; i < GARMIN_CHANNELS ; i++ ) {
+ for (i = 0; i < GARMIN_CHANNELS; i++) {
gpsd_report(LOG_INF,
- "PVT RMD Sat: %3u, cycles: %9u, pr: %16.6f, "
+ "Garmin: PVT RMD Sat: %3u, cycles: %9u, pr: %16.6f, "
"phase: %7.3f, slp_dtct: %3s, snr: %3u, Valid: %3s\n",
rmd->sv[i].svid + 1, rmd->sv[i].cycles, rmd->sv[i].pr,
- (rmd->sv[i].phase * 360.0)/2048.0,
- rmd->sv[i].slp_dtct!='\0' ? "Yes" : "No",
+ (rmd->sv[i].phase * 360.0) / 2048.0,
+ rmd->sv[i].slp_dtct != '\0' ? "Yes" : "No",
rmd->sv[i].snr_dbhz,
- rmd->sv[i].valid!='\0' ? "Yes" : "No");
+ rmd->sv[i].valid != '\0' ? "Yes" : "No");
}
break;
case GARMIN_PKTID_SAT_DATA:
- gpsd_report(LOG_PROG, "SAT Data Sz: %d\n", pkt_len);
- sats = (cpo_sat_data *)buf;
+ gpsd_report(LOG_PROG, "Garmin: SAT Data Sz: %d\n", pkt_len);
+ sats = (cpo_sat_data *) buf;
session->gpsdata.satellites_used = 0;
- memset(session->gpsdata.used,0,sizeof(session->gpsdata.used));
+ memset(session->gpsdata.used, 0, sizeof(session->gpsdata.used));
gpsd_zero_satellites(&session->gpsdata);
- for ( i = 0, j = 0 ; i < GARMIN_CHANNELS ; i++, sats++ ) {
- gpsd_report(LOG_INF," Sat %3d, snr: %5d, elev: %2d, Azmth: %3d, Stat: %x\n"
- , sats->svid
- , sats->snr
- , sats->elev
- , sats->azmth
- , sats->status);
-
- if ( 255 == (int)sats->svid ) {
+ for (i = 0, j = 0; i < GARMIN_CHANNELS; i++, sats++) {
+ gpsd_report(LOG_INF,
+ "Garmin: Sat %3d, snr: %5d, elev: %2d, Azmth: %3d, Stat: %x\n",
+ sats->svid, sats->snr, sats->elev, sats->azmth,
+ sats->status);
+
+ if (255 == (int)sats->svid) {
// Garmin uses 255 for empty
// gpsd uses 0 for empty
continue;
}
- session->gpsdata.PRN[j] = (int)sats->svid;
- session->gpsdata.azimuth[j] = (int)sats->azmth;
+ session->gpsdata.PRN[j] = (int)sats->svid;
+ session->gpsdata.azimuth[j] = (int)sats->azmth;
session->gpsdata.elevation[j] = (int)sats->elev;
// Garmin does not document this. snr is in dB*100
// Known, but not seen satellites have a dB value of -1*100
@@ -549,7 +548,7 @@ gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id
// FIXME: Garmin documents this, but Daniel Dorau
// <daniel.dorau@gmx.de> says the behavior on his GPSMap60CSX
// doesn't match it.
- if ( (uint8_t)0 != (sats->status & 4 ) ) {
+ if ((uint8_t) 0 != (sats->status & 4)) {
// used in solution?
session->gpsdata.used[session->gpsdata.satellites_used++]
= (int)sats->svid;
@@ -559,36 +558,39 @@ gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id
}
session->gpsdata.skyview_time = NAN;
- mask |= SATELLITE_SET | USED_SET;
+ mask |= SATELLITE_IS | USED_IS;
gpsd_report(LOG_DATA,
- "SAT_DATA: visible=%d used=%d mask=%s\n",
+ "Garmin: SAT_DATA: visible=%d used=%d mask=%s\n",
session->gpsdata.satellites_visible,
- session->gpsdata.satellites_used,
- gpsd_maskdump(mask));
+ session->gpsdata.satellites_used, gpsd_maskdump(mask));
break;
case GARMIN_PKTID_PROTOCOL_ARRAY:
// this packet is never requested, it just comes, in some case
// after a GARMIN_PKTID_PRODUCT_RQST
- gpsd_report(LOG_INF, "Appl, Product Capability, sz: %d\n", pkt_len);
- for ( i = 0; i < pkt_len ; i += 3 ) {
- gpsd_report(LOG_INF, " %c%03d\n", buf[i], get_uint16((uint8_t *)&buf[i+1] ) );
+ gpsd_report(LOG_INF, "Garmin: Appl, Product Capability, sz: %d\n",
+ pkt_len);
+ for (i = 0; i < pkt_len; i += 3) {
+ gpsd_report(LOG_INF, "Garmin: %c%03d\n", buf[i],
+ get_uint16((uint8_t *) & buf[i + 1]));
}
break;
default:
- gpsd_report(LOG_WARN, "Unknown packet id: %#02x, Sz: %#02x, pkt:%s\n",
- pkt_id, pkt_len,
- gpsd_hexdump_wrapper(buf, (size_t)pkt_len, LOG_WARN));
+ gpsd_report(LOG_WARN,
+ "Garmin: Unknown packet id: %#02x, Sz: %#02x, pkt:%s\n",
+ pkt_id, pkt_len, gpsd_hexdump_wrapper(buf,
+ (size_t) pkt_len,
+ LOG_WARN));
break;
}
- gpsd_report(LOG_IO, "PrintSERPacket(, %#02x, %#02x, ) = %#02x\n",
- pkt_id, pkt_len, mask);
+ gpsd_report(LOG_IO, "Garmin: PrintSERPacket(, %#02x, %#02x, ) = %s\n",
+ pkt_id, pkt_len, gpsd_maskdump(mask));
return mask;
}
/*@ -branchstate @*/
// For debugging, decodes and prints some known packets.
-static gps_mask_t PrintUSBPacket(struct gps_device_t *session, Packet_t *pkt)
+static gps_mask_t PrintUSBPacket(struct gps_device_t *session, Packet_t * pkt)
{
gps_mask_t mask = 0;
int maj_ver;
@@ -597,48 +599,46 @@ static gps_mask_t PrintUSBPacket(struct gps_device_t *session, Packet_t *pkt)
uint16_t prod_id = 0;
uint32_t veri = 0;
uint32_t serial;
- uint32_t mDataSize = get_int32( (uint8_t*)&pkt->mDataSize);
+ uint32_t mDataSize = get_int32((uint8_t *) & pkt->mDataSize);
//
- uint8_t *buffer = (uint8_t*)pkt;
+ uint8_t *buffer = (uint8_t *) pkt;
- gpsd_report(LOG_PROG, "PrintUSBPacket()\n");
+ gpsd_report(LOG_PROG, "Garmin: PrintUSBPacket()\n");
// gem
- if ( DLE == pkt->mPacketType) {
- gpsd_report(LOG_PROG, "really a SER packet!\n");
- return PrintSERPacket ( session,
- (unsigned char)buffer[1],
- (int)buffer[2],
- (unsigned char*)(buffer + 3));
+ if (DLE == pkt->mPacketType) {
+ gpsd_report(LOG_PROG, "Garmin: really a SER packet!\n");
+ return PrintSERPacket(session,
+ (unsigned char)buffer[1],
+ (int)buffer[2], (unsigned char *)(buffer + 3));
}
-
// gem
- if ( 4096 < mDataSize) {
- gpsd_report(LOG_WARN, "bogus packet, size too large=%d\n", mDataSize);
+ if (4096 < mDataSize) {
+ gpsd_report(LOG_WARN, "Garmin: bogus packet, size too large=%d\n",
+ mDataSize);
return 0;
}
- (void)snprintf(session->gpsdata.tag, sizeof(session->gpsdata.tag), "%u"
- , (unsigned int)pkt->mPacketType);
- switch ( pkt->mPacketType ) {
+ (void)snprintf(session->gpsdata.tag, sizeof(session->gpsdata.tag), "%u",
+ (unsigned int)pkt->mPacketType);
+ switch (pkt->mPacketType) {
case GARMIN_LAYERID_TRANSPORT:
/* Garmin USB layer specific */
- switch( pkt->mPacketId ) {
+ switch (pkt->mPacketId) {
case GARMIN_PKTID_TRANSPORT_START_SESSION_REQ:
- gpsd_report(LOG_PROG, "Transport, Start Session req\n");
+ gpsd_report(LOG_PROG, "Garmin: Transport, Start Session req\n");
break;
case GARMIN_PKTID_TRANSPORT_START_SESSION_RESP:
mode = get_int32(&pkt->mData.uchars[0]);
- gpsd_report(LOG_PROG, "Transport, Start Session resp, unit: 0x%x\n"
- , mode);
+ gpsd_report(LOG_PROG,
+ "Garmin: Transport, Start Session resp, unit: 0x%x\n",
+ mode);
break;
default:
- gpsd_report(LOG_PROG, "Transport, Packet: Type %d %d %d, ID: %d, Sz: %d\n"
- , pkt->mPacketType
- , pkt->mReserved1
- , pkt->mReserved2
- , pkt->mPacketId
- , mDataSize);
+ gpsd_report(LOG_PROG,
+ "Garmin: Transport, Packet: Type %d %d %d, ID: %d, Sz: %d\n",
+ pkt->mPacketType, pkt->mReserved1, pkt->mReserved2,
+ pkt->mPacketId, mDataSize);
break;
}
break;
@@ -652,13 +652,13 @@ static gps_mask_t PrintUSBPacket(struct gps_device_t *session, Packet_t *pkt)
break;
case 75:
// private, garmin USB kernel driver specific
- switch( pkt->mPacketId ) {
+ switch (pkt->mPacketId) {
case PRIV_PKTID_SET_MODE:
prod_id = get_uint16(&pkt->mData.uchars[0]);
- gpsd_report(LOG_PROG, "Private, Set Mode: %d\n", prod_id);
+ gpsd_report(LOG_PROG, "Garmin: Private, Set Mode: %d\n", prod_id);
break;
case PRIV_PKTID_INFO_REQ:
- gpsd_report(LOG_PROG, "Private, ID: Info Req\n");
+ gpsd_report(LOG_PROG, "Garmin: Private, ID: Info Req\n");
break;
case PRIV_PKTID_INFO_RESP:
veri = get_int32(pkt->mData.uchars);
@@ -666,225 +666,261 @@ static gps_mask_t PrintUSBPacket(struct gps_device_t *session, Packet_t *pkt)
min_ver = (int)(veri & 0xffff);
mode = get_int32(&pkt->mData.uchars[4]);
serial = get_int32(&pkt->mData.uchars[8]);
- gpsd_report(LOG_PROG, "Private, ID: Info Resp\n");
- gpsd_report(LOG_INF, "Garmin USB Driver found, Version %d.%d, Mode: %d, GPS Serial# %u\n"
- , maj_ver, min_ver, mode, serial);
+ gpsd_report(LOG_PROG, "Garmin: Private, ID: Info Resp\n");
+ gpsd_report(LOG_INF,
+ "Garmin: USB Driver found, Version %d.%d, Mode: %d, GPS Serial# %u\n",
+ maj_ver, min_ver, mode, serial);
break;
default:
- gpsd_report(LOG_PROG, "Private, Packet: ID: %d, Sz: %d\n"
- , pkt->mPacketId
- , mDataSize);
+ gpsd_report(LOG_PROG, "Garmin: Private, Packet: ID: %d, Sz: %d\n",
+ pkt->mPacketId, mDataSize);
break;
}
break;
default:
- gpsd_report(LOG_PROG, "Packet: Type %d %d %d, ID: %d, Sz: %d\n"
- , pkt->mPacketType
- , pkt->mReserved1
- , pkt->mReserved2
- , pkt->mPacketId
- , mDataSize);
+ gpsd_report(LOG_PROG,
+ "Garmin: Packet: Type %d %d %d, ID: %d, Sz: %d\n",
+ pkt->mPacketType, pkt->mReserved1, pkt->mReserved2,
+ pkt->mPacketId, mDataSize);
break;
}
return mask;
}
+
/*@ +branchstate @*/
/* build and send a packet w/ USB protocol */
-static void Build_Send_USB_Packet( struct gps_device_t *session,
- uint32_t layer_id, uint32_t pkt_id, uint32_t length, uint32_t data )
+static void Build_Send_USB_Packet(struct gps_device_t *session,
+ uint32_t layer_id, uint32_t pkt_id,
+ uint32_t length, uint32_t data)
{
- uint8_t *buffer = (uint8_t *)session->driver.garmin.Buffer;
- Packet_t *thePacket = (Packet_t*)buffer;
- ssize_t theBytesReturned = 0;
- ssize_t theBytesToWrite = 12 + (ssize_t)length;
-
- set_int32(buffer, layer_id);
- set_int32(buffer+4, pkt_id);
- set_int32(buffer+8, length);
- if ( 2 == length ) {
- set_int16(buffer+12, data);
- } else if ( 4 == length ) {
- set_int32(buffer+12, data);
- }
-
+ uint8_t *buffer = (uint8_t *) session->driver.garmin.Buffer;
+ Packet_t *thePacket = (Packet_t *) buffer;
+ ssize_t theBytesReturned = 0;
+ ssize_t theBytesToWrite = 12 + (ssize_t) length;
+
+ set_int32(buffer, layer_id);
+ set_int32(buffer + 4, pkt_id);
+ set_int32(buffer + 8, length);
+ if (2 == length) {
+ set_int16(buffer + 12, data);
+ } else if (4 == length) {
+ set_int32(buffer + 12, data);
+ }
#if 0
- gpsd_report(LOG_IO, "SendPacket(), writing %d bytes: %s\n",
- theBytesToWrite,
- gpsd_hexdump_wrapper(thePacket, theBytesToWrite, LOG_IO));
+ gpsd_report(LOG_IO, "Garmin: SendPacket(), writing %d bytes: %s\n",
+ theBytesToWrite,
+ gpsd_hexdump_wrapper(thePacket, theBytesToWrite, LOG_IO));
#endif
- (void)PrintUSBPacket ( session, thePacket);
+ (void)PrintUSBPacket(session, thePacket);
- theBytesReturned = gpsd_write( session , thePacket,
- (size_t)theBytesToWrite);
- gpsd_report(LOG_IO, "SendPacket(), wrote %zd bytes\n",
- theBytesReturned);
+ theBytesReturned = gpsd_write(session, thePacket,
+ (size_t) theBytesToWrite);
+ gpsd_report(LOG_IO, "Garmin: SendPacket(), wrote %zd bytes\n",
+ theBytesReturned);
- // Garmin says:
- // If the packet size was an exact multiple of the USB packet
- // size, we must make a final write call with no data
+ // Garmin says:
+ // If the packet size was an exact multiple of the USB packet
+ // size, we must make a final write call with no data
- // as a practical matter no known packets are 64 bytes long so
- // this is untested
+ // as a practical matter no known packets are 64 bytes long so
+ // this is untested
- // So here goes just in case
- if( 0 == (theBytesToWrite % ASYNC_DATA_SIZE) ) {
- char *n = "";
- theBytesReturned = gpsd_write( session , &n, 0);
- }
+ // So here goes just in case
+ if (0 == (theBytesToWrite % ASYNC_DATA_SIZE)) {
+ char *n = "";
+ theBytesReturned = gpsd_write(session, &n, 0);
+ }
}
+
/* build and send a packet in serial protocol */
/* layer_id unused */
// FIXME: This should go through the common message buffer someday
-static void Build_Send_SER_Packet( struct gps_device_t *session,
- uint32_t layer_id UNUSED, uint32_t pkt_id, uint32_t length,
- uint32_t data )
+static void Build_Send_SER_Packet(struct gps_device_t *session,
+ uint32_t layer_id UNUSED, uint32_t pkt_id,
+ uint32_t length, uint32_t data)
{
- uint8_t *buffer = (uint8_t *)session->driver.garmin.Buffer;
- uint8_t *buffer0 = buffer;
- Packet_t *thePacket = (Packet_t*)buffer;
- ssize_t theBytesReturned = 0;
- ssize_t theBytesToWrite = 6 + (ssize_t)length;
- uint8_t chksum = 0;
-
- *buffer++ = (uint8_t)DLE;
- *buffer++ = (uint8_t)pkt_id;
- chksum = pkt_id;
- *buffer++ = (uint8_t)length;
- chksum += length;
- /* ??? What is this doing? */
- if ( 2 == length ) {
- /* carefull! no DLE stuffing here! */
- set_int16(buffer, data);
- chksum += buffer[0];
- chksum += buffer[1];
- } else if ( 4 == length ) {
- /* carefull! no DLE stuffing here! */
- set_int32(buffer, data);
- chksum += buffer[0];
- chksum += buffer[1];
- chksum += buffer[2];
- chksum += buffer[3];
- }
- /* ??? How is data copied to the buffer? */
- buffer += length;
-
- // Add checksum
- *buffer++ = -chksum;
- if ( DLE == -chksum ) {
- /* stuff another DLE */
- *buffer++ = (uint8_t)DLE;
- theBytesToWrite++;
- }
-
- // Add DLE, ETX
- *buffer++ = (uint8_t)DLE;
- *buffer++ = (uint8_t)ETX;
+ uint8_t *buffer = (uint8_t *) session->driver.garmin.Buffer;
+ uint8_t *buffer0 = buffer;
+ Packet_t *thePacket = (Packet_t *) buffer;
+ ssize_t theBytesReturned = 0;
+ ssize_t theBytesToWrite = 6 + (ssize_t) length;
+ uint8_t chksum = 0;
+
+ *buffer++ = (uint8_t) DLE;
+ *buffer++ = (uint8_t) pkt_id;
+ chksum = pkt_id;
+ *buffer++ = (uint8_t) length;
+ chksum += length;
+ /* ??? What is this doing? */
+ if (2 == length) {
+ /* carefull! no DLE stuffing here! */
+ set_int16(buffer, data);
+ chksum += buffer[0];
+ chksum += buffer[1];
+ } else if (4 == length) {
+ /* carefull! no DLE stuffing here! */
+ set_int32(buffer, data);
+ chksum += buffer[0];
+ chksum += buffer[1];
+ chksum += buffer[2];
+ chksum += buffer[3];
+ }
+ /* ??? How is data copied to the buffer? */
+ buffer += length;
+
+ // Add checksum
+ *buffer++ = -chksum;
+ if (DLE == -chksum) {
+ /* stuff another DLE */
+ *buffer++ = (uint8_t) DLE;
+ theBytesToWrite++;
+ }
+ // Add DLE, ETX
+ *buffer++ = (uint8_t) DLE;
+ *buffer++ = (uint8_t) ETX;
#if 1
- gpsd_report(LOG_IO, "SendPacket(), writing %zd bytes: %s\n",
- theBytesToWrite,
- gpsd_hexdump_wrapper(thePacket, (size_t)theBytesToWrite, LOG_IO));
+ gpsd_report(LOG_IO, "Garmin: SendPacket(), writing %zd bytes: %s\n",
+ theBytesToWrite,
+ gpsd_hexdump_wrapper(thePacket, (size_t) theBytesToWrite,
+ LOG_IO));
#endif
- (void)PrintSERPacket ( session,
- (unsigned char)buffer0[1],
- (int)buffer0[2],
- (unsigned char *)(buffer0 + 3));
+ (void)PrintSERPacket(session,
+ (unsigned char)buffer0[1],
+ (int)buffer0[2], (unsigned char *)(buffer0 + 3));
- theBytesReturned = gpsd_write(session, thePacket,
- (size_t)theBytesToWrite);
- gpsd_report(LOG_IO, "SendPacket(), wrote %zd bytes\n",
- theBytesReturned);
+ theBytesReturned = gpsd_write(session, thePacket,
+ (size_t) theBytesToWrite);
+ gpsd_report(LOG_IO, "Garmin: SendPacket(), wrote %zd bytes\n",
+ theBytesReturned);
}
/*
- * garmin_usb_detect()
+ * garmin_usb_detect() - detect a Garmin USB device connected to ession fd.
*
* This is ONLY for USB devices reporting as: 091e:0003.
- *
- * check that the garmin_gps driver is installed in the kernel
- * and that an active USB device is using it.
*
- * It does not yet check that the currect device is the one
- * attached to the garmin. So if you have a garmin and another
- * gps this could be a problem.
+ * This driver ONLY works in Linux and ONLY when the the garmin_gps kernel
+ * module is installed.
*
- * this is very linux specific.
+ * This is only necessary because under Linux Garmin USB devices need a
+ * kernel module rather than being normal USB-serial devices.
*
- * return 1 if garmin_gps device found
- * return 0 if not
+ * The actual wire protocol from the Garmin device is very strange. There
+ * are no delimiters. End of packet is signaled by a zero-length read
+ * on the USB device, and start of packet is the next read. You can't just
+ * ignore the zero reads and pass the data through - you'd never be able
+ * to tell where the packet boundaries are.
*
+ * The garmin_usb module's job is to grab the packet and frame it in
+ * DLEs (with DLE stuffing). This makes the USB packets look as
+ * though they came from a regular Garmin *serial* device, which is how
+ * most of the processing for both types can be unified here.
+ *
+ * return 1 is device found
+ * return 0 if not
*/
static bool garmin_usb_detect(struct gps_device_t *session)
{
-
- FILE *fp = NULL;
- char buf[256];
- bool ok = false;
-
- /* check for garmin USB serial driver -- very Linux-specific */
- if (access("/sys/module/garmin_gps", R_OK) != 0) {
- gpsd_report(LOG_WARN, "garmin_gps Linux USB module not active.\n");
+#if defined(__linux__) || defined(S_SPLINT_S)
+ /*
+ * Only perform this check if we're looking at a USB-serial
+ * device. This prevents drivers for attached serial GPSes
+ * fronm being rudely elbowed aside by this one if they happen
+ * to be trying to coexist with the Garmin.
+ */
+ if (session->sourcetype != source_usb)
return false;
- }
- /* check for a garmin_gps device in /proc
- * if we can */
- if ( NULL != (fp = fopen( "/proc/bus/usb/devices", "r")) ) {
- ok = false;
- while ( 0 != fgets( buf, (int)sizeof(buf), fp ) ) {
- if ( strstr( buf, "garmin_gps") ) {
- ok = true;
- break;
+ else {
+ /*
+ * This is ONLY for USB devices reporting as: 091e:0003.
+ *
+ * Check that the garmin_gps driver is installed in the kernel
+ * and that an active USB device is using it.
+ *
+ * BUG: It does not yet check that the currect device is the one
+ * attached to the Garmin. So if you have a Garmin and another
+ * USB gps this could be a problem.
+ *
+ * Return true if garmin_gps device found, false otherwise.
+ */
+ FILE *fp = NULL;
+ char buf[256];
+ bool ok = false;
+
+ /* check for garmin USB serial driver -- very Linux-specific */
+ if (access("/sys/module/garmin_gps", R_OK) != 0) {
+ gpsd_report(LOG_WARN,
+ "Garmin: garmin_gps Linux USB module not active.\n");
+ return false;
+ }
+ /* check for a garmin_gps device in /proc
+ * if we can */
+ if (NULL != (fp = fopen("/proc/bus/usb/devices", "r"))) {
+
+ ok = false;
+ while (0 != fgets(buf, (int)sizeof(buf), fp)) {
+ if (strstr(buf, "garmin_gps")) {
+ ok = true;
+ break;
+ }
+ }
+ (void)fclose(fp);
+ if (!ok) {
+ // no device using garmin_gps now
+ gpsd_report(LOG_WARN,
+ "Garmin: garmin_gps not in /proc/bus/usb/devices.\n");
+ gpsd_report(LOG_WARN,
+ "Garmin: garmin_gps driver present, but not in use\n");
+ return false;
}
+ } else {
+ gpsd_report(LOG_WARN,
+ "Garmin: Can't open /proc/bus/usb/devices, will try anyway\n");
}
- (void)fclose(fp);
- if ( !ok ) {
- // no device using garmin_gps now
- gpsd_report(LOG_WARN, "garmin_gps not in /proc/bus/usb/devices.\n");
- gpsd_report(LOG_WARN, "garmin_gps driver present, but not in use\n");
+
+ if (!gpsd_set_raw(session)) {
+ gpsd_report(LOG_ERROR,
+ "Garmin: garmin_usb_detect: error changing port attributes: %s\n",
+ strerror(errno));
return false;
}
- } else {
- gpsd_report(LOG_WARN,
- "Can't open /proc/bus/usb/devices, will try anyway\n");
- }
-
-
- if (!gpsd_set_raw(session)) {
- gpsd_report(LOG_ERROR, "garmin_usb_detect: error changing port attributes: %s\n",
- strerror(errno));
- return false;
- }
-
#ifdef __UNUSED
- Packet_t *thePacket = NULL;
- uint8_t *buffer = NULL;
- /* reset the buffer and buffer length */
- memset( session->driver.garmin.Buffer, 0, sizeof(session->driver.garmin.Buffer) );
- session->driver.garmin.BufferLen = 0;
-
- if (sizeof(session->driver.garmin.Buffer) < sizeof(Packet_t)) {
- gpsd_report(LOG_ERROR, "garmin_usb_detect: Compile error, garmin.Buffer too small.\n",
- strerror(errno));
- return false;
- }
+ Packet_t *thePacket = NULL;
+ uint8_t *buffer = NULL;
+ /* reset the buffer and buffer length */
+ memset(session->driver.garmin.Buffer, 0,
+ sizeof(session->driver.garmin.Buffer));
+ session->driver.garmin.BufferLen = 0;
+
+ if (sizeof(session->driver.garmin.Buffer) < sizeof(Packet_t)) {
+ gpsd_report(LOG_ERROR,
+ "Garmin: garmin_usb_detect: Compile error, garmin.Buffer too small.\n",
+ strerror(errno));
+ return false;
+ }
- buffer = (uint8_t *)session->driver.garmin.Buffer;
- thePacket = (Packet_t*)buffer;
+ buffer = (uint8_t *) session->driver.garmin.Buffer;
+ thePacket = (Packet_t *) buffer;
#endif /* __UNUSED__ */
- // set Mode 1, mode 0 is broken somewhere past 2.6.14
- // but how?
- gpsd_report(LOG_PROG, "Set garmin_gps driver mode = 0\n");
- Build_Send_USB_Packet( session, GARMIN_LAYERID_PRIVATE
- , PRIV_PKTID_SET_MODE, 4, MODE_GARMIN_SERIAL);
- // expect no return packet !?
+ // set Mode 1, mode 0 is broken somewhere past 2.6.14
+ // but how?
+ gpsd_report(LOG_PROG, "Garmin: Set garmin_gps driver mode = 0\n");
+ Build_Send_USB_Packet(session, GARMIN_LAYERID_PRIVATE,
+ PRIV_PKTID_SET_MODE, 4, MODE_GARMIN_SERIAL);
+ // expect no return packet !?
- return true;
+ return true;
+ }
+#else
+ return false;
+#endif /* __linux__ */
}
static void garmin_event_hook(struct gps_device_t *session, event_t event)
@@ -895,26 +931,28 @@ static void garmin_event_hook(struct gps_device_t *session, event_t event)
*/
if (event == event_identified || event == event_reactivate) {
// Tell the device to send product data
- gpsd_report(LOG_PROG, "Get Garmin Product Data\n");
- Build_Send_SER_Packet(session, GARMIN_LAYERID_APPL
- , GARMIN_PKTID_PRODUCT_RQST, 0, 0);
+ gpsd_report(LOG_PROG, "Garmin: Get Product Data\n");
+ Build_Send_SER_Packet(session, GARMIN_LAYERID_APPL,
+ GARMIN_PKTID_PRODUCT_RQST, 0, 0);
// turn on PVT data 49
- gpsd_report(LOG_PROG, "Set Garmin to send reports every 1 second\n");
+ gpsd_report(LOG_PROG, "Garmin: Set to send reports every 1 second\n");
- Build_Send_SER_Packet(session, GARMIN_LAYERID_APPL
- , GARMIN_PKTID_L001_COMMAND_DATA, 2, CMND_START_PVT_DATA);
+ Build_Send_SER_Packet(session, GARMIN_LAYERID_APPL,
+ GARMIN_PKTID_L001_COMMAND_DATA, 2,
+ CMND_START_PVT_DATA);
#if USE_RMD
// turn on RMD data 110
- gpsd_report(LOG_PROG, "Set Garmin to send Raw sat data\n");
- Build_Send_SER_Packet(session, GARMIN_LAYERID_APPL
- , GARMIN_PKTID_L001_COMMAND_DATA, 2, CMND_START_RM_DATA);
+ gpsd_report(LOG_PROG, "Garmin: Set to send Raw sat data\n");
+ Build_Send_SER_Packet(session, GARMIN_LAYERID_APPL,
+ GARMIN_PKTID_L001_COMMAND_DATA, 2,
+ CMND_START_RM_DATA);
#endif
}
if (event == event_deactivate)
/* FIXME: is any action needed, or is closing the port sufficient? */
- gpsd_report(LOG_PROG, "garmin_close()\n");
+ gpsd_report(LOG_PROG, "Garmin: garmin_close()\n");
}
#define Send_ACK() Build_Send_SER_Packet(session, 0, ACK, 0, 0)
@@ -936,117 +974,121 @@ gps_mask_t garmin_ser_parse(struct gps_device_t *session)
unsigned char chksum = 0;
gps_mask_t mask = 0;
- gpsd_report(LOG_RAW, "garmin_ser_parse()\n");
- if ( 6 > len ) {
+ gpsd_report(LOG_RAW, "Garmin: garmin_ser_parse()\n");
+ if (6 > len) {
/* WTF? */
/* minimum packet; <DLE> [pkt id] [length=0] [chksum] <DLE> <STX> */
Send_NAK();
- gpsd_report(LOG_RAW+1, "Garmin serial too short: %zd\n", len);
+ gpsd_report(LOG_RAW + 1, "Garmin: serial too short: %zd\n", len);
return 0;
}
/* debug */
- for ( i = 0 ; i < (int)len ; i++ ) {
- gpsd_report(LOG_RAW+1, "Char: %#02x\n", buf[i]);
+ for (i = 0; i < (int)len; i++) {
+ gpsd_report(LOG_RAW + 1, "Garmin: Char: %#02x\n", buf[i]);
}
- if ( '\x10' != buf[0] ) {
+ if ('\x10' != buf[0]) {
Send_NAK();
- gpsd_report(LOG_RAW+1, "buf[0] not DLE\n");
+ gpsd_report(LOG_RAW + 1, "Garmin: buf[0] not DLE\n");
return 0;
}
n = 1;
pkt_id = buf[n++];
chksum = pkt_id;
- if ( '\x10' == pkt_id ) {
- if ( '\x10' != buf[n++] ) {
+ if ('\x10' == pkt_id) {
+ if ('\x10' != buf[n++]) {
Send_NAK();
- gpsd_report(LOG_RAW+1, "Bad pkt_id %#02x\n", pkt_id);
+ gpsd_report(LOG_RAW + 1, "Garmin: Bad pkt_id %#02x\n", pkt_id);
return 0;
}
}
pkt_len = buf[n++];
chksum += pkt_len;
- if ( '\x10' == pkt_len ) {
- if ( '\x10' != buf[n++] ) {
- gpsd_report(LOG_RAW+1, "Bad pkt_len %#02x\n", pkt_len);
+ if ('\x10' == pkt_len) {
+ if ('\x10' != buf[n++]) {
+ gpsd_report(LOG_RAW + 1, "Garmin: Bad pkt_len %#02x\n", pkt_len);
Send_NAK();
return 0;
}
}
data_index = 0;
- for ( i = 0; i < 256 ; i++ ) {
+ for (i = 0; i < 256; i++) {
- if ( (int)pkt_len == data_index ) {
- // got it all
- break;
+ if ((int)pkt_len == data_index) {
+ // got it all
+ break;
}
- if ( len < n + i ) {
- gpsd_report(LOG_RAW+1, "Packet too short %zd < %zd\n", len, n + i);
+ if (len < n + i) {
+ gpsd_report(LOG_RAW + 1, "Garmin: Packet too short %zd < %zd\n",
+ len, n + i);
Send_NAK();
return 0;
}
c = buf[n + i];
- if ( got_dle ) {
+ if (got_dle) {
got_dle = 0;
- if ( '\x10' != c ) {
+ if ('\x10' != c) {
Send_NAK();
- gpsd_report(LOG_RAW+1, "Bad DLE %#02x\n", c);
+ gpsd_report(LOG_RAW + 1, "Garmin: Bad DLE %#02x\n", c);
return 0;
}
} else {
chksum += c;
- data_buf[ data_index++ ] = c;
- if ( '\x10' == c ) {
+ data_buf[data_index++] = c;
+ if ('\x10' == c) {
got_dle = 1;
}
}
}
/* get checksum */
- if ( len < n + i ) {
+ if (len < n + i) {
Send_NAK();
- gpsd_report(LOG_RAW+1, "No checksum, Packet too short %zd < %zd\n",
- len, n + i);
+ gpsd_report(LOG_RAW + 1,
+ "Garmin: No checksum, Packet too short %zd < %zd\n", len,
+ n + i);
return 0;
}
c = buf[n + i++];
chksum += c;
/* get final DLE */
- if ( len < n + i ) {
+ if (len < n + i) {
Send_NAK();
- gpsd_report(LOG_RAW+1, "No final DLE, Packet too short %zd < %zd\n",
- len, n + i);
+ gpsd_report(LOG_RAW + 1,
+ "Garmin: No final DLE, Packet too short %zd < %zd\n", len,
+ n + i);
return 0;
}
c = buf[n + i++];
- if ( '\x10' != c ) {
+ if ('\x10' != c) {
Send_NAK();
- gpsd_report(LOG_RAW+1, "Final DLE not DLE\n");
+ gpsd_report(LOG_RAW + 1, "Garmin: Final DLE not DLE\n");
return 0;
}
/* get final ETX */
- if ( len < n + i ) {
+ if (len < n + i) {
Send_NAK();
- gpsd_report(LOG_RAW+1, "No final ETX, Packet too short %zd < %zd\n",
- len, n + i);
+ gpsd_report(LOG_RAW + 1,
+ "Garmin: No final ETX, Packet too short %zd < %zd\n", len,
+ n + i);
return 0;
}
c = buf[n + i++];
- if ( '\x03' != c ) {
+ if ('\x03' != c) {
Send_NAK();
- gpsd_report(LOG_RAW+1, "Final ETX not ETX\n");
+ gpsd_report(LOG_RAW + 1, "Garmin: Final ETX not ETX\n");
return 0;
}
/* debug */
/*@ -usedef -compdef @*/
- for ( i = 0 ; i < data_index ; i++ ) {
- gpsd_report(LOG_RAW+1, "Char: %#02x\n", data_buf[i]);
+ for (i = 0; i < data_index; i++) {
+ gpsd_report(LOG_RAW + 1, "Garmin: Char: %#02x\n", data_buf[i]);
}
gpsd_report(LOG_IO,
- "garmin_ser_parse() Type: %#02x, Len: %#02x, chksum: %#02x\n",
+ "Garmin: garmin_ser_parse() Type: %#02x, Len: %#02x, chksum: %#02x\n",
pkt_id, pkt_len, chksum);
mask = PrintSERPacket(session, pkt_id, pkt_len, data_buf);
@@ -1055,8 +1097,11 @@ gps_mask_t garmin_ser_parse(struct gps_device_t *session)
(void)usleep(300);
Send_ACK();
/*@ +usedef +compdef @*/
+ gpsd_report(LOG_IO, "Garmin: garmin_ser_parse( ) = %s\n",
+ gpsd_maskdump(mask));
return mask;
}
+
/*@ -charint @*/
#ifdef ALLOW_RECONFIGURE
@@ -1064,7 +1109,7 @@ static void settle(void)
{
struct timespec delay, rem;
/*@ -type -unrecog @*/
- memset( &delay, 0, sizeof(delay));
+ memset(&delay, 0, sizeof(delay));
delay.tv_sec = 0;
delay.tv_nsec = 333000000L;
nanosleep(&delay, &rem);
@@ -1075,47 +1120,71 @@ static void garmin_switcher(struct gps_device_t *session, int mode)
{
if (mode == MODE_NMEA) {
/*@ +charint @*/
- const char switcher[] = {0x10,0x0A,0x02,0x26,0x00,0xCE,0x10,0x03};
+ const char switcher[] =
+ { 0x10, 0x0A, 0x02, 0x26, 0x00, 0xCE, 0x10, 0x03 };
// Note hard-coded string length in the next line...
int status = (int)gpsd_write(session, switcher, sizeof(switcher));
/*@ -charint @*/
if (status == (int)sizeof(switcher)) {
- gpsd_report(LOG_IO, "=> GPS: turn off binary %02x %02x %02x... \n"
- , switcher[0], switcher[1], switcher[2]);
+ gpsd_report(LOG_IO,
+ "Garmin: => GPS: turn off binary %02x %02x %02x... \n",
+ switcher[0], switcher[1], switcher[2]);
} else {
- gpsd_report(LOG_ERROR, "=> GPS: FAILED\n");
+ gpsd_report(LOG_ERROR, "Garmin: => GPS: FAILED\n");
}
- settle(); // wait 333mS, essential!
+ settle(); // wait 333mS, essential!
/* once a sec, no binary, no averaging, NMEA 2.3, WAAS */
(void)nmea_send(session, "$PGRMC1,1,1");
//(void)nmea_send(fd, "$PGRMC1,1,1,1,,,,2,W,N");
(void)nmea_send(session, "$PGRMI,,,,,,,R");
- settle(); // wait 333mS, essential!
+ settle(); // wait 333mS, essential!
} else {
(void)nmea_send(session, "$PGRMC1,1,2,1,,,,2,W,N");
(void)nmea_send(session, "$PGRMI,,,,,,,R");
- settle(); // wait 333mS, essential!
+ settle(); // wait 333mS, essential!
}
}
#endif /* ALLOW_RECONFIGURE */
#ifdef ALLOW_CONTROLSEND
-static ssize_t garmin_control_send(struct gps_device_t *session,
- char *buf, size_t buflen)
+static ssize_t garmin_control_send(struct gps_device_t *session,
+ char *buf, size_t buflen)
/* not used by the daemon, it's for gpsctl and friends */
{
- /*@ -mayaliasunique **/
+ /*@ -mayaliasunique @*/
session->msgbuflen = buflen;
(void)memcpy(session->msgbuf, buf, buflen);
return gpsd_write(session, session->msgbuf, session->msgbuflen);
- /*@ +mayaliasunique **/
+ /*@ +mayaliasunique @*/
}
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+static double garmin_ntp_offset(struct gps_device_t *session)
+{
+ if (session->sourcetype == source_usb) {
+ return 0.035; /* Garmin USB, expect +/- 40mS jitter */
+ }
+ /* only two sentences ships time */
+ /* but the PVT data is always first */
+ switch (session->gpsdata.dev.baudrate) {
+ case 4800:
+ return 0.430; /* TBD */
+ case 9600:
+ return 0.430; /* tested 12Arp10 */
+ case 19200:
+ return 0.430; /* TBD */
+ case 38400:
+ return 0.430; /* TBD */
+ }
+ return 0.430; /* WTF? WAG */
+}
+#endif /* NTPSHM_ENABLE */
+
/* this is everything we export */
#ifdef __UNUSED__
-static int GetPacket (struct gps_device_t *session );
+static int GetPacket(struct gps_device_t *session);
//-----------------------------------------------------------------------------
// Gets a single packet.
// this is odd, the garmin usb driver will only return 64 bytes, or less
@@ -1131,22 +1200,22 @@ static int GetPacket (struct gps_device_t *session );
// maybe it is something in the USB protocol.
//
// Return: 0 = got a good packet
-// -1 = error
-// 1 = got partial packet
-static int GetPacket (struct gps_device_t *session )
+// -1 = error
+// 1 = got partial packet
+static int GetPacket(struct gps_device_t *session)
{
struct timespec delay, rem;
int cnt = 0;
// int x = 0; // for debug dump
- memset( session->driver.garmin.Buffer, 0, sizeof(Packet_t));
- memset( &delay, 0, sizeof(delay));
+ memset(session->driver.garmin.Buffer, 0, sizeof(Packet_t));
+ memset(&delay, 0, sizeof(delay));
session->driver.garmin.BufferLen = 0;
session->packet.outbuflen = 0;
- gpsd_report(LOG_IO, "GetPacket()\n");
+ gpsd_report(LOG_IO, "Garmin: GetPacket()\n");
- for( cnt = 0 ; cnt < 10 ; cnt++ ) {
+ for (cnt = 0; cnt < 10; cnt++) {
size_t pkt_size;
// Read async data until the driver returns less than the
// max async data size, which signifies the end of a packet
@@ -1154,54 +1223,56 @@ static int GetPacket (struct gps_device_t *session )
// not optimal, but given the speed and packet nature of
// the USB not too bad for a start
ssize_t theBytesReturned = 0;
- uint8_t *buf = (uint8_t *)session->driver.garmin.Buffer;
- Packet_t *thePacket = (Packet_t*)buf;
+ uint8_t *buf = (uint8_t *) session->driver.garmin.Buffer;
+ Packet_t *thePacket = (Packet_t *) buf;
- theBytesReturned = read(session->gpsdata.gps_fd
- , buf + session->driver.garmin.BufferLen
- , ASYNC_DATA_SIZE);
+ theBytesReturned =
+ read(session->gpsdata.gps_fd,
+ buf + session->driver.garmin.BufferLen, ASYNC_DATA_SIZE);
// zero byte returned is a legal value and denotes the end of a
// binary packet.
- if ( 0 > theBytesReturned ) {
+ if (0 > theBytesReturned) {
// read error...
// or EAGAIN, but O_NONBLOCK is never set
- gpsd_report(LOG_ERROR, "GetPacket() read error=%d, errno=%d\n"
- , theBytesReturned, errno);
+ gpsd_report(LOG_ERROR,
+ "Garmin: GetPacket() read error=%d, errno=%d\n",
+ theBytesReturned, errno);
continue;
}
- gpsd_report(LOG_RAW, "got %d bytes\n", theBytesReturned);
+ gpsd_report(LOG_RAW, "Garmin: got %d bytes\n", theBytesReturned);
#if 1
- gpsd_report(LOG_IO, "getPacket(), got %d bytes: %s\n",
- theBytesReturned,
- gpsd_hexdump_wrapper(thePacket, theBytesReturned, LOG_IO));
+ gpsd_report(LOG_IO, "Garmin: getPacket(), got %d bytes: %s\n",
+ theBytesReturned,
+ gpsd_hexdump_wrapper(thePacket, theBytesReturned,
+ LOG_IO));
#endif
session->driver.garmin.BufferLen += theBytesReturned;
- if ( 256 <= session->driver.garmin.BufferLen ) {
+ if (256 <= session->driver.garmin.BufferLen) {
// really bad read error...
- gpsd_report(LOG_ERROR, "GetPacket() packet too long, %ld > 255 !\n"
- , session->driver.garmin.BufferLen);
+ gpsd_report(LOG_ERROR,
+ "Garmin: GetPacket() packet too long, %ld > 255 !\n",
+ session->driver.garmin.BufferLen);
session->driver.garmin.BufferLen = 0;
break;
}
- pkt_size = 12 + get_int32((uint8_t*)&thePacket->mDataSize);
- if ( 12 <= session->driver.garmin.BufferLen) {
+ pkt_size = 12 + get_int32((uint8_t *) & thePacket->mDataSize);
+ if (12 <= session->driver.garmin.BufferLen) {
// have enough data to check packet size
- if ( session->driver.garmin.BufferLen > pkt_size) {
+ if (session->driver.garmin.BufferLen > pkt_size) {
// wrong amount of data in buffer
- gpsd_report(LOG_ERROR
- , "GetPacket() packet size wrong! Packet: %ld, s/b %ld\n"
- , session->driver.garmin.BufferLen
- , pkt_size);
+ gpsd_report(LOG_ERROR,
+ "Garmin: GetPacket() packet size wrong! Packet: %ld, s/b %ld\n",
+ session->driver.garmin.BufferLen, pkt_size);
session->driver.garmin.BufferLen = 0;
break;
}
}
- if ( 64 > theBytesReturned ) {
+ if (64 > theBytesReturned) {
// zero length, or short, read is a flag for got the whole packet
break;
}
-
+
/*@ ignore @*/
delay.tv_sec = 0;
@@ -1212,28 +1283,33 @@ static int GetPacket (struct gps_device_t *session )
}
// dump the individual bytes, debug only
// for ( x = 0; x < session->driver.garmin.BufferLen; x++ ) {
- // gpsd_report(LOG_RAW+1, "p[%d] = %x\n", x, session->driver.garmin.Buffer[x]);
+ // gpsd_report(LOG_RAW+1, "Garmin: p[%d] = %x\n", x, session->driver.garmin.Buffer[x]);
// }
- if ( 10 <= cnt ) {
- gpsd_report(LOG_ERROR, "GetPacket() packet too long or too slow!\n");
- return -1;
+ if (10 <= cnt) {
+ gpsd_report(LOG_ERROR,
+ "Garmin: GetPacket() packet too long or too slow!\n");
+ return -1;
}
- gpsd_report(LOG_RAW, "GotPacket() sz=%d \n", session->driver.garmin.BufferLen);
+ gpsd_report(LOG_RAW, "Garmin: GotPacket() sz=%d \n",
+ session->driver.garmin.BufferLen);
session->packet.outbuflen = session->driver.garmin.BufferLen;
return 0;
}
+
static gps_mask_t garmin_usb_parse(struct gps_device_t *session)
{
- gpsd_report(LOG_PROG, "garmin_usb_parse()\n");
- return PrintUSBPacket(session, (Packet_t*)session->driver.garmin.Buffer);
+ gpsd_report(LOG_PROG, "Garmin: garmin_usb_parse()\n");
+ return PrintUSBPacket(session,
+ (Packet_t *) session->driver.garmin.Buffer);
}
static ssize_t garmin_get_packet(struct gps_device_t *session)
{
- return (ssize_t)( 0 == GetPacket( session ) ? 1 : 0);
+ return (ssize_t) (0 == GetPacket(session) ? 1 : 0);
}
+/* *INDENT-OFF* */
const struct gps_type_t garmin_usb_binary_old =
{
.type_name = "Garmin USB binary", /* full name of type */
@@ -1254,9 +1330,14 @@ const struct gps_type_t garmin_usb_binary_old =
#ifdef ALLOW_CONTROLSEND
.control_send = garmin_control_send, /* send raw bytes */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = garmin_ntp_offset,
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* __UNUSED__ */
+/* *INDENT-OFF* */
const struct gps_type_t garmin_usb_binary =
{
.type_name = "Garmin USB binary", /* full name of type */
@@ -1270,17 +1351,20 @@ const struct gps_type_t garmin_usb_binary =
.event_hook = garmin_event_hook,/* lifetime ebent handler */
#ifdef ALLOW_RECONFIGURE
.speed_switcher = NULL, /* no speed switcher */
-
- /* Garmin USB Binary has no NMEA */
- .mode_switcher = NULL, /* how to change modes */
+ .mode_switcher = NULL, /* Garmin USB Binary has no NMEA */
.rate_switcher = NULL, /* no sample-rate switcher */
.min_cycle = 1, /* not relevant, no rate switch */
#endif /* ALLOW_RECONFIGURE */
#ifdef ALLOW_CONTROLSEND
.control_send = garmin_control_send, /* send raw bytes */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = garmin_ntp_offset,
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
+/* *INDENT-OFF* */
const struct gps_type_t garmin_ser_binary =
{
.type_name = "Garmin Serial binary", /* full name of type */
@@ -1301,7 +1385,10 @@ const struct gps_type_t garmin_ser_binary =
#ifdef ALLOW_CONTROLSEND
.control_send = garmin_control_send, /* send raw bytes */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = garmin_ntp_offset,
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* GARMIN_ENABLE */
-
diff --git a/driver_garmin_txt.c b/driver_garmin_txt.c
index f1834144..cec33148 100644
--- a/driver_garmin_txt.c
+++ b/driver_garmin_txt.c
@@ -156,108 +156,115 @@ invalid data.
* 123 -> +12.3
**************************************************************************/
-static int gar_decode(const char *data, const size_t length, const char *prefix, const double dividor, /*@out@*/double *result)
+static int gar_decode(const char *data, const size_t length, const char *prefix, const double dividor, /*@out@*/
+ double *result)
{
char buf[10];
float sign = 1.0;
int preflen = (int)strlen(prefix);
- int offset = 1; /* assume one character prefix (E,W,S,N,U,D, etc) */
+ int offset = 1; /* assume one character prefix (E,W,S,N,U,D, etc) */
long int intresult;
/* splint is buggy here, thinks buf can be a null pointer */
/*@ -mustdefine -nullderef -nullpass @*/
if (length >= sizeof(buf)) {
- gpsd_report(LOG_ERROR, "internal buffer too small\n");
- return -1;
+ gpsd_report(LOG_ERROR, "internal buffer too small\n");
+ return -1;
}
bzero(buf, (int)sizeof(buf));
- (void) strncpy(buf, data, length);
- gpsd_report(LOG_RAW+2, "Decoded string: %s\n", buf);
+ (void)strncpy(buf, data, length);
+ gpsd_report(LOG_RAW + 2, "Decoded string: %s\n", buf);
if (strchr(buf, '_') != NULL) {
- /* value is not valid, ignore it */
- return -2;
+ /* value is not valid, ignore it */
+ return -2;
}
/* parse prefix */
do {
- if (preflen == 0 ) {
- offset = 0; /* only number, no prefix */
- break;
- }
- /* second character in prefix is flag for negative number */
- if (preflen >= 2 ) {
- if (buf[0] == prefix[1]) {
- sign = -1.0;
- break;
- }
- }
- /* first character in prefix is flag for positive number */
- if (preflen >= 1 ) {
- if (buf[0] == prefix[0]) {
- sign = 1.0;
- break;
- }
- }
- gpsd_report(LOG_WARN, "Unexpected char \"%c\" in data \"%s\"\n", buf[0], buf);
- return -1;
+ if (preflen == 0) {
+ offset = 0; /* only number, no prefix */
+ break;
+ }
+ /* second character in prefix is flag for negative number */
+ if (preflen >= 2) {
+ if (buf[0] == prefix[1]) {
+ sign = -1.0;
+ break;
+ }
+ }
+ /* first character in prefix is flag for positive number */
+ if (preflen >= 1) {
+ if (buf[0] == prefix[0]) {
+ sign = 1.0;
+ break;
+ }
+ }
+ gpsd_report(LOG_WARN, "Unexpected char \"%c\" in data \"%s\"\n",
+ buf[0], buf);
+ return -1;
} while (0);
- if (strspn(buf+offset, "0123456789") != length-offset) {
- gpsd_report(LOG_WARN, "Invalid value %s\n", buf);
- return -1;
+ if (strspn(buf + offset, "0123456789") != length - offset) {
+ gpsd_report(LOG_WARN, "Invalid value %s\n", buf);
+ return -1;
}
/*@ +mustdefine +nullderef +nullpass @*/
- intresult = atol(buf+offset);
- if (intresult == 0L) sign = 0.0; /* don't create negative zero */
+ intresult = atol(buf + offset);
+ if (intresult == 0L)
+ sign = 0.0; /* don't create negative zero */
- *result = (double) intresult / dividor * sign;
-
- return 0; /* SUCCESS */
+ *result = (double)intresult / dividor * sign;
+
+ return 0; /* SUCCESS */
}
+
/**************************************************************************
* decode integer from string, check if the result is in expected range
* return 0: OK
* -1: data error
* -2: data not valid
**************************************************************************/
-static int gar_int_decode(const char *data, const size_t length, const unsigned int min, const unsigned int max, /*@out@*/unsigned int *result)
+static int gar_int_decode(const char *data, const size_t length,
+ const unsigned int min, const unsigned int max,
+ /*@out@*/ unsigned int *result)
{
char buf[6];
unsigned int res;
/*@ -mustdefine @*/
if (length >= sizeof(buf)) {
- gpsd_report(LOG_ERROR, "internal buffer too small\n");
- return -1;
+ gpsd_report(LOG_ERROR, "internal buffer too small\n");
+ return -1;
}
bzero(buf, (int)sizeof(buf));
- (void) strncpy(buf, data, length);
- gpsd_report(LOG_RAW+2, "Decoded string: %s\n", buf);
+ (void)strncpy(buf, data, length);
+ gpsd_report(LOG_RAW + 2, "Decoded string: %s\n", buf);
if (strchr(buf, '_') != NULL) {
- /* value is not valid, ignore it */
- return -2;
+ /* value is not valid, ignore it */
+ return -2;
}
- /*@ -nullpass @*/ /* splint bug */
+ /*@ -nullpass @*//* splint bug */
if (strspn(buf, "0123456789") != length) {
- gpsd_report(LOG_WARN, "Invalid value %s\n", buf);
- return -1;
+ gpsd_report(LOG_WARN, "Invalid value %s\n", buf);
+ return -1;
}
res = (unsigned)atoi(buf);
if ((res >= min) && (res <= max)) {
- *result = res;
- return 0; /* SUCCESS */
- } else {
- gpsd_report(LOG_WARN, "Value %u out of range <%u, %u>\n", res, min, max);
- return -1;
- }
- /*@ +mustdefine +nullpass @*/
+ *result = res;
+ return 0; /* SUCCESS */
+ } else {
+ gpsd_report(LOG_WARN, "Value %u out of range <%u, %u>\n", res, min,
+ max);
+ return -1;
+ }
+ /*@ +mustdefine +nullpass @*/
}
@@ -267,169 +274,201 @@ static int gar_int_decode(const char *data, const size_t length, const unsigned
*
**************************************************************************/
-gps_mask_t garmintxt_parse(struct gps_device_t *session)
+gps_mask_t garmintxt_parse(struct gps_device_t * session)
{
/* parse GARMIN Simple Text sentence, unpack it into a session structure */
gps_mask_t mask = 0;
gpsd_report(LOG_PROG, "Garmin Simple Text packet, len %zd\n",
- session->packet.outbuflen);
+ session->packet.outbuflen);
gpsd_report(LOG_RAW, "%s\n",
- gpsd_hexdump_wrapper(session->packet.outbuffer,
- session->packet.outbuflen, LOG_RAW));
+ gpsd_hexdump_wrapper(session->packet.outbuffer,
+ session->packet.outbuflen, LOG_RAW));
if (session->packet.outbuflen < 54) {
- /* trailing CR and LF can be ignored; ('@' + 54x 'DATA' + '\r\n') has length 57 */
- gpsd_report(LOG_WARN, "Message is too short, rejected.\n");
- return ONLINE_SET;
+ /* trailing CR and LF can be ignored; ('@' + 54x 'DATA' + '\r\n') has length 57 */
+ gpsd_report(LOG_WARN, "Message is too short, rejected.\n");
+ return ONLINE_IS;
}
-
- session->packet.type=GARMINTXT_PACKET;
+
+ session->packet.type = GARMINTXT_PACKET;
/* TAG message as GTXT, Garmin Simple Text Message */
- strncpy(session->gpsdata.tag, "GTXT", MAXTAGLEN);
+ strncpy(session->gpsdata.tag, "GTXT", MAXTAGLEN);
/* only one message, set cycle start */
session->cycle_end_reliable = true;
do {
- unsigned int result;
- char *buf = (char *)session->packet.outbuffer+1;
- gpsd_report(LOG_PROG, "Timestamp: %.12s\n", buf);
-
- /* year */
- if (0 != gar_int_decode(buf+0, 2, 0, 99, &result)) break;
- session->driver.nmea.date.tm_year = (CENTURY_BASE + (int)result) - 1900;
- /* month */
- if (0 != gar_int_decode(buf+2, 2, 1, 12, &result)) break;
- session->driver.nmea.date.tm_mon = (int)result-1;
- /* day */
- if (0 != gar_int_decode(buf+4, 2, 1, 31, &result)) break;
- session->driver.nmea.date.tm_mday = (int)result;
- /* hour */
- if (0 != gar_int_decode(buf+6, 2, 0, 23, &result)) break;
- session->driver.nmea.date.tm_hour = (int)result; /* mday update?? */
- /* minute */
- if (0 != gar_int_decode(buf+8, 2, 0, 59, &result)) break;
- session->driver.nmea.date.tm_min = (int)result;
- /* second */
- /* second value can be even 60, occasional leap second */
- if (0 != gar_int_decode(buf+10, 2, 0, 60, &result)) break;
- session->driver.nmea.date.tm_sec = (int)result;
- session->driver.nmea.subseconds = 0;
- session->newdata.time = (double)mkgmtime(&session->driver.nmea.date)+session->driver.nmea.subseconds;
- mask |= TIME_SET;
+ unsigned int result;
+ char *buf = (char *)session->packet.outbuffer + 1;
+ gpsd_report(LOG_PROG, "Timestamp: %.12s\n", buf);
+
+ /* year */
+ if (0 != gar_int_decode(buf + 0, 2, 0, 99, &result))
+ break;
+ session->driver.garmintxt.date.tm_year =
+ (CENTURY_BASE + (int)result) - 1900;
+ /* month */
+ if (0 != gar_int_decode(buf + 2, 2, 1, 12, &result))
+ break;
+ session->driver.garmintxt.date.tm_mon = (int)result - 1;
+ /* day */
+ if (0 != gar_int_decode(buf + 4, 2, 1, 31, &result))
+ break;
+ session->driver.garmintxt.date.tm_mday = (int)result;
+ /* hour */
+ if (0 != gar_int_decode(buf + 6, 2, 0, 23, &result))
+ break;
+ session->driver.garmintxt.date.tm_hour = (int)result; /* mday update?? */
+ /* minute */
+ if (0 != gar_int_decode(buf + 8, 2, 0, 59, &result))
+ break;
+ session->driver.garmintxt.date.tm_min = (int)result;
+ /* second */
+ /* second value can be even 60, occasional leap second */
+ if (0 != gar_int_decode(buf + 10, 2, 0, 60, &result))
+ break;
+ session->driver.garmintxt.date.tm_sec = (int)result;
+ session->driver.garmintxt.subseconds = 0;
+ session->newdata.time =
+ (double)mkgmtime(&session->driver.garmintxt.date) +
+ session->driver.garmintxt.subseconds;
+ mask |= TIME_IS;
} while (0);
/* assume that possition is unknown; if the position is known we will fix status information later */
session->newdata.mode = MODE_NO_FIX;
session->gpsdata.status = STATUS_NO_FIX;
- mask |= MODE_SET | STATUS_SET | CLEAR_SET | REPORT_SET;
+ mask |= MODE_IS | STATUS_IS | CLEAR_IS | REPORT_IS;
/* process position */
do {
- double lat, lon;
- unsigned int degfrag;
- char status;
-
- /* Latitude, [NS]ddmmmmm */
- /* decode degrees of Latitude */
- if (0 != gar_decode((char *) session->packet.outbuffer+13, 3, "NS", 1.0, &lat)) break;
- /* decode minutes of Latitude */
- if (0 != gar_int_decode((char *) session->packet.outbuffer+16, 5, 0, 99999, &degfrag)) break;
- lat += degfrag * 100.0 / 60.0 / 100000.0;
- session->newdata.latitude = lat;
-
- /* Longitude, [EW]dddmmmmm */
- /* decode degrees of Longitude */
- if (0 != gar_decode((char *) session->packet.outbuffer+21, 4, "EW", 1.0, &lon)) break;
- /* decode minutes of Longitude */
- if (0 != gar_int_decode((char *) session->packet.outbuffer+25, 5, 0, 99999, &degfrag)) break;
- lon += degfrag * 100.0 / 60.0 / 100000.0;
- session->newdata.longitude = lon;
+ double lat, lon;
+ unsigned int degfrag;
+ char status;
+
+ /* Latitude, [NS]ddmmmmm */
+ /* decode degrees of Latitude */
+ if (0 !=
+ gar_decode((char *)session->packet.outbuffer + 13, 3, "NS", 1.0,
+ &lat))
+ break;
+ /* decode minutes of Latitude */
+ if (0 !=
+ gar_int_decode((char *)session->packet.outbuffer + 16, 5, 0,
+ 99999, &degfrag))
+ break;
+ lat += degfrag * 100.0 / 60.0 / 100000.0;
+ session->newdata.latitude = lat;
+
+ /* Longitude, [EW]dddmmmmm */
+ /* decode degrees of Longitude */
+ if (0 !=
+ gar_decode((char *)session->packet.outbuffer + 21, 4, "EW", 1.0,
+ &lon))
+ break;
+ /* decode minutes of Longitude */
+ if (0 !=
+ gar_int_decode((char *)session->packet.outbuffer + 25, 5, 0,
+ 99999, &degfrag))
+ break;
+ lon += degfrag * 100.0 / 60.0 / 100000.0;
+ session->newdata.longitude = lon;
/* fix mode, GPS status, [gGdDS_] */
- status = (char)session->packet.outbuffer[30];
-
- switch (status) {
- case 'G':
- case 'S': /* 'S' is DEMO mode, assume 3D position */
- session->newdata.mode = MODE_3D;
- session->gpsdata.status = STATUS_FIX;
- break;
- case 'D':
- session->newdata.mode = MODE_3D;
- session->gpsdata.status = STATUS_DGPS_FIX;
- break;
- case 'g':
- session->newdata.mode = MODE_2D;
- session->gpsdata.status = STATUS_FIX;
- break;
- case 'd':
- session->newdata.mode = MODE_2D;
- session->gpsdata.status = STATUS_DGPS_FIX;
- break;
- default:
- session->newdata.mode = MODE_NO_FIX;
- session->gpsdata.status = STATUS_NO_FIX;
- }
- mask |= MODE_SET | STATUS_SET | LATLON_SET;
+ status = (char)session->packet.outbuffer[30];
+
+ switch (status) {
+ case 'G':
+ case 'S': /* 'S' is DEMO mode, assume 3D position */
+ session->newdata.mode = MODE_3D;
+ session->gpsdata.status = STATUS_FIX;
+ break;
+ case 'D':
+ session->newdata.mode = MODE_3D;
+ session->gpsdata.status = STATUS_DGPS_FIX;
+ break;
+ case 'g':
+ session->newdata.mode = MODE_2D;
+ session->gpsdata.status = STATUS_FIX;
+ break;
+ case 'd':
+ session->newdata.mode = MODE_2D;
+ session->gpsdata.status = STATUS_DGPS_FIX;
+ break;
+ default:
+ session->newdata.mode = MODE_NO_FIX;
+ session->gpsdata.status = STATUS_NO_FIX;
+ }
+ mask |= MODE_IS | STATUS_IS | LATLON_IS;
} while (0);
/* EPH */
do {
- double eph;
- if (0 != gar_decode((char *) session->packet.outbuffer+31, 3, "", 1.0, &eph)) break;
+ double eph;
+ if (0 !=
+ gar_decode((char *)session->packet.outbuffer + 31, 3, "", 1.0,
+ &eph))
+ break;
/* eph is a circular error, sqrt(epx**2 + epy**2) */
- session->newdata.epx = session->newdata.epy = eph * (1/sqrt(2)) * (GPSD_CONFIDENCE/CEP50_SIGMA);
- mask |= HERR_SET;
+ session->newdata.epx = session->newdata.epy =
+ eph * (1 / sqrt(2)) * (GPSD_CONFIDENCE / CEP50_SIGMA);
+ mask |= HERR_IS;
} while (0);
/* Altitude */
do {
- double alt;
- if (0 != gar_decode((char *) session->packet.outbuffer+34, 6, "+-", 1.0, &alt)) break;
- session->newdata.altitude = alt;
- mask |= ALTITUDE_SET;
+ double alt;
+ if (0 !=
+ gar_decode((char *)session->packet.outbuffer + 34, 6, "+-", 1.0,
+ &alt))
+ break;
+ session->newdata.altitude = alt;
+ mask |= ALTITUDE_IS;
} while (0);
/* Velocity */
do {
- double ewvel, nsvel, speed, track;
- if (0 != gar_decode((char *) session->packet.outbuffer+40, 5, "EW", 10.0, &ewvel)) break;
- if (0 != gar_decode((char *) session->packet.outbuffer+45, 5, "NS", 10.0, &nsvel)) break;
- speed = sqrt(ewvel * ewvel + nsvel * nsvel); /* is this correct formula? Result is in mps */
- session->newdata.speed = speed;
- track = atan2(ewvel, nsvel) * RAD_2_DEG; /* is this correct formula? Result is in degrees */
- if (track < 0.0) track += 360.0;
- session->newdata.track = track;
- mask |= SPEED_SET | TRACK_SET;
+ double ewvel, nsvel, speed, track;
+ if (0 !=
+ gar_decode((char *)session->packet.outbuffer + 40, 5, "EW", 10.0,
+ &ewvel))
+ break;
+ if (0 !=
+ gar_decode((char *)session->packet.outbuffer + 45, 5, "NS", 10.0,
+ &nsvel))
+ break;
+ speed = sqrt(ewvel * ewvel + nsvel * nsvel); /* is this correct formula? Result is in mps */
+ session->newdata.speed = speed;
+ track = atan2(ewvel, nsvel) * RAD_2_DEG; /* is this correct formula? Result is in degrees */
+ if (track < 0.0)
+ track += 360.0;
+ session->newdata.track = track;
+ mask |= SPEED_IS | TRACK_IS;
} while (0);
/* Climb (vertical velocity) */
do {
- double climb;
- if (0 != gar_decode((char *) session->packet.outbuffer+50, 5, "UD", 100.0, &climb)) break;
- session->newdata.climb = climb; /* climb in mps */
- mask |= CLIMB_SET;
+ double climb;
+ if (0 !=
+ gar_decode((char *)session->packet.outbuffer + 50, 5, "UD", 100.0,
+ &climb))
+ break;
+ session->newdata.climb = climb; /* climb in mps */
+ mask |= CLIMB_IS;
} while (0);
- gpsd_report(LOG_DATA, "GTXT: time=%.2f, lat=%.2f lon=%.2f alt=%.2f speed=%.2f track=%.2f climb=%.2f exp=%.2f epy=%.2f mode=%d status=%d mask=%s\n",
- session->newdata.time,
- session->newdata.latitude,
- session->newdata.longitude,
- session->newdata.altitude,
- session->newdata.speed,
- session->newdata.track,
- session->newdata.climb,
- session->newdata.epx,
- session->newdata.epy,
- session->newdata.mode,
- session->gpsdata.status,
- gpsd_maskdump(mask));
- return mask;
+ gpsd_report(LOG_DATA,
+ "GTXT: time=%.2f, lat=%.2f lon=%.2f alt=%.2f speed=%.2f track=%.2f climb=%.2f exp=%.2f epy=%.2f mode=%d status=%d mask=%s\n",
+ session->newdata.time, session->newdata.latitude,
+ session->newdata.longitude, session->newdata.altitude,
+ session->newdata.speed, session->newdata.track,
+ session->newdata.climb, session->newdata.epx,
+ session->newdata.epy, session->newdata.mode,
+ session->gpsdata.status, gpsd_maskdump(mask));
+ return mask;
}
#endif /* GARMINTXT_ENABLE */
-
diff --git a/driver_italk.c b/driver_italk.c
index c258fd11..9cd2e8cf 100644
--- a/driver_italk.c
+++ b/driver_italk.c
@@ -23,12 +23,17 @@
#include "driver_italk.h"
static gps_mask_t italk_parse(struct gps_device_t *, unsigned char *, size_t);
-static gps_mask_t decode_itk_navfix(struct gps_device_t *, unsigned char *, size_t);
-static gps_mask_t decode_itk_prnstatus(struct gps_device_t *, unsigned char *, size_t);
-static gps_mask_t decode_itk_utcionomodel(struct gps_device_t *, unsigned char *, size_t);
-static gps_mask_t decode_itk_subframe(struct gps_device_t *, unsigned char *, size_t);
-
-static gps_mask_t decode_itk_navfix(struct gps_device_t *session, unsigned char *buf, size_t len)
+static gps_mask_t decode_itk_navfix(struct gps_device_t *, unsigned char *,
+ size_t);
+static gps_mask_t decode_itk_prnstatus(struct gps_device_t *, unsigned char *,
+ size_t);
+static gps_mask_t decode_itk_utcionomodel(struct gps_device_t *,
+ unsigned char *, size_t);
+static gps_mask_t decode_itk_subframe(struct gps_device_t *, unsigned char *,
+ size_t);
+
+static gps_mask_t decode_itk_navfix(struct gps_device_t *session,
+ unsigned char *buf, size_t len)
{
unsigned int tow;
unsigned short gps_week, flags, cflags, pflags;
@@ -42,54 +47,57 @@ static gps_mask_t decode_itk_navfix(struct gps_device_t *session, unsigned char
return -1;
}
- flags = (ushort)getleuw(buf, 7 + 4);
- cflags = (ushort)getleuw(buf, 7 + 6);
- pflags = (ushort)getleuw(buf, 7 + 8);
+ flags = (ushort) getleuw(buf, 7 + 4);
+ cflags = (ushort) getleuw(buf, 7 + 6);
+ pflags = (ushort) getleuw(buf, 7 + 8);
session->gpsdata.status = STATUS_NO_FIX;
session->newdata.mode = MODE_NO_FIX;
- mask = ONLINE_SET | MODE_SET | STATUS_SET | CLEAR_SET;
+ mask = ONLINE_IS | MODE_IS | STATUS_IS | CLEAR_IS;
/* just bail out if this fix is not marked valid */
- if (0 != (pflags & FIX_FLAG_MASK_INVALID) || 0 == (flags & FIXINFO_FLAG_VALID))
+ if (0 != (pflags & FIX_FLAG_MASK_INVALID)
+ || 0 == (flags & FIXINFO_FLAG_VALID))
return mask;
- gps_week = (ushort)getlesw(buf, 7 + 82);
- tow = (uint)getleul(buf, 7 + 84);
- t = gpstime_to_unix((int)gps_week, tow/1000.0) - session->context->leap_seconds;
+ gps_week = (ushort) getlesw(buf, 7 + 82);
+ tow = (uint) getleul(buf, 7 + 84);
+ t = gpstime_to_unix((int)gps_week,
+ tow / 1000.0) - session->context->leap_seconds;
session->newdata.time = t;
- mask |= TIME_SET;
-
- epx = (double)(getlesl(buf, 7 + 96)/100.0);
- epy = (double)(getlesl(buf, 7 + 100)/100.0);
- epz = (double)(getlesl(buf, 7 + 104)/100.0);
- evx = (double)(getlesl(buf, 7 + 186)/1000.0);
- evy = (double)(getlesl(buf, 7 + 190)/1000.0);
- evz = (double)(getlesl(buf, 7 + 194)/1000.0);
+ mask |= TIME_IS;
+
+ epx = (double)(getlesl(buf, 7 + 96) / 100.0);
+ epy = (double)(getlesl(buf, 7 + 100) / 100.0);
+ epz = (double)(getlesl(buf, 7 + 104) / 100.0);
+ evx = (double)(getlesl(buf, 7 + 186) / 1000.0);
+ evy = (double)(getlesl(buf, 7 + 190) / 1000.0);
+ evz = (double)(getlesl(buf, 7 + 194) / 1000.0);
ecef_to_wgs84fix(&session->newdata, &session->gpsdata.separation,
epx, epy, epz, evx, evy, evz);
- mask |= LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET ;
- eph = (double)(getlesl(buf, 7 + 252)/100.0);
+ mask |= LATLON_IS | ALTITUDE_IS | SPEED_IS | TRACK_IS | CLIMB_IS;
+ eph = (double)(getlesl(buf, 7 + 252) / 100.0);
/* eph is a circular error, sqrt(epx**2 + epy**2) */
- session->newdata.epx = session->newdata.epy = eph/sqrt(2);
- session->newdata.eps = (double)(getlesl(buf, 7 + 254)/100.0);
+ session->newdata.epx = session->newdata.epy = eph / sqrt(2);
+ session->newdata.eps = (double)(getlesl(buf, 7 + 254) / 100.0);
- #define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
session->gpsdata.satellites_used =
(int)MAX(getleuw(buf, 7 + 12), getleuw(buf, 7 + 14));
- mask |= USED_SET ;
+ mask |= USED_IS;
if (flags & FIX_CONV_DOP_VALID) {
clear_dop(&session->gpsdata.dop);
- session->gpsdata.dop.hdop = (double)(getleuw(buf, 7 + 56)/100.0);
- session->gpsdata.dop.gdop = (double)(getleuw(buf, 7 + 58)/100.0);
- session->gpsdata.dop.pdop = (double)(getleuw(buf, 7 + 60)/100.0);
- session->gpsdata.dop.vdop = (double)(getleuw(buf, 7 + 62)/100.0);
- session->gpsdata.dop.tdop = (double)(getleuw(buf, 7 + 64)/100.0);
- mask |= DOP_SET;
+ session->gpsdata.dop.hdop = (double)(getleuw(buf, 7 + 56) / 100.0);
+ session->gpsdata.dop.gdop = (double)(getleuw(buf, 7 + 58) / 100.0);
+ session->gpsdata.dop.pdop = (double)(getleuw(buf, 7 + 60) / 100.0);
+ session->gpsdata.dop.vdop = (double)(getleuw(buf, 7 + 62) / 100.0);
+ session->gpsdata.dop.tdop = (double)(getleuw(buf, 7 + 64) / 100.0);
+ mask |= DOP_IS;
}
- if ((pflags & FIX_FLAG_MASK_INVALID) == 0 && (flags & FIXINFO_FLAG_VALID) != 0) {
+ if ((pflags & FIX_FLAG_MASK_INVALID) == 0
+ && (flags & FIXINFO_FLAG_VALID) != 0) {
if (pflags & FIX_FLAG_3DFIX)
session->newdata.mode = MODE_3D;
else
@@ -101,26 +109,21 @@ static gps_mask_t decode_itk_navfix(struct gps_device_t *session, unsigned char
session->gpsdata.status = STATUS_FIX;
}
- gpsd_report(LOG_DATA, "NAV_FIX: time=%.2f, lat=%.2f lon=%.2f alt=%.f speed=%.2f track=%.2f climb=%.2f mode=%d status=%d gdop=%.2f pdop=%.2f hdop=%.2f vdop=%.2f tdop=%.2f mask=%s\n",
- session->newdata.time,
- session->newdata.latitude,
- session->newdata.longitude,
- session->newdata.altitude,
- session->newdata.speed,
- session->newdata.track,
- session->newdata.climb,
- session->newdata.mode,
- session->gpsdata.status,
- session->gpsdata.dop.gdop,
- session->gpsdata.dop.pdop,
- session->gpsdata.dop.hdop,
- session->gpsdata.dop.vdop,
- session->gpsdata.dop.tdop,
+ gpsd_report(LOG_DATA,
+ "NAV_FIX: time=%.2f, lat=%.2f lon=%.2f alt=%.f speed=%.2f track=%.2f climb=%.2f mode=%d status=%d gdop=%.2f pdop=%.2f hdop=%.2f vdop=%.2f tdop=%.2f mask=%s\n",
+ session->newdata.time, session->newdata.latitude,
+ session->newdata.longitude, session->newdata.altitude,
+ session->newdata.speed, session->newdata.track,
+ session->newdata.climb, session->newdata.mode,
+ session->gpsdata.status, session->gpsdata.dop.gdop,
+ session->gpsdata.dop.pdop, session->gpsdata.dop.hdop,
+ session->gpsdata.dop.vdop, session->gpsdata.dop.tdop,
gpsd_maskdump(mask));
return mask;
}
-static gps_mask_t decode_itk_prnstatus(struct gps_device_t *session, unsigned char *buf, size_t len)
+static gps_mask_t decode_itk_prnstatus(struct gps_device_t *session,
+ unsigned char *buf, size_t len)
{
unsigned int i, tow, nsv, nchan, st;
unsigned short gps_week;
@@ -129,29 +132,28 @@ static gps_mask_t decode_itk_prnstatus(struct gps_device_t *session, unsigned ch
if (len < 62) {
gpsd_report(LOG_PROG, "ITALK: runt PRN_STATUS (len=%zu)\n", len);
- mask = ERROR_SET;
- }
- else
- {
- gps_week = (ushort)getleuw(buf, 7 + 4);
- tow = (uint)getleul(buf, 7 + 6);
- t = gpstime_to_unix((int)gps_week, tow/1000.0) - session->context->leap_seconds;
+ mask = ERROR_IS;
+ } else {
+ gps_week = (ushort) getleuw(buf, 7 + 4);
+ tow = (uint) getleul(buf, 7 + 6);
+ t = gpstime_to_unix((int)gps_week,
+ tow / 1000.0) - session->context->leap_seconds;
session->gpsdata.skyview_time = t;
gpsd_zero_satellites(&session->gpsdata);
nsv = 0;
- nchan = (unsigned int)getleuw(buf, 7 +50);
+ nchan = (unsigned int)getleuw(buf, 7 + 50);
if (nchan > MAX_NR_VISIBLE_PRNS)
nchan = MAX_NR_VISIBLE_PRNS;
for (i = st = 0; i < nchan; i++) {
- unsigned int off = 7+ 52 + 10 * i;
+ unsigned int off = 7 + 52 + 10 * i;
unsigned short flags;
- flags = (ushort)getleuw(buf, off);
- session->gpsdata.ss[i] = (float)(getleuw(buf, off+2)&0xff);
- session->gpsdata.PRN[i] = (int)getleuw(buf, off+4)&0xff;
- session->gpsdata.elevation[i] = (int)getlesw(buf, off+6)&0xff;
- session->gpsdata.azimuth[i] = (int)getlesw(buf, off+8)&0xff;
+ flags = (ushort) getleuw(buf, off);
+ session->gpsdata.ss[i] = (float)(getleuw(buf, off + 2) & 0xff);
+ session->gpsdata.PRN[i] = (int)getleuw(buf, off + 4) & 0xff;
+ session->gpsdata.elevation[i] = (int)getlesw(buf, off + 6) & 0xff;
+ session->gpsdata.azimuth[i] = (int)getlesw(buf, off + 8) & 0xff;
if (session->gpsdata.PRN[i]) {
st++;
if (flags & PRN_FLAG_USE_IN_NAV)
@@ -160,7 +162,7 @@ static gps_mask_t decode_itk_prnstatus(struct gps_device_t *session, unsigned ch
}
session->gpsdata.satellites_visible = (int)st;
session->gpsdata.satellites_used = (int)nsv;
- mask = USED_SET | SATELLITE_SET;;
+ mask = USED_IS | SATELLITE_IS;;
gpsd_report(LOG_DATA,
"PRN_STATUS: time=%.2f visible=%d used=%d mask={USED|SATELLITE}\n",
@@ -172,7 +174,8 @@ static gps_mask_t decode_itk_prnstatus(struct gps_device_t *session, unsigned ch
return mask;
}
-static gps_mask_t decode_itk_utcionomodel(struct gps_device_t *session, unsigned char *buf, size_t len)
+static gps_mask_t decode_itk_utcionomodel(struct gps_device_t *session,
+ unsigned char *buf, size_t len)
{
unsigned int tow;
int leap;
@@ -181,11 +184,12 @@ static gps_mask_t decode_itk_utcionomodel(struct gps_device_t *session, unsigned
if (len != 64) {
gpsd_report(LOG_PROG,
- "ITALK: bad UTC_IONO_MODEL (len %zu, should be 64)\n", len);
- return ERROR_SET;
+ "ITALK: bad UTC_IONO_MODEL (len %zu, should be 64)\n",
+ len);
+ return ERROR_IS;
}
- flags = (ushort)getleuw(buf, 7);
+ flags = (ushort) getleuw(buf, 7);
if (0 == (flags & UTC_IONO_MODEL_UTCVALID))
return 0;
@@ -193,18 +197,20 @@ static gps_mask_t decode_itk_utcionomodel(struct gps_device_t *session, unsigned
if (session->context->leap_seconds < leap)
session->context->leap_seconds = leap;
- gps_week = (ushort)getleuw(buf, 7 + 36);
- tow = (uint)getleul(buf, 7 + 38);
- t = gpstime_to_unix((int)gps_week, tow/1000.0) - session->context->leap_seconds;
+ gps_week = (ushort) getleuw(buf, 7 + 36);
+ tow = (uint) getleul(buf, 7 + 38);
+ t = gpstime_to_unix((int)gps_week,
+ tow / 1000.0) - session->context->leap_seconds;
session->newdata.time = t;
gpsd_report(LOG_DATA,
"UTC_IONO_MODEL: time=%.2f mask={TIME}\n",
session->newdata.time);
- return TIME_SET;
+ return TIME_IS;
}
-static gps_mask_t decode_itk_subframe(struct gps_device_t *session, unsigned char *buf, size_t len)
+static gps_mask_t decode_itk_subframe(struct gps_device_t *session,
+ unsigned char *buf, size_t len)
{
unsigned short flags, prn, sf;
unsigned int words[10];
@@ -212,18 +218,18 @@ static gps_mask_t decode_itk_subframe(struct gps_device_t *session, unsigned cha
if (len != 64) {
gpsd_report(LOG_PROG,
"ITALK: bad SUBFRAME (len %zu, should be 64)\n", len);
- return ERROR_SET;
+ return ERROR_IS;
}
- flags = (ushort)getleuw(buf, 7 + 4);
- prn = (ushort)getleuw(buf, 7 + 6);
- sf = (ushort)getleuw(buf, 7 + 8);
+ flags = (ushort) getleuw(buf, 7 + 4);
+ prn = (ushort) getleuw(buf, 7 + 6);
+ sf = (ushort) getleuw(buf, 7 + 8);
gpsd_report(LOG_PROG, "iTalk SUBFRAME prn %u sf %u - decode %s %s\n",
prn, sf,
flags & SUBFRAME_WORD_FLAG_MASK ? "error" : "ok",
flags & SUBFRAME_GPS_PREAMBLE_INVERTED ? "(inverted)" : "");
if (flags & SUBFRAME_WORD_FLAG_MASK)
- return ONLINE_SET | ERROR_SET; // don't try decode an erroneous packet
+ return ONLINE_IS | ERROR_IS; // don't try decode an erroneous packet
/*
* Timo says "SUBRAME message contains decoded navigation message subframe
@@ -243,11 +249,12 @@ static gps_mask_t decode_itk_subframe(struct gps_device_t *session, unsigned cha
/*@+type@*/
gpsd_interpret_subframe(session, words);
- return ONLINE_SET;
+ return ONLINE_IS;
}
/*@ +charint @*/
-static gps_mask_t italk_parse(struct gps_device_t *session, unsigned char *buf, size_t len)
+static gps_mask_t italk_parse(struct gps_device_t *session,
+ unsigned char *buf, size_t len)
{
unsigned int type;
gps_mask_t mask = 0;
@@ -255,18 +262,17 @@ static gps_mask_t italk_parse(struct gps_device_t *session, unsigned char *buf,
if (len == 0)
return 0;
- type = (uint)getub(buf, 4);
+ type = (uint) getub(buf, 4);
/* we may need to dump the raw packet */
gpsd_report(LOG_RAW, "raw italk packet type 0x%02x length %zu: %s\n",
- type, len, gpsd_hexdump_wrapper(buf, len, LOG_RAW));
+ type, len, gpsd_hexdump_wrapper(buf, len, LOG_RAW));
session->cycle_end_reliable = true;
- switch (type)
- {
+ switch (type) {
case ITALK_NAV_FIX:
gpsd_report(LOG_IO, "iTalk NAV_FIX len %zu\n", len);
- mask = decode_itk_navfix(session, buf, len) | (CLEAR_SET|REPORT_SET);
+ mask = decode_itk_navfix(session, buf, len) | (CLEAR_IS | REPORT_IS);
break;
case ITALK_PRN_STATUS:
gpsd_report(LOG_IO, "iTalk PRN_STATUS len %zu\n", len);
@@ -338,14 +344,15 @@ static gps_mask_t italk_parse(struct gps_device_t *session, unsigned char *buf,
gpsd_report(LOG_IO, "iTalk unknown packet: id 0x%02x length %zu\n",
type, len);
}
- if (mask == ERROR_SET)
+ if (mask == ERROR_IS)
mask = 0;
else
(void)snprintf(session->gpsdata.tag, sizeof(session->gpsdata.tag),
- "ITK-%02x",type);
+ "ITK-%02x", type);
- return mask | ONLINE_SET;
+ return mask | ONLINE_IS;
}
+
/*@ -charint @*/
static gps_mask_t italk_parse_input(struct gps_device_t *session)
@@ -353,7 +360,8 @@ static gps_mask_t italk_parse_input(struct gps_device_t *session)
gps_mask_t st;
if (session->packet.type == ITALK_PACKET) {
- st = italk_parse(session, session->packet.outbuffer, session->packet.outbuflen);
+ st = italk_parse(session, session->packet.outbuffer,
+ session->packet.outbuflen);
session->gpsdata.dev.driver_mode = MODE_BINARY; /* binary */
return st;
#ifdef NMEA_ENABLE
@@ -368,33 +376,34 @@ static gps_mask_t italk_parse_input(struct gps_device_t *session)
#ifdef ALLOW_CONTROLSEND
/*@ +charint -usedef -compdef @*/
-static ssize_t italk_control_send(struct gps_device_t *session,
- char *msg, size_t msglen)
+static ssize_t italk_control_send(struct gps_device_t *session,
+ char *msg, size_t msglen)
{
- ssize_t status;
+ ssize_t status;
- /*@ -mayaliasunique **/
+ /*@ -mayaliasunique @*/
session->msgbuflen = msglen;
(void)memcpy(session->msgbuf, msg, msglen);
- /*@ +mayaliasunique **/
+ /*@ +mayaliasunique @*/
/* we may need to dump the message */
gpsd_report(LOG_IO, "writing italk control type %02x:%s\n",
msg[0], gpsd_hexdump_wrapper(msg, msglen, LOG_IO));
status = write(session->gpsdata.gps_fd, msg, msglen);
(void)tcdrain(session->gpsdata.gps_fd);
- return(status);
+ return status;
}
+
/*@ -charint +usedef +compdef @*/
#endif /* ALLOW_CONTROLSEND */
-static bool italk_set_mode(struct gps_device_t *session UNUSED,
- speed_t speed UNUSED,
- char parity UNUSED, int stopbits UNUSED,
+static bool italk_set_mode(struct gps_device_t *session UNUSED,
+ speed_t speed UNUSED,
+ char parity UNUSED, int stopbits UNUSED,
bool mode UNUSED)
{
#if 0
/*@ +charint @*/
- char msg[] = {0,};
+ char msg[] = { 0, };
/* HACK THE MESSAGE */
@@ -402,24 +411,23 @@ static bool italk_set_mode(struct gps_device_t *session UNUSED,
/*@ +charint @*/
#endif
- return false; /* until this actually works */
+ return false; /* until this actually works */
}
#ifdef ALLOW_RECONFIGURE
-static bool italk_speed(struct gps_device_t *session,
+static bool italk_speed(struct gps_device_t *session,
speed_t speed, char parity, int stopbits)
{
return italk_set_mode(session, speed, parity, stopbits, true);
}
-static void italk_mode(struct gps_device_t *session, int mode)
+static void italk_mode(struct gps_device_t *session, int mode)
{
if (mode == MODE_NMEA) {
- (void)italk_set_mode(session,
+ (void)italk_set_mode(session,
session->gpsdata.dev.baudrate,
(char)session->gpsdata.dev.parity,
- (int)session->gpsdata.dev.stopbits,
- false);
+ (int)session->gpsdata.dev.stopbits, false);
}
}
#endif /* ALLOW_RECONFIGURE */
@@ -430,12 +438,11 @@ static void italk_event_hook(struct gps_device_t *session, event_t event)
* FIXME: It might not be necessary to call this on reactivate.
* Experiment to see if the holds its settings through a close.
*/
- if ((event == event_identified || event == event_reactivate) && session->packet.type == NMEA_PACKET)
- (void)italk_set_mode(session,
- session->gpsdata.dev.baudrate,
+ if ((event == event_identified || event == event_reactivate)
+ && session->packet.type == NMEA_PACKET)
+ (void)italk_set_mode(session, session->gpsdata.dev.baudrate,
(char)session->gpsdata.dev.parity,
- (int)session->gpsdata.dev.stopbits,
- true);
+ (int)session->gpsdata.dev.stopbits, true);
}
#ifdef __not_yet__
@@ -447,7 +454,7 @@ static void italk_ping(struct gps_device_t *session)
}
#endif /* __not_yet__ */
-/* this is everything we export */
+/* *INDENT-OFF* */
const struct gps_type_t italk_binary =
{
.type_name = "iTalk binary", /* full name of type */
@@ -468,7 +475,11 @@ const struct gps_type_t italk_binary =
#ifdef ALLOW_CONTROLSEND
.control_send = italk_control_send, /* how to send a control string */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL, /* no method for NTP fudge factor */
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* defined(ITRAX_ENABLE) && defined(BINARY_ENABLE) */
#ifdef ANCIENT_ITRAX_ENABLE
@@ -500,19 +511,20 @@ const struct gps_type_t italk_binary =
*/
#define ITRAX_MODESTRING "$PFST,NMEA,A007,%d\r\n"
-static int literal_send(int fd, const char *fmt, ... )
+static int literal_send(int fd, const char *fmt, ...)
/* ship a raw command to the GPS */
{
va_list ap;
- va_start(ap, fmt) ;
+ va_start(ap, fmt);
(void)vsnprintf(session->msgbuf, sizeof(session->msgbuf), fmt, ap);
va_end(ap);
session->msgbuflen = strlen(session->msgbuf);
return gpsd_write(fd, session->msgbuf, session->msgbuflen);
}
-static void itrax_probe_subtype(struct gps_device_t *session, unsigned int seq)
+static void itrax_probe_subtype(struct gps_device_t *session,
+ unsigned int seq)
/* start it reporting */
{
if (seq == 0) {
@@ -522,12 +534,14 @@ static void itrax_probe_subtype(struct gps_device_t *session, unsigned int seq)
time_t intfixtime;
char buf[31], frac[6];
fractional = modf(timestamp(), &integral);
- intfixtime = (time_t)integral;
+ intfixtime = (time_t) integral;
(void)gmtime_r(&intfixtime, &when);
/* FIXME: so what if my local clock is wrong? */
- (void)strftime(buf, sizeof(buf), "$PFST,INITAID,%H%M%S.XX,%d%m%y\r\n", &when);
+ (void)strftime(buf, sizeof(buf), "$PFST,INITAID,%H%M%S.XX,%d%m%y\r\n",
+ &when);
(void)snprintf(frac, sizeof(frac), "%.2f", fractional);
- buf[21] = frac[2]; buf[22] = frac[3];
+ buf[21] = frac[2];
+ buf[22] = frac[3];
(void)literal_send(session->gpsdata.gps_fd, buf);
/* maybe this should be considered a reconfiguration? */
(void)literal_send(session->gpsdata.gps_fd, "$PFST,START\r\n");
@@ -541,22 +555,25 @@ static void itrax_configurator(struct gps_device_t event_t event, *session)
if (event == event_configure && session.packet_counter == 0) {
(void)literal_send(session->gpsdata.gps_fd, "$PFST,SYNCMODE,1\r\n");
(void)literal_send(session->gpsdata.gps_fd,
- ITRAX_MODESTRING, session->gpsdata.baudrate);
+ ITRAX_MODESTRING, session->gpsdata.baudrate);
}
}
-static bool itrax_speed(struct gps_device_t *session,
- speed_t speed, char parity UNUSED, int stopbits UNUSED)
+static bool itrax_speed(struct gps_device_t *session,
+ speed_t speed, char parity UNUSED,
+ int stopbits UNUSED)
/* change the baud rate */
{
- return literal_send(session->gpsdata.gps_fd, ITRAX_MODESTRING, speed) >= 0;
+ return literal_send(session->gpsdata.gps_fd, ITRAX_MODESTRING,
+ speed) >= 0;
return false;
}
static bool itrax_rate(struct gps_device_t *session, double rate)
/* change the sample rate of the GPS */
{
- return literal_send(session->gpsdata.gps_fd, "$PSFT,FIXRATE,%d\r\n", rate) >= 0;
+ return literal_send(session->gpsdata.gps_fd, "$PSFT,FIXRATE,%d\r\n",
+ rate) >= 0;
}
#endif /* ALLOW_RECONFIGURE */
@@ -570,6 +587,7 @@ static void itrax_wrap(struct gps_device_t *session)
}
/*@ -redef @*/
+/* *INDENT-OFF* */
const static struct gps_type_t itrax = {
.type_name = "iTrax", /* full name of type */
.packet_type = NMEA_PACKET; /* associated lexer packet type */
@@ -589,7 +607,10 @@ const static struct gps_type_t itrax = {
#ifdef ALLOW_CONTROLSEND
.control_send = garmin_control_send, /* send raw bytes */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL, /* no method for NTP fudge factor */
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
/*@ -redef @*/
#endif /* ITRAX_ENABLE */
-
diff --git a/driver_navcom.c b/driver_navcom.c
index 95822c8f..f20e7086 100644
--- a/driver_navcom.c
+++ b/driver_navcom.c
@@ -74,21 +74,23 @@
static uint8_t checksum(unsigned char *buf, size_t len)
{
size_t n;
- uint8_t csum = (uint8_t)0x00;
- for(n = 0; n < len; n++)
- csum ^= buf[n];
+ uint8_t csum = (uint8_t) 0x00;
+ for (n = 0; n < len; n++)
+ csum ^= buf[n];
return csum;
}
-static bool navcom_send_cmd(struct gps_device_t *session, unsigned char *cmd, size_t len)
+static bool navcom_send_cmd(struct gps_device_t *session, unsigned char *cmd,
+ size_t len)
{
gpsd_report(LOG_RAW, "Navcom: command dump: %s\n",
- gpsd_hexdump_wrapper(cmd, len, LOG_RAW));
- return (gpsd_write(session, cmd, len) == (ssize_t)len);
+ gpsd_hexdump_wrapper(cmd, len, LOG_RAW));
+ return (gpsd_write(session, cmd, len) == (ssize_t) len);
}
/* Data Request */
-static void navcom_cmd_0x20(struct gps_device_t *session, uint8_t block_id, uint16_t rate)
+static void navcom_cmd_0x20(struct gps_device_t *session, uint8_t block_id,
+ uint16_t rate)
{
unsigned char msg[18];
putbyte(msg, 0, 0x02);
@@ -97,20 +99,19 @@ static void navcom_cmd_0x20(struct gps_device_t *session, uint8_t block_id, uint
putbyte(msg, 3, 0x20); /* Cmd ID */
putleword(msg, 4, 0x000e); /* Length */
putbyte(msg, 6, 0x00); /* Action */
- putbyte(msg, 7, 0x01); /* Count of blocks */
+ putbyte(msg, 7, 0x01); /* Count of blocks */
putbyte(msg, 8, block_id); /* Data Block ID */
putbyte(msg, 9, 0x02); /* Logical Ports */
putleword(msg, 10, rate); /* Data rate */
putbyte(msg, 12, 0x71);
putbyte(msg, 13, 0x00);
putleword(msg, 14, 0x0000);
- putbyte(msg, 16, checksum(msg+3, 13));
+ putbyte(msg, 16, checksum(msg + 3, 13));
putbyte(msg, 17, 0x03);
(void)navcom_send_cmd(session, msg, 18);
gpsd_report(LOG_PROG,
"Navcom: sent command 0x20 (Data Request) "
- "- data block id = %02x at rate %02x\n",
- block_id, rate);
+ "- data block id = %02x at rate %02x\n", block_id, rate);
}
/*@ unused @*/
@@ -127,7 +128,7 @@ static void UNUSED navcom_cmd_0x3f(struct gps_device_t *session)
putbyte(msg, 7, 0x00); /* Reserved */
putbyte(msg, 8, 0x02); /* Link LED setting */
putbyte(msg, 9, 0x0a); /* Battery LED setting */
- putbyte(msg, 10, checksum(msg+3, 7));
+ putbyte(msg, 10, checksum(msg + 3, 7));
putbyte(msg, 11, 0x03);
(void)navcom_send_cmd(session, msg, 12);
gpsd_report(LOG_PROG,
@@ -135,7 +136,8 @@ static void UNUSED navcom_cmd_0x3f(struct gps_device_t *session)
}
/* Test Support Block - Blinks the LEDs */
-static void navcom_cmd_0x1c(struct gps_device_t *session, uint8_t mode, uint8_t length)
+static void navcom_cmd_0x1c(struct gps_device_t *session, uint8_t mode,
+ uint8_t length)
{
unsigned char msg[12];
putbyte(msg, 0, 0x02);
@@ -143,15 +145,14 @@ static void navcom_cmd_0x1c(struct gps_device_t *session, uint8_t mode, uint8_t
putbyte(msg, 2, 0x66);
putbyte(msg, 3, 0x1c); /* Cmd ID */
putleword(msg, 4, 0x0008);
- putbyte(msg, 6, 0x04); /* Use ACK/NAK */
+ putbyte(msg, 6, 0x04); /* Use ACK/NAK */
putbyte(msg, 7, mode); /* 0x01 or 0x02 */
- putbyte(msg, 8, length); /* Only if mode == 0x01 */
+ putbyte(msg, 8, length); /* Only if mode == 0x01 */
putbyte(msg, 9, 0x00);
- putbyte(msg, 10, checksum(msg+3, 7));
+ putbyte(msg, 10, checksum(msg + 3, 7));
putbyte(msg, 11, 0x03);
(void)navcom_send_cmd(session, msg, 12);
- gpsd_report(LOG_PROG,
- "Navcom: sent command 0x1c (Test Support Block)\n");
+ gpsd_report(LOG_PROG, "Navcom: sent command 0x1c (Test Support Block)\n");
gpsd_report(LOG_IO,
"Navcom: command 0x1c mode = %02x, length = %u\n",
mode, length);
@@ -159,21 +160,22 @@ static void navcom_cmd_0x1c(struct gps_device_t *session, uint8_t mode, uint8_t
#ifdef ALLOW_RECONFIGURE
/* Serial Port Configuration */
-static void navcom_cmd_0x11(struct gps_device_t *session, uint8_t port_selection)
+static void navcom_cmd_0x11(struct gps_device_t *session,
+ uint8_t port_selection)
{
/* NOTE - We only allow changing one port at a time,
- although the message supports doing both at once. */
+ * although the message supports doing both at once. */
unsigned char msg[12];
putbyte(msg, 0, 0x02);
putbyte(msg, 1, 0x99);
putbyte(msg, 2, 0x66);
putbyte(msg, 3, 0x11); /* Cmd ID */
- putleword(msg, 4, 0x0008); /* Length */
- putbyte(msg, 6, 0x04); /* Action - Use ACK/NAK) */
+ putleword(msg, 4, 0x0008); /* Length */
+ putbyte(msg, 6, 0x04); /* Action - Use ACK/NAK) */
putbyte(msg, 7, port_selection);
- putbyte(msg, 8, 0x00); /* Reserved */
- putbyte(msg, 9, 0x00); /* Reserved */
- putbyte(msg, 10, checksum(msg+3, 7));
+ putbyte(msg, 8, 0x00); /* Reserved */
+ putbyte(msg, 9, 0x00); /* Reserved */
+ putbyte(msg, 10, checksum(msg + 3, 7));
putbyte(msg, 11, 0x03);
(void)navcom_send_cmd(session, msg, 12);
gpsd_report(LOG_PROG,
@@ -186,17 +188,17 @@ static void navcom_cmd_0x11(struct gps_device_t *session, uint8_t port_selection
static void navcom_event_hook(struct gps_device_t *session, event_t event)
{
if (event == event_wakeup) {
- /* NOTE - This allows us to know into which of the unit's various
- serial ports we are connected.
- Its value gets updated every time we receive a 0x06 (Ack)
- message. Note that if commands are being fed into the
- unit from more than one port (which is entirely possible
- although not necessarily a bright idea), there is a good
- chance that we might misidentify our port */
+ /* NOTE - This allows us to know into which of the unit's various
+ * serial ports we are connected.
+ * Its value gets updated every time we receive a 0x06 (Ack)
+ * message. Note that if commands are being fed into the
+ * unit from more than one port (which is entirely possible
+ * although not necessarily a bright idea), there is a good
+ * chance that we might misidentify our port */
/*@ -type @*/
- navcom_cmd_0x1c(session, 0x02, 0); /* Test Support Block */
- navcom_cmd_0x20(session, 0xae, 0x0000); /* Identification Block */
- navcom_cmd_0x20(session, 0x86, 0x000a); /* Channel Status */
+ navcom_cmd_0x1c(session, 0x02, 0); /* Test Support Block */
+ navcom_cmd_0x20(session, 0xae, 0x0000); /* Identification Block */
+ navcom_cmd_0x20(session, 0x86, 0x000a); /* Channel Status */
/*@ +type @*/
}
/* Request the following messages: */
@@ -206,16 +208,16 @@ static void navcom_event_hook(struct gps_device_t *session, event_t event)
*/
if (event == event_identified || event == event_reactivate) {
/*@ +charint @*/
- navcom_cmd_0x1c(session, 0x01, 5); /* Blink LEDs on receiver */
- navcom_cmd_0x20(session, 0xae, 0x1770); /* Identification Block - send every 10 min*/
- navcom_cmd_0x20(session, 0xb1, 0x4000); /* PVT Block */
- navcom_cmd_0x20(session, 0xb5, 0x00c8); /* Pseudorange Noise Statistics - send every 20s */
- navcom_cmd_0x20(session, 0xb0, 0x4000); /* Raw Meas Data Block */
- navcom_cmd_0x20(session, 0x81, 0x0000); /* Packed Ephemeris Data - send once */
- navcom_cmd_0x20(session, 0x81, 0x4000); /* Packed Ephemeris Data */
- navcom_cmd_0x20(session, 0x86, 0x4000); /* Channel Status */
- navcom_cmd_0x20(session, 0x83, 0x4000); /* Ionosphere and UTC Data */
- navcom_cmd_0x20(session, 0xef, 0x0bb8); /* Clock Drift - send every 5 min */
+ navcom_cmd_0x1c(session, 0x01, 5); /* Blink LEDs on receiver */
+ navcom_cmd_0x20(session, 0xae, 0x1770); /* Identification Block - send every 10 min */
+ navcom_cmd_0x20(session, 0xb1, 0x4000); /* PVT Block */
+ navcom_cmd_0x20(session, 0xb5, 0x00c8); /* Pseudorange Noise Statistics - send every 20s */
+ navcom_cmd_0x20(session, 0xb0, 0x4000); /* Raw Meas Data Block */
+ navcom_cmd_0x20(session, 0x81, 0x0000); /* Packed Ephemeris Data - send once */
+ navcom_cmd_0x20(session, 0x81, 0x4000); /* Packed Ephemeris Data */
+ navcom_cmd_0x20(session, 0x86, 0x4000); /* Channel Status */
+ navcom_cmd_0x20(session, 0x83, 0x4000); /* Ionosphere and UTC Data */
+ navcom_cmd_0x20(session, 0xef, 0x0bb8); /* Clock Drift - send every 5 min */
/*@ -charint @*/
}
}
@@ -224,11 +226,11 @@ static void navcom_event_hook(struct gps_device_t *session, event_t event)
static gps_mask_t handle_0x83(struct gps_device_t *session)
{
/* NOTE - At the present moment this is only being used
- for determining the GPS-UTC time difference,
- for which the iono data is not needed as far
- as we are concerned. However, I am still
- reporting it (if debuglevel >= LOG_IO) as a
- matter of interest */
+ * for determining the GPS-UTC time difference,
+ * for which the iono data is not needed as far
+ * as we are concerned. However, I am still
+ * reporting it (if debuglevel >= LOG_IO) as a
+ * matter of interest */
/* 2^-30 */
#define SF_A0 (0.000000000931322574615478515625)
/* 2^-50 */
@@ -273,7 +275,7 @@ static gps_mask_t handle_0x83(struct gps_device_t *session)
/*@ +charint +relaxtypes @*/
/* Ref.: ICD-GPS-200C 20.3.3.5.2.4 */
- if ((week%256)*604800+tow/1000.0 < wnlsf*604800+dn*86400) {
+ if ((week % 256) * 604800 + tow / 1000.0 < wnlsf * 604800 + dn * 86400) {
/* Effectivity time is in the future, use dtls */
session->context->leap_seconds = (int)dtls;
} else {
@@ -286,28 +288,28 @@ static gps_mask_t handle_0x83(struct gps_device_t *session)
gpsd_report(LOG_PROG,
"Navcom: received packet type 0x83 (Ionosphere and UTC Data)\n");
- gpsd_report(LOG_IO,
- "Navcom: Scaled parameters follow:\n");
+ gpsd_report(LOG_IO, "Navcom: Scaled parameters follow:\n");
gpsd_report(LOG_IO,
"Navcom: GPS Week: %u, GPS Time of Week: %u (GPS Time: %f)\n",
- week, tow, week*604800+tow/1000.0);
+ week, tow, week * 604800 + tow / 1000.0);
gpsd_report(LOG_IO,
"Navcom: a0: %12.4E, a1: %12.4E, a2: %12.4E, a3: %12.4E, "
"b0: %12.4E, b1: %12.4E, b2: %12.4E, b3: %12.4E\n",
- (double)alpha0*SF_ALPHA0, (double)alpha1*SF_ALPHA1,
- (double)alpha2*SF_ALPHA2, (double)alpha3*SF_ALPHA3,
- (double)beta0*SF_BETA0, (double)beta1*SF_BETA1,
- (double)beta2*SF_BETA2, (double)beta3*SF_BETA3);
+ (double)alpha0 * SF_ALPHA0, (double)alpha1 * SF_ALPHA1,
+ (double)alpha2 * SF_ALPHA2, (double)alpha3 * SF_ALPHA3,
+ (double)beta0 * SF_BETA0, (double)beta1 * SF_BETA1,
+ (double)beta2 * SF_BETA2, (double)beta3 * SF_BETA3);
gpsd_report(LOG_IO,
- "Navcom: A0: %19.12E, A1: %19.12E\n", (double)a0*SF_A0, (double)a1*SF_A1);
+ "Navcom: A0: %19.12E, A1: %19.12E\n", (double)a0 * SF_A0,
+ (double)a1 * SF_A1);
gpsd_report(LOG_IO,
"Navcom: UTC Ref. Time: %lu, UTC Ref. Week: %u, dTls: %d\n",
- (unsigned long)tot*SF_TOT, wnt, dtls);
+ (unsigned long)tot * SF_TOT, wnt, dtls);
gpsd_report(LOG_IO,
- "Navcom: Week of leap seconds: %u, Day number of leap seconds: %u, dTlsf: %d\n",
- wnlsf, dn, dtlsf);
+ "Navcom: Week of leap seconds: %u, Day number of leap seconds: %u, dTlsf: %d\n",
+ wnlsf, dn, dtlsf);
- return 0; /* No flag for update of leap seconds (Not part of a fix) */
+ return 0; /* No flag for update of leap seconds (Not part of a fix) */
#undef SF_A0
#undef SF_A1
@@ -328,15 +330,15 @@ static gps_mask_t handle_0x06(struct gps_device_t *session)
unsigned char *buf = session->packet.outbuffer + 3;
uint8_t cmd_id = getub(buf, 3);
uint8_t port = getub(buf, 4);
- session->driver.navcom.physical_port = port; /* This tells us which serial port was used last */
+ session->driver.navcom.physical_port = port; /* This tells us which serial port was used last */
gpsd_report(LOG_PROG,
"Navcom: received packet type 0x06 (Acknowledgement (without error))\n");
/*@ -type @*/
gpsd_report(LOG_IO,
"Navcom: acknowledged command id 0x%02x on port %c\n",
- cmd_id, (port==0?'A':(port==1?'B':'?')));
+ cmd_id, (port == 0 ? 'A' : (port == 1 ? 'B' : '?')));
/*@ +type @*/
- return 0; /* Nothing updated */
+ return 0; /* Nothing updated */
}
/* Negative Acknowledge */
@@ -344,24 +346,24 @@ static gps_mask_t handle_0x15(struct gps_device_t *session)
{
size_t n;
unsigned char *buf = session->packet.outbuffer + 3;
- size_t msg_len = (size_t)getleuw(buf, 1);
+ size_t msg_len = (size_t) getleuw(buf, 1);
/*@ -type @*/
uint8_t port, cmd_id = getub(buf, 3);
gpsd_report(LOG_PROG,
"Navcom: received packet type 0x15 (Negative Acknowledge)\n");
- for (n=4; n<(msg_len-2); n+=2) {
+ for (n = 4; n < (msg_len - 2); n += 2) {
uint8_t err_id = getub(buf, n);
- uint8_t err_desc = getub(buf, n+1);
+ uint8_t err_desc = getub(buf, n + 1);
gpsd_report(LOG_IO,
"Navcom: error id = 0x%02x, error description = 0x%02x\n",
- err_id, err_desc);
+ err_id, err_desc);
}
port = getub(buf, n);
gpsd_report(LOG_IO,
"Navcom: negative acknowledge was for command id 0x%02x on port %c\n",
- cmd_id, (port==0?'A':(port==1?'B':'?')));
+ cmd_id, (port == 0 ? 'A' : (port == 1 ? 'B' : '?')));
/*@ -type @*/
- return 0; /* Nothing updated */
+ return 0; /* Nothing updated */
}
/* PVT Block */
@@ -395,14 +397,14 @@ static gps_mask_t handle_0xb1(struct gps_device_t *session)
int16_t ant_height_adj;
int32_t set_delta_up;
/* Resolution of delta north, east, and up,
- and ant. height adjustment values (1mm) */
+ * and ant. height adjustment values (1mm) */
#define D_RES (0.001)
#ifdef __UNUSED__
/* Other values provided by the PVT block which we
- may want to provide in the future. At the present
- moment, the gpsd protocol does not have a mechanism
- to make this available to the user */
+ * may want to provide in the future. At the present
+ * moment, the gpsd protocol does not have a mechanism
+ * to make this available to the user */
uint8_t dgps_conf;
uint16_t max_dgps_age;
uint8_t ext_nav_mode;
@@ -411,35 +413,41 @@ static gps_mask_t handle_0xb1(struct gps_device_t *session)
#endif /* __UNUSED__ */
/* Timestamp */
- week = (uint16_t)getleuw(buf, 3);
- tow = (uint32_t)getleul(buf, 5);
- session->newdata.time = gpstime_to_unix((int)week, tow/1000.0) - session->context->leap_seconds;
+ week = (uint16_t) getleuw(buf, 3);
+ tow = (uint32_t) getleul(buf, 5);
+ session->newdata.time =
+ gpstime_to_unix((int)week,
+ tow / 1000.0) - session->context->leap_seconds;
/* Satellites used */
- sats_used = (uint32_t)getleul(buf, 9);
+ sats_used = (uint32_t) getleul(buf, 9);
session->gpsdata.satellites_used = 0;
for (n = 0; n < 31; n++) {
if ((sats_used & (0x01 << n)) != 0)
- session->gpsdata.used[session->gpsdata.satellites_used++] = (int)(n+1);
+ session->gpsdata.used[session->gpsdata.satellites_used++] =
+ (int)(n + 1);
}
/* Get latitude, longitude */
lat = getlesl(buf, 13);
lon = getlesl(buf, 17);
- lat_fraction = (uint8_t)(getub(buf, 21) >> 4);
- lon_fraction = (uint8_t)(getub(buf, 21) & 0x0f);
+ lat_fraction = (uint8_t) (getub(buf, 21) >> 4);
+ lon_fraction = (uint8_t) (getub(buf, 21) & 0x0f);
- session->newdata.latitude = (double)(lat * LL_RES + lat_fraction * LL_FRAC_RES ) / 3600;
- session->newdata.longitude = (double)(lon * LL_RES + lon_fraction * LL_FRAC_RES ) / 3600;
+ session->newdata.latitude =
+ (double)(lat * LL_RES + lat_fraction * LL_FRAC_RES) / 3600;
+ session->newdata.longitude =
+ (double)(lon * LL_RES + lon_fraction * LL_FRAC_RES) / 3600;
/* Nav mode */
- nav_mode = (uint8_t)getub(buf, 22);
+ nav_mode = (uint8_t) getub(buf, 22);
if (-nav_mode & 0x80) {
session->gpsdata.status = STATUS_NO_FIX;
session->newdata.mode = MODE_NO_FIX;
} else {
session->newdata.mode = (nav_mode & 0x40 ? MODE_3D : MODE_2D);
- session->gpsdata.status = (nav_mode & 0x03 ? STATUS_DGPS_FIX : STATUS_FIX);
+ session->gpsdata.status =
+ (nav_mode & 0x03 ? STATUS_DGPS_FIX : STATUS_FIX);
}
/* Height Data */
@@ -450,9 +458,9 @@ static gps_mask_t handle_0xb1(struct gps_device_t *session)
set_delta_up = getlesl(buf, 79);
session->newdata.altitude = (double)(altitude * EL_RES)
- + (ant_height_adj * D_RES) + (set_delta_up * D_RES);
- session->gpsdata.separation = (double)(ellips_height - altitude)*EL_RES
- + (ant_height_adj * D_RES) + (set_delta_up * D_RES);
+ + (ant_height_adj * D_RES) + (set_delta_up * D_RES);
+ session->gpsdata.separation = (double)(ellips_height - altitude) * EL_RES
+ + (ant_height_adj * D_RES) + (set_delta_up * D_RES);
/* Speed Data */
vel_north = (double)getlesl24(buf, 31);
@@ -465,13 +473,14 @@ static gps_mask_t handle_0xb1(struct gps_device_t *session)
track += 2 * GPS_PI;
session->newdata.track = track * RAD_2_DEG;
/*@ -evalorder @*/
- session->newdata.speed = sqrt(pow(vel_east,2) + pow(vel_north,2)) * VEL_RES;
+ session->newdata.speed =
+ sqrt(pow(vel_east, 2) + pow(vel_north, 2)) * VEL_RES;
/*@ +evalorder @*/
session->newdata.climb = vel_up * VEL_RES;
/* Quality indicators */
/*@ -type @*/
- fom = getub(buf, 40);
+ fom = getub(buf, 40);
gdop = getub(buf, 41);
pdop = getub(buf, 42);
hdop = getub(buf, 43);
@@ -480,35 +489,37 @@ static gps_mask_t handle_0xb1(struct gps_device_t *session)
tfom = getub(buf, 46);
/* Get two-sigma horizontal circular error estimate */
- eph = fom/100.0 * 1.96;
+ eph = fom / 100.0 * 1.96;
/* approximate epx and epy errors from it */
- session->newdata.epx = session->newdata.epy = eph/sqrt(2);
+ session->newdata.epx = session->newdata.epy = eph / sqrt(2);
/* FIXME - Which units is tfom in (spec doesn't say) */
- session->newdata.ept = tfom * 1.96 /*Two sigma*/;
+ session->newdata.ept = tfom * 1.96 /*Two sigma */ ;
clear_dop(&session->gpsdata.dop);
if (gdop != DOP_UNDEFINED)
- session->gpsdata.dop.gdop = gdop/10.0;
+ session->gpsdata.dop.gdop = gdop / 10.0;
if (pdop != DOP_UNDEFINED)
- session->gpsdata.dop.pdop = pdop/10.0;
+ session->gpsdata.dop.pdop = pdop / 10.0;
if (hdop != DOP_UNDEFINED)
- session->gpsdata.dop.hdop = hdop/10.0;
+ session->gpsdata.dop.hdop = hdop / 10.0;
if (vdop != DOP_UNDEFINED)
- session->gpsdata.dop.vdop = vdop/10.0;
+ session->gpsdata.dop.vdop = vdop / 10.0;
if (tdop != DOP_UNDEFINED)
- session->gpsdata.dop.tdop = tdop/10.0;
+ session->gpsdata.dop.tdop = tdop / 10.0;
/*@ +type @*/
gpsd_report(LOG_PROG, "Navcom: received packet type 0xb1 (PVT Report)\n");
gpsd_report(LOG_IO, "Navcom: navigation mode %s (0x%02x) - %s - %s\n",
- (-nav_mode&0x80?"invalid":"valid"), nav_mode,
- (nav_mode&0x40?"3D":"2D"), (nav_mode&0x03?"DGPS":"GPS"));
- gpsd_report(LOG_IO, "Navcom: latitude = %f, longitude = %f, altitude = %f, geoid = %f\n",
+ (-nav_mode & 0x80 ? "invalid" : "valid"), nav_mode,
+ (nav_mode & 0x40 ? "3D" : "2D"),
+ (nav_mode & 0x03 ? "DGPS" : "GPS"));
+ gpsd_report(LOG_IO,
+ "Navcom: latitude = %f, longitude = %f, altitude = %f, geoid = %f\n",
session->newdata.latitude, session->newdata.longitude,
session->newdata.altitude, session->gpsdata.separation);
gpsd_report(LOG_IO,
"Navcom: velocities: north = %f, east = %f, up = %f (track = %f, speed = %f)\n",
- vel_north*VEL_RES, vel_east*VEL_RES, vel_up*VEL_RES,
+ vel_north * VEL_RES, vel_east * VEL_RES, vel_up * VEL_RES,
session->newdata.track, session->newdata.speed);
#undef D_RES
#undef LL_RES
@@ -517,9 +528,9 @@ static gps_mask_t handle_0xb1(struct gps_device_t *session)
#undef VEL_RES
#undef DOP_UNDEFINED
- mask = LATLON_SET | ALTITUDE_SET | CLIMB_SET | SPEED_SET | TRACK_SET
- | TIME_SET | STATUS_SET | MODE_SET | USED_SET | HERR_SET | VERR_SET
- | TIMERR_SET | DOP_SET;
+ mask = LATLON_IS | ALTITUDE_IS | CLIMB_IS | SPEED_IS | TRACK_IS
+ | TIME_IS | STATUS_IS | MODE_IS | USED_IS | HERR_IS | VERR_IS
+ | TIMERR_IS | DOP_IS;
gpsd_report(LOG_DATA, "PVT 0xb1: time=%.2f, lat=%.2f lon=%.2f alt=%.f "
"speed=%.2f track=%.2f climb=%.2f mode=%d status=%d "
"epx=%.2f epy=%.2f epv=%.2f "
@@ -535,14 +546,13 @@ static gps_mask_t handle_0xb1(struct gps_device_t *session)
session->newdata.climb,
session->newdata.mode,
session->gpsdata.status,
- session->newdata.epx,
- session->newdata.epy,
+ session->newdata.epx,
+ session->newdata.epy,
session->newdata.epv,
session->gpsdata.dop.gdop,
session->gpsdata.dop.pdop,
session->gpsdata.dop.hdop,
- session->gpsdata.dop.vdop,
- session->gpsdata.dop.tdop);
+ session->gpsdata.dop.vdop, session->gpsdata.dop.tdop);
return mask;
}
@@ -599,23 +609,23 @@ static gps_mask_t handle_0x81(struct gps_device_t *session)
uint32_t tow = getleul(buf, 6);
uint16_t iodc = getleuw(buf, 10);
/* And now the fun starts... everything that follows is
- raw GPS data minus parity */
+ * raw GPS data minus parity */
/* Subframe 1, words 3 to 10 minus parity */
- uint16_t wn = (getleuw_be(buf, 12)&0xffc0)>>6;
- uint8_t cl2 = (getub(buf, 13)&0x30)>>4;
- uint8_t ura = getub(buf, 13)&0x0f;
- uint8_t svh = (getub(buf, 14)&0xfc)>>2;
+ uint16_t wn = (getleuw_be(buf, 12) & 0xffc0) >> 6;
+ uint8_t cl2 = (getub(buf, 13) & 0x30) >> 4;
+ uint8_t ura = getub(buf, 13) & 0x0f;
+ uint8_t svh = (getub(buf, 14) & 0xfc) >> 2;
/* We already have IODC from earlier in the message, so
- we do not decode again */
+ * we do not decode again */
/* uint16_t iodc = (getub(buf, 14)&0x03)<<8;*/
- uint8_t l2pd = (getub(buf, 15)&0x80)>>7;
+ uint8_t l2pd = (getub(buf, 15) & 0x80) >> 7;
int8_t tgd = getsb(buf, 26);
/* iodc |= getub(buf, 27);*/
uint16_t toc = getleuw_be(buf, 28);
int8_t af2 = getsb(buf, 30);
int16_t af1 = getlesw_be(buf, 31);
/*@ -shiftimplementation @*/
- int32_t af0 = getlesl24_be(buf, 33)>>2;
+ int32_t af0 = getlesl24_be(buf, 33) >> 2;
/*@ +shiftimplementation @*/
/* Subframe 2, words 3 to 10 minus parity */
uint8_t iode = getub(buf, 36);
@@ -639,39 +649,46 @@ static gps_mask_t handle_0x81(struct gps_device_t *session)
/*@ -predboolothers @*/
/* Question: What is the proper way of shifting a signed int 2 bits to
* the right, preserving sign? Answer: integer division by 4. */
- int16_t idot = (int16_t)(((getlesw_be(buf, 82)&0xfffc)/4)|(getub(buf, 82)&80?0xc000:0x0000));
+ int16_t idot =
+ (int16_t) (((getlesw_be(buf, 82) & 0xfffc) /
+ 4) | (getub(buf, 82) & 80 ? 0xc000 : 0x0000));
/*@ +predboolothers @*/
char time_str[24];
- (void)unix_to_iso8601(gpstime_to_unix((int)wn, (double)(toc*SF_TOC)), time_str, sizeof(time_str));
+ (void)unix_to_iso8601(gpstime_to_unix((int)wn, (double)(toc * SF_TOC)),
+ time_str, sizeof(time_str));
gpsd_report(LOG_PROG,
"Navcom: received packet type 0x81 (Packed Ephemeris Data)\n");
gpsd_report(LOG_IO,
"Navcom: PRN: %u, Epoch: %u (%s), SV clock bias/drift/drift rate: %#19.12E/%#19.12E/%#19.12E\n",
- prn, toc*SF_TOC, time_str, ((double)af0)*SF_AF0, ((double)af1)*SF_AF1, ((double)af2)*SF_AF2);
+ prn, toc * SF_TOC, time_str, ((double)af0) * SF_AF0,
+ ((double)af1) * SF_AF1, ((double)af2) * SF_AF2);
gpsd_report(LOG_IO,
"Navcom: IODE (!AODE): %u Crs: %19.12e, Delta n: %19.12e, M0: %19.12e\n",
- iode, (double)crs*SF_CRS, (double)delta_n*SF_DELTA_N*GPS_PI, (double)m0*SF_M0*GPS_PI);
+ iode, (double)crs * SF_CRS,
+ (double)delta_n * SF_DELTA_N * GPS_PI,
+ (double)m0 * SF_M0 * GPS_PI);
gpsd_report(LOG_IO,
"Navcom: Cuc: %19.12e, Eccentricity: %19.12e, Cus: %19.12e, A^1/2: %19.12e\n",
- (double)cuc*SF_CUC, (double)e*SF_E, (double)cus*SF_CUS, (double)sqrt_a*SF_SQRT_A);
+ (double)cuc * SF_CUC, (double)e * SF_E, (double)cus * SF_CUS,
+ (double)sqrt_a * SF_SQRT_A);
gpsd_report(LOG_IO,
"Navcom: TOE: %u, Cic: %19.12e, Omega %19.12e, Cis: %19.12e\n",
- toe*SF_TOE, (double)cic*SF_CIC, (double)Omega0*SF_OMEGA0*GPS_PI,
- (double)cis*SF_CIS);
+ toe * SF_TOE, (double)cic * SF_CIC,
+ (double)Omega0 * SF_OMEGA0 * GPS_PI, (double)cis * SF_CIS);
gpsd_report(LOG_IO,
"Navcom: i0: %19.12e, Crc: %19.12e, omega: %19.12e, Omega dot: %19.12e\n",
- (double)i0*SF_I0*GPS_PI, (double)crc*SF_CRC, (double)omega*SF_OMEGA*GPS_PI,
- (double)Omegadot*SF_OMEGADOT*GPS_PI);
+ (double)i0 * SF_I0 * GPS_PI, (double)crc * SF_CRC,
+ (double)omega * SF_OMEGA * GPS_PI,
+ (double)Omegadot * SF_OMEGADOT * GPS_PI);
gpsd_report(LOG_IO,
"Navcom: IDOT: %19.12e, Codes on L2: 0x%x, GPS Week: %u, L2 P data flag: %x\n",
- (double)idot*SF_IDOT*GPS_PI, cl2, week-(week%1024)+wn, l2pd);
+ (double)idot * SF_IDOT * GPS_PI, cl2,
+ week - (week % 1024) + wn, l2pd);
gpsd_report(LOG_IO,
"Navcom: SV accuracy: 0x%x, SV health: 0x%x, TGD: %f, IODC (!AODC): %u\n",
- ura, svh, (double)tgd*SF_TGD, iodc);
- gpsd_report(LOG_IO,
- "Navcom: Transmission time: %u\n",
- tow);
+ ura, svh, (double)tgd * SF_TGD, iodc);
+ gpsd_report(LOG_IO, "Navcom: Transmission time: %u\n", tow);
#undef SF_TGD
#undef SF_TOC
@@ -702,10 +719,11 @@ static gps_mask_t handle_0x81(struct gps_device_t *session)
static gps_mask_t handle_0x86(struct gps_device_t *session)
{
size_t n, i;
- uint8_t prn, tracking_status, ele, ca_snr, p2_snr, log_channel, hw_channel, s;
+ uint8_t prn, tracking_status, ele, ca_snr, p2_snr, log_channel,
+ hw_channel, s;
uint16_t azm, dgps_age;
unsigned char *buf = session->packet.outbuffer + 3;
- size_t msg_len = (size_t)getleuw(buf, 1);
+ size_t msg_len = (size_t) getleuw(buf, 1);
uint16_t week = getleuw(buf, 3);
uint32_t tow = getleul(buf, 5);
uint8_t eng_status = getub(buf, 9);
@@ -716,9 +734,10 @@ static gps_mask_t handle_0x86(struct gps_device_t *session)
//uint8_t pdop = getub(buf, 15);
/* Timestamp and PDOP */
- /*@ ignore @*//*@ splint is confused @*/
- session->gpsdata.skyview_time =
- gpstime_to_unix((int)week, tow/1000.0f) - session->context->leap_seconds;
+ /*@ ignore @*//*@ splint is confused @ */
+ session->gpsdata.skyview_time =
+ gpstime_to_unix((int)week,
+ tow / 1000.0f) - session->context->leap_seconds;
/*@ end @*/
/* Give this driver a single point of truth about DOPs */
//session->gpsdata.dop.pdop = (int)pdop / 10.0;
@@ -728,8 +747,7 @@ static gps_mask_t handle_0x86(struct gps_device_t *session)
session->gpsdata.satellites_used = (int)sats_used;
/* Fix mode */
- switch(sol_status & 0x05)
- {
+ switch (sol_status & 0x05) {
case 0x05:
session->gpsdata.status = STATUS_DGPS_FIX;
break;
@@ -742,60 +760,65 @@ static gps_mask_t handle_0x86(struct gps_device_t *session)
/*@ -predboolothers @*/
gpsd_report(LOG_IO,
- "Navcom: engine status = 0x%x, almanac = %s, time = 0x%x, pos = 0x%x\n",
- eng_status&0x07, (eng_status&0x08?"valid":"invalid"),
- eng_status&0x30>>4, eng_status&0xc0>>6);
+ "Navcom: engine status = 0x%x, almanac = %s, time = 0x%x, pos = 0x%x\n",
+ eng_status & 0x07, (eng_status & 0x08 ? "valid" : "invalid"),
+ eng_status & 0x30 >> 4, eng_status & 0xc0 >> 6);
/*@ +predboolothers @*/
/* Satellite details */
i = 0;
- for(n = 17; n < msg_len; n += 14) {
- if(i >= MAXCHANNELS) {
+ for (n = 17; n < msg_len; n += 14) {
+ if (i >= MAXCHANNELS) {
gpsd_report(LOG_ERROR,
"Navcom: packet type 0x86: too many satellites!\n");
gpsd_zero_satellites(&session->gpsdata);
- return ERROR_SET;
+ return ERROR_IS;
}
prn = getub(buf, n);
- tracking_status = getub(buf, n+1);
- log_channel = getub(buf, n+2);
- ele = getub(buf, n+5);
- azm = getleuw(buf, n+6);
- ca_snr = getub(buf, n+8);
- p2_snr = getub(buf, n+10);
- dgps_age = getleuw(buf, n+11);
- hw_channel = getub(buf, n+13);
+ tracking_status = getub(buf, n + 1);
+ log_channel = getub(buf, n + 2);
+ ele = getub(buf, n + 5);
+ azm = getleuw(buf, n + 6);
+ ca_snr = getub(buf, n + 8);
+ p2_snr = getub(buf, n + 10);
+ dgps_age = getleuw(buf, n + 11);
+ hw_channel = getub(buf, n + 13);
s = (unsigned char)0;
/*@ -predboolothers +charint @*/
/* NOTE - In theory, I think one would check for hw channel number to
- see if one is dealing with a GPS or other satellite, but the
- channel numbers reported bear no resemblance to what the spec
- says should be. So I check for the fact that if all three
- values below are zero, one is not interested on this satellite */
+ * see if one is dealing with a GPS or other satellite, but the
+ * channel numbers reported bear no resemblance to what the spec
+ * says should be. So I check for the fact that if all three
+ * values below are zero, one is not interested on this satellite */
if (!(ele == 0 && azm == 0 && dgps_age == 0)) {
session->gpsdata.PRN[i] = (int)prn;
session->gpsdata.elevation[i] = (int)ele;
session->gpsdata.azimuth[i] = (int)azm;
- /*@i3@*/s = session->gpsdata.ss[i++] = (float)(p2_snr ? p2_snr : ca_snr) / 4.0;
+ /*@ ignore @*//* splint is confused */
+ s = session->gpsdata.ss[i++] = (p2_snr ? p2_snr : ca_snr) / 4.0;
+ /*@ end @*/
}
gpsd_report(LOG_IO,
"Navcom: prn = %3u, ele = %02u, azm = %03u, snr = %d (%s), "
"dgps age = %.1fs, log ch = %d, hw ch = 0x%02x\n",
- prn, ele, azm, s, (p2_snr?"P2":"C/A"),
- (double)dgps_age*0.1, log_channel&0x3f, hw_channel);
+ prn, ele, azm, s, (p2_snr ? "P2" : "C/A"),
+ (double)dgps_age * 0.1, log_channel & 0x3f, hw_channel);
gpsd_report(LOG_IO,
"Navcom: sol. valid = %c, clock = %s, pos. = %s, "
"height = %s, err. code = 0x%x\n",
- (sol_status&0x01?'Y':'N'), (sol_status&0x02?"stable":"unstable"),
- (sol_status&0x04?"dgps":"unaided"), (sol_status&0x08?"solved":"constrained"),
- (sol_status&0x01?0x00:sol_status&0x0f00>>8));
+ (sol_status & 0x01 ? 'Y' : 'N'),
+ (sol_status & 0x02 ? "stable" : "unstable"),
+ (sol_status & 0x04 ? "dgps" : "unaided"),
+ (sol_status & 0x08 ? "solved" : "constrained"),
+ (sol_status & 0x01 ? 0x00 : sol_status & 0x0f00 >> 8));
/*@ +predboolothers -charint @*/
}
- gpsd_report(LOG_DATA,
- "CS 0x86: visible=%d, used=%d, mask={SATELLITE|STATUS}\n",
- session->gpsdata.satellites_visible, session->gpsdata.satellites_used);
- return SATELLITE_SET | STATUS_SET;
+ gpsd_report(LOG_DATA,
+ "CS 0x86: visible=%d, used=%d, mask={SATELLITE|STATUS}\n",
+ session->gpsdata.satellites_visible,
+ session->gpsdata.satellites_used);
+ return SATELLITE_IS | STATUS_IS;
}
/* Raw Meas. Data Block */
@@ -805,14 +828,15 @@ static gps_mask_t handle_0xb0(struct gps_device_t *session)
#define LAMBDA_L1 (.190293672798364880476317426464)
size_t n;
unsigned char *buf = session->packet.outbuffer + 3;
- size_t msg_len = (size_t)getleuw(buf, 1);
+ size_t msg_len = (size_t) getleuw(buf, 1);
uint16_t week = getleuw(buf, 3);
uint32_t tow = getleul(buf, 5);
uint8_t tm_slew_acc = getub(buf, 9);
uint8_t status = getub(buf, 10);
char time_str[24];
- (void)unix_to_iso8601(gpstime_to_unix((int)week, (double)tow/1000.0), time_str, sizeof(time_str));
+ (void)unix_to_iso8601(gpstime_to_unix((int)week, (double)tow / 1000.0),
+ time_str, sizeof(time_str));
gpsd_report(LOG_PROG,
"Navcom: received packet type 0xb0 (Raw Meas. Data Block)\n");
@@ -821,50 +845,63 @@ static gps_mask_t handle_0xb0(struct gps_device_t *session)
"Navcom: Epoch = %s, time slew accumulator = %u (1/1023mS), status = 0x%02x "
"(%sclock %s - %u blocks follow)\n",
time_str,
- tm_slew_acc, status, (status&0x80?"channel time set - ":""),
- (status&0x40?"stable":"not stable"), status&0x0f);
+ tm_slew_acc, status,
+ (status & 0x80 ? "channel time set - " : ""),
+ (status & 0x40 ? "stable" : "not stable"), status & 0x0f);
/*@ +predboolothers @*/
- for (n=11; n<msg_len-1; n+=16) {
+ for (n = 11; n < msg_len - 1; n += 16) {
uint8_t sv_status = getub(buf, n);
- uint8_t ch_status = getub(buf, n+1);
- uint32_t ca_pseudorange = getleul(buf, n+2);
+ uint8_t ch_status = getub(buf, n + 1);
+ uint32_t ca_pseudorange = getleul(buf, n + 2);
/* integer division by 16 is a sign-preserving right shift of 4 bits */
- int32_t l1_phase = getlesl24(buf, n+6) / 16;
- uint8_t l1_slips = (uint8_t)(getlesl24(buf, n+6) & 0x0f);
- int16_t p1_ca_pseudorange = getlesw(buf, n+9);
- int16_t p2_ca_pseudorange = getlesw(buf, n+11);
- int32_t l2_phase = getlesl24(buf, n+13) / 16;
- uint8_t l2_slips = (uint8_t)(getlesl24(buf, n+13) & 0x0f);
+ int32_t l1_phase = getlesl24(buf, n + 6) / 16;
+ uint8_t l1_slips = (uint8_t) (getlesl24(buf, n + 6) & 0x0f);
+ int16_t p1_ca_pseudorange = getlesw(buf, n + 9);
+ int16_t p2_ca_pseudorange = getlesw(buf, n + 11);
+ int32_t l2_phase = getlesl24(buf, n + 13) / 16;
+ uint8_t l2_slips = (uint8_t) (getlesl24(buf, n + 13) & 0x0f);
/*@ -predboolothers +charint @*/
- double c1 = (sv_status&0x80? (double)ca_pseudorange/16.0*LAMBDA_L1 : NAN);
- double l1 = (sv_status&0x80? (double)ca_pseudorange/16.0 + (double)l1_phase/256.0 : NAN);
- double l2 = (sv_status&0x20? ((double)ca_pseudorange/16.0
- + (double)p2_ca_pseudorange/16.0)*(120.0/154.0)
- +(double)l2_phase/256.0 : NAN);
- double p1 = (sv_status&0x40? c1 + (double)p1_ca_pseudorange/16.0*LAMBDA_L1 : NAN);
- double p2 = (sv_status&0x20? c1 + (double)p2_ca_pseudorange/16.0*LAMBDA_L1 : NAN);
- gpsd_report(LOG_IO+1,
+ double c1 =
+ (sv_status & 0x80 ? (double)ca_pseudorange / 16.0 *
+ LAMBDA_L1 : NAN);
+ double l1 =
+ (sv_status & 0x80 ? (double)ca_pseudorange / 16.0 +
+ (double)l1_phase / 256.0 : NAN);
+ double l2 =
+ (sv_status & 0x20
+ ? ((double)ca_pseudorange / 16.0 +
+ (double)p2_ca_pseudorange / 16.0) * (120.0 / 154.0)
+ + (double)l2_phase / 256.0 : NAN);
+ double p1 =
+ (sv_status & 0x40 ? c1 +
+ (double)p1_ca_pseudorange / 16.0 * LAMBDA_L1 : NAN);
+ double p2 =
+ (sv_status & 0x20 ? c1 +
+ (double)p2_ca_pseudorange / 16.0 * LAMBDA_L1 : NAN);
+ gpsd_report(LOG_IO + 1,
"Navcom: >> sv status = 0x%02x (PRN %u - C/A & L1 %s - P1 %s - P2 & L2 %s)\n",
- sv_status, (sv_status&0x1f), (sv_status&0x80?"valid":"invalid"),
- (sv_status&0x40?"valid":"invalid"), (sv_status&0x20?"valid":"invalid"));
- gpsd_report(LOG_IO+1,
+ sv_status, (sv_status & 0x1f),
+ (sv_status & 0x80 ? "valid" : "invalid"),
+ (sv_status & 0x40 ? "valid" : "invalid"),
+ (sv_status & 0x20 ? "valid" : "invalid"));
+ gpsd_report(LOG_IO + 1,
"Navcom: >>> ch status = 0x%02x (Logical channel: %u - CA C/No: %u dBHz) "
- "sL1: %u, sL2: %u\n",
- ch_status, ch_status&0x0f, ((ch_status&0xf0)>>4)+35, l1_slips, l2_slips);
- gpsd_report(LOG_IO+1,
+ "sL1: %u, sL2: %u\n", ch_status, ch_status & 0x0f,
+ ((ch_status & 0xf0) >> 4) + 35, l1_slips, l2_slips);
+ gpsd_report(LOG_IO + 1,
"Navcom: >>> C1: %14.3f, L1: %14.3f, L2: %14.3f, P1: %14.3f, P2: %14.3f\n",
c1, l1, l2, p1, p2);
/*@ +predboolothers -charint @*/
}
#undef LAMBDA_L1
- return 0; /* Raw measurements not yet implemented in gpsd */
+ return 0; /* Raw measurements not yet implemented in gpsd */
}
/* Pseudorange Noise Statistics */
static gps_mask_t handle_0xb5(struct gps_device_t *session)
{
- if(sizeof(double) == 8) {
- gps_mask_t mask = TIME_SET;
+ if (sizeof(double) == 8) {
+ gps_mask_t mask = TIME_IS;
union long_double l_d;
unsigned char *buf = session->packet.outbuffer + 3;
uint16_t week = getleuw(buf, 3);
@@ -872,9 +909,9 @@ static gps_mask_t handle_0xb5(struct gps_device_t *session)
double rms = getled(buf, 9);
#ifdef __UNUSED__
/* Reason why it's unused is these figures do not agree
- with those obtained from the PVT report (handle_0xb1).
- The figures from 0xb1 do agree with the values reported
- by Navcom's PC utility */
+ * with those obtained from the PVT report (handle_0xb1).
+ * The figures from 0xb1 do agree with the values reported
+ * by Navcom's PC utility */
double ellips_maj = getled(buf, 17);
double ellips_min = getled(buf, 25);
double ellips_azm = getled(buf, 33);
@@ -883,31 +920,31 @@ static gps_mask_t handle_0xb5(struct gps_device_t *session)
double alt_sd = getled(buf, 57);
double hrms = sqrt(pow(lat_sd, 2) + pow(lon_sd, 2));
#endif /* __UNUSED__ */
- session->gpsdata.epe = rms*1.96;
- mask |= PERR_SET;
+ session->gpsdata.epe = rms * 1.96;
+ mask |= PERR_IS;
#ifdef __UNUSED__
- session->newdata.eph = hrms*1.96;
- session->newdata.epv = alt_sd*1.96;
- mask |= (HERR_SET | VERR_SET);
+ session->newdata.eph = hrms * 1.96;
+ session->newdata.epv = alt_sd * 1.96;
+ mask |= (HERR_IS | VERR_IS);
#endif /* __UNUSED__ */
- /*@ ignore @*//*@ splint is confused @*/
- session->newdata.time =
- gpstime_to_unix((int)week, tow/1000.0f) - session->context->leap_seconds;
+ /*@ ignore @*//*@ splint is confused @ */
+ session->newdata.time =
+ gpstime_to_unix((int)week,
+ tow / 1000.0f) - session->context->leap_seconds;
/*@ end @*/
gpsd_report(LOG_PROG,
"Navcom: received packet type 0xb5 (Pseudorange Noise Statistics)\n");
- gpsd_report(LOG_IO,
- "Navcom: epe = %f\n", session->gpsdata.epe);
+ gpsd_report(LOG_IO, "Navcom: epe = %f\n", session->gpsdata.epe);
return mask;
} else {
/* Ignore this message block */
if (!session->driver.navcom.warned) {
gpsd_report(LOG_WARN,
"Navcom: received packet type 0xb5 (Pseudorange Noise Statistics) ignored "
- " - sizeof(double) == 64 bits required\n");
+ " - sizeof(double) == 64 bits required\n");
session->driver.navcom.warned = true;
}
- return 0; /* Block ignored - wrong sizeof(double) */
+ return 0; /* Block ignored - wrong sizeof(double) */
}
}
@@ -915,12 +952,12 @@ static gps_mask_t handle_0xb5(struct gps_device_t *session)
static gps_mask_t handle_0xd3(struct gps_device_t *session UNUSED)
{
/* This block contains status information about the
- unit's L-band (Inmarsat) module. There is nothing
- interesting in it for our purposes so we do not deal
- with it. This callback is purely to a) stop
- "unrecognised packet" messages appearing in the log
- and b) explain what it is for the curious */
- return 0; /* Nothing updated */
+ * unit's L-band (Inmarsat) module. There is nothing
+ * interesting in it for our purposes so we do not deal
+ * with it. This callback is purely to a) stop
+ * "unrecognised packet" messages appearing in the log
+ * and b) explain what it is for the curious */
+ return 0; /* Nothing updated */
}
/* Identification Block */
@@ -929,40 +966,39 @@ static gps_mask_t handle_0xae(struct gps_device_t *session)
/*@-modobserver@*/
char *engconfstr, *asicstr;
unsigned char *buf = session->packet.outbuffer + 3;
- size_t msg_len = (size_t)getleuw(buf, 1);
- uint8_t engconf = getub(buf, 3);
- uint8_t asic = getub(buf, 4);
+ size_t msg_len = (size_t) getleuw(buf, 1);
+ uint8_t engconf = getub(buf, 3);
+ uint8_t asic = getub(buf, 4);
uint8_t swvermaj = getub(buf, 5);
uint8_t swvermin = getub(buf, 6);
- uint16_t dcser = getleuw(buf, 7);
- uint8_t dcclass = getub(buf, 9);
- uint16_t rfcser = getleuw(buf, 10);
- uint8_t rfcclass= getub(buf, 12);
+ uint16_t dcser = getleuw(buf, 7);
+ uint8_t dcclass = getub(buf, 9);
+ uint16_t rfcser = getleuw(buf, 10);
+ uint8_t rfcclass = getub(buf, 12);
/*@ -stringliteralnoroomfinalnull -type @*/
- uint8_t softtm[17] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
- uint8_t bootstr[17] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
- uint8_t ioptm[17] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
+ uint8_t softtm[17] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
+ uint8_t bootstr[17] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
+ uint8_t ioptm[17] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
/*@ +stringliteralnoroomfinalnull +type @*/
- uint8_t iopvermaj = (uint8_t)0x00;
- uint8_t iopvermin = (uint8_t)0x00;
- uint8_t picver = (uint8_t)0x00;
- uint8_t slsbn = (uint8_t)0x00;
- uint8_t iopsbn = (uint8_t)0x00;
+ uint8_t iopvermaj = (uint8_t) 0x00;
+ uint8_t iopvermin = (uint8_t) 0x00;
+ uint8_t picver = (uint8_t) 0x00;
+ uint8_t slsbn = (uint8_t) 0x00;
+ uint8_t iopsbn = (uint8_t) 0x00;
memcpy(softtm, &buf[13], 16);
memcpy(bootstr, &buf[29], 16);
- if (msg_len == 0x0037) { /* No IOP */
+ if (msg_len == 0x0037) { /* No IOP */
slsbn = getub(buf, 53);
- } else { /* IOP Present */
- iopvermaj = getub(buf, 53);
- iopvermin = getub(buf, 54);
+ } else { /* IOP Present */
+ iopvermaj = getub(buf, 53);
+ iopvermin = getub(buf, 54);
memcpy(ioptm, &buf[55], 16);
- picver = getub(buf, 71);
- slsbn = getub(buf, 72);
- iopsbn = getub(buf, 73);
+ picver = getub(buf, 71);
+ slsbn = getub(buf, 72);
+ iopsbn = getub(buf, 73);
}
- switch(engconf)
- {
+ switch (engconf) {
case 0x00:
engconfstr = "Unknown/Undefined";
break;
@@ -1009,8 +1045,7 @@ static gps_mask_t handle_0xae(struct gps_device_t *session)
engconfstr = "?";
}
- switch(asic)
- {
+ switch (asic) {
case 0x01:
asicstr = "A-ASIC";
break;
@@ -1027,30 +1062,31 @@ static gps_mask_t handle_0xae(struct gps_device_t *session)
asicstr = "?";
}
- gpsd_report(LOG_PROG, "Navcom: received packet type 0xae (Identification Block)\n");
- if(msg_len == 0x0037) {
+ gpsd_report(LOG_PROG,
+ "Navcom: received packet type 0xae (Identification Block)\n");
+ if (msg_len == 0x0037) {
gpsd_report(LOG_INF, "Navcom: ID Data: "
"%s %s Ver. %u.%u.%u, DC S/N: %u.%u, RF S/N: %u.%u, "
"Build ID: %s, Boot software: %s\n",
- engconfstr, asicstr, swvermaj, swvermin, slsbn, dcser, dcclass,
- rfcser, rfcclass, softtm, bootstr);
+ engconfstr, asicstr, swvermaj, swvermin, slsbn, dcser,
+ dcclass, rfcser, rfcclass, softtm, bootstr);
} else {
gpsd_report(LOG_INF, "Navcom: ID Data: "
"%s %s Ver. %u.%u.%u, DC S/N: %u.%u, RF S/N: %u.%u, "
"Build ID: %s, Boot software: %s, "
"IOP Ver.: %u.%u.%u, PIC: %u, IOP Build ID: %s\n",
- engconfstr, asicstr, swvermaj, swvermin, slsbn, dcser, dcclass,
- rfcser, rfcclass, softtm, bootstr, iopvermaj, iopvermin, iopsbn,
- picver, ioptm);
+ engconfstr, asicstr, swvermaj, swvermin, slsbn, dcser,
+ dcclass, rfcser, rfcclass, softtm, bootstr, iopvermaj,
+ iopvermin, iopsbn, picver, ioptm);
}
/*@ -formattype @*/
(void)snprintf(session->subtype, sizeof(session->subtype),
- "%s %s Ver. %u.%u.%u S/N %u.%u %u.%u",
- engconfstr, asicstr, swvermaj, swvermin, slsbn, dcser, dcclass,
- rfcser, rfcclass);
+ "%s %s Ver. %u.%u.%u S/N %u.%u %u.%u",
+ engconfstr, asicstr, swvermaj, swvermin, slsbn, dcser,
+ dcclass, rfcser, rfcclass);
/*@ +formattype @*/
- return DEVICEID_SET;
+ return DEVICEID_IS;
/*@+modobserver@*/
}
@@ -1067,7 +1103,7 @@ static gps_mask_t handle_0xef(struct gps_device_t *session)
union int_float i_f;
float nav_clock_drift;
float osc_filter_drift_est;
- int32_t time_slew = (int32_t)getlesl(buf, 27);
+ int32_t time_slew = (int32_t) getlesl(buf, 27);
if (sizeof(double) == 8) {
nav_clock_offset = getled(buf, 11);
} else {
@@ -1096,31 +1132,31 @@ static gps_mask_t handle_0xef(struct gps_device_t *session)
/*@ +charint @*/
-gps_mask_t navcom_parse(struct gps_device_t *session, unsigned char *buf, size_t len)
+gps_mask_t navcom_parse(struct gps_device_t * session, unsigned char *buf,
+ size_t len)
{
unsigned char cmd_id;
unsigned char *payload;
- unsigned int msg_len;
+ unsigned int msg_len;
if (len == 0)
return 0;
cmd_id = (unsigned char)getub(buf, 3);
payload = &buf[6];
- msg_len = (uint)getleuw(buf, 4);
+ msg_len = (uint) getleuw(buf, 4);
/*@ -usedef -compdef @*/
gpsd_report(LOG_RAW, "Navcom: packet type 0x%02x, length %d: %s\n",
- cmd_id, msg_len, gpsd_hexdump_wrapper(buf, len, LOG_RAW));
+ cmd_id, msg_len, gpsd_hexdump_wrapper(buf, len, LOG_RAW));
/*@ +usedef +compdef @*/
(void)snprintf(session->gpsdata.tag, sizeof(session->gpsdata.tag),
- "0x%02x",cmd_id);
+ "0x%02x", cmd_id);
session->cycle_end_reliable = true;
- switch (cmd_id)
- {
+ switch (cmd_id) {
case 0x06:
return handle_0x06(session);
case 0x15:
@@ -1136,7 +1172,7 @@ gps_mask_t navcom_parse(struct gps_device_t *session, unsigned char *buf, size_t
case 0xb0:
return handle_0xb0(session);
case 0xb1:
- return handle_0xb1(session) | (CLEAR_SET | REPORT_SET);
+ return handle_0xb1(session) | (CLEAR_IS | REPORT_IS);
case 0xb5:
return handle_0xb5(session);
case 0xd3:
@@ -1150,6 +1186,7 @@ gps_mask_t navcom_parse(struct gps_device_t *session, unsigned char *buf, size_t
return 0;
}
}
+
/*@ -charint @*/
static gps_mask_t navcom_parse_input(struct gps_device_t *session)
@@ -1157,13 +1194,14 @@ static gps_mask_t navcom_parse_input(struct gps_device_t *session)
gps_mask_t st;
if (session->packet.type == NAVCOM_PACKET) {
- st = navcom_parse(session, session->packet.outbuffer, session->packet.outbuflen);
- session->gpsdata.dev.driver_mode = MODE_BINARY; /* binary */
+ st = navcom_parse(session, session->packet.outbuffer,
+ session->packet.outbuflen);
+ session->gpsdata.dev.driver_mode = MODE_BINARY; /* binary */
return st;
#ifdef NMEA_ENABLE
} else if (session->packet.type == NMEA_PACKET) {
st = nmea_parse((char *)session->packet.outbuffer, session);
- session->gpsdata.dev.driver_mode = MODE_NMEA; /* NMEA */
+ session->gpsdata.dev.driver_mode = MODE_NMEA; /* NMEA */
return st;
#endif /* NMEA_ENABLE */
} else
@@ -1171,96 +1209,100 @@ static gps_mask_t navcom_parse_input(struct gps_device_t *session)
}
#ifdef ALLOW_CONTROLSEND
-static ssize_t navcom_control_send(struct gps_device_t *session,
- char *buf, size_t len)
+static ssize_t navcom_control_send(struct gps_device_t *session,
+ char *buf, size_t len)
{
/*@ +ignoresigns -mayaliasunique @*/
putbyte(session->msgbuf, 0, 0x02);
putbyte(session->msgbuf, 1, 0x99);
putbyte(session->msgbuf, 2, 0x66);
putbyte(session->msgbuf, 3, buf[0]); /* Cmd ID */
- putleword(session->msgbuf, 4, len+4); /* Length */
- memcpy(session->msgbuf, buf+6, len-1);
- putbyte(session->msgbuf, 6 + len, checksum((unsigned char *)session->msgbuf+3, len+5));
+ putleword(session->msgbuf, 4, len + 4); /* Length */
+ memcpy(session->msgbuf, buf + 6, len - 1);
+ putbyte(session->msgbuf, 6 + len,
+ checksum((unsigned char *)session->msgbuf + 3, len + 5));
putbyte(session->msgbuf, 7 + len, 0x03);
- session->msgbuflen = len+9;
+ session->msgbuflen = len + 9;
/*@ -ignoresigns +mayaliasunique @*/
gpsd_report(LOG_RAW, "Navcom: control dump: %s\n",
- gpsd_hexdump_wrapper(session->msgbuf, session->msgbuflen, LOG_RAW));
+ gpsd_hexdump_wrapper(session->msgbuf, session->msgbuflen,
+ LOG_RAW));
return gpsd_write(session, session->msgbuf, session->msgbuflen);
}
#endif /* ALLOW_CONTROLSEND */
#ifdef ALLOW_RECONFIGURE
-static bool navcom_speed(struct gps_device_t *session,
+static bool navcom_speed(struct gps_device_t *session,
speed_t speed, char parity, int stopbits)
{
/* parity and stopbit switching aren't implemented */
- if (parity!=session->gpsdata.dev.parity || stopbits!=(int)session->gpsdata.dev.parity) {
+ if (parity != session->gpsdata.dev.parity
+ || stopbits != (int)session->gpsdata.dev.parity) {
return false;
} else {
uint8_t port, port_selection;
uint8_t baud;
- if (session->driver.navcom.physical_port == (uint8_t)0xFF) {
+ if (session->driver.navcom.physical_port == (uint8_t) 0xFF) {
/* We still don't know which port we're connected to */
return false;
}
/*@ +charint @*/
switch (speed) {
/* NOTE - The spec says that certain baud combinations
- on ports A and B are not allowed, those are
- 1200/115200, 2400/57600, and 2400/115200.
- To try and minimise the possibility of those
- occurring, we do not allow baud rates below
- 4800. We could also disallow 57600 and 115200
- to totally prevent this, but I do not consider
- that reasonable. Finding which baud speed the
- other port is set at would also be too much
- trouble, so we do not do it. */
- case 4800:
- baud = 0x04;
- break;
- case 9600:
- baud = 0x06;
- break;
- case 19200:
- baud = 0x08;
- break;
- case 38400:
- baud = 0x0a;
- break;
- case 57600:
- baud = 0x0c;
- break;
- case 115200:
- baud = 0x0e;
- break;
- default:
- /* Unsupported speed */
- return false;
+ * on ports A and B are not allowed, those are
+ * 1200/115200, 2400/57600, and 2400/115200.
+ * To try and minimise the possibility of those
+ * occurring, we do not allow baud rates below
+ * 4800. We could also disallow 57600 and 115200
+ * to totally prevent this, but I do not consider
+ * that reasonable. Finding which baud speed the
+ * other port is set at would also be too much
+ * trouble, so we do not do it. */
+ case 4800:
+ baud = 0x04;
+ break;
+ case 9600:
+ baud = 0x06;
+ break;
+ case 19200:
+ baud = 0x08;
+ break;
+ case 38400:
+ baud = 0x0a;
+ break;
+ case 57600:
+ baud = 0x0c;
+ break;
+ case 115200:
+ baud = 0x0e;
+ break;
+ default:
+ /* Unsupported speed */
+ return false;
}
/*@ -charint @*/
/* Proceed to construct our message */
- port = session->driver.navcom.physical_port;
- /*@i1@*/port_selection = (port ? port : (uint8_t)0xff) | baud;
+ port = session->driver.navcom.physical_port;
+ /*@i1@*/ port_selection = (port ? port : (uint8_t) 0xff) | baud;
/* Send it off */
navcom_cmd_0x11(session, port_selection);
/* And cheekily return true, even though we have
- no way to know if the speed change succeeded
- until and if we receive an ACK (message 0x06),
- which will be at the new baud speed if the
- command was successful. Bottom line, the client
- should requery gpsd to see if the new speed is
- different than the old one */
+ * no way to know if the speed change succeeded
+ * until and if we receive an ACK (message 0x06),
+ * which will be at the new baud speed if the
+ * command was successful. Bottom line, the client
+ * should requery gpsd to see if the new speed is
+ * different than the old one */
return true;
}
}
#endif /* ALLOW_RECONFIGURE */
/* this is everything we export */
+/* *INDENT-OFF* */
const struct gps_type_t navcom_binary =
{
.type_name = "Navcom binary", /* full name of type */
@@ -1281,6 +1323,10 @@ const struct gps_type_t navcom_binary =
#ifdef ALLOW_CONTROLSEND
.control_send = navcom_control_send, /* how to send a control string */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL, /* no method for NTP fudge factor */
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* defined(NAVCOM_ENABLE) && defined(BINARY_ENABLE) */
diff --git a/driver_nmea.c b/driver_nmea.c
index 975637ff..f6e30c22 100644
--- a/driver_nmea.c
+++ b/driver_nmea.c
@@ -73,21 +73,20 @@ static void do_lat_lon(char *field[], struct gps_fix_t *out)
static void merge_ddmmyy(char *ddmmyy, struct gps_device_t *session)
/* sentence supplied ddmmyy, but no century part */
{
- int yy = DD(ddmmyy+4), year = session->driver.nmea.date.tm_year;
+ int yy = DD(ddmmyy + 4), year = session->driver.nmea.date.tm_year;
if (year == 0) {
year = (CENTURY_BASE + yy) - 1900;
} else if (year % 100 != yy) {
/* update year */
if (year % 100 == 99 && yy == 0)
- yy += 100; /* century change */
+ yy += 100; /* century change */
year = year / 100 * 100 + yy;
}
gpsd_report(LOG_DATA, "merge_ddmmyy(ddmmyy) sets year %d from %s\n",
- year,
- ddmmyy);
+ year, ddmmyy);
session->driver.nmea.date.tm_year = year;
- session->driver.nmea.date.tm_mon = DD(ddmmyy+2)-1;
+ session->driver.nmea.date.tm_mon = DD(ddmmyy + 2) - 1;
session->driver.nmea.date.tm_mday = DD(ddmmyy);
}
@@ -97,21 +96,23 @@ static void merge_hhmmss(char *hhmmss, struct gps_device_t *session)
int old_hour = session->driver.nmea.date.tm_hour;
session->driver.nmea.date.tm_hour = DD(hhmmss);
- if (session->driver.nmea.date.tm_hour < old_hour) /* midnight wrap */
+ if (session->driver.nmea.date.tm_hour < old_hour) /* midnight wrap */
session->driver.nmea.date.tm_mday++;
- session->driver.nmea.date.tm_min = DD(hhmmss+2);
- session->driver.nmea.date.tm_sec = DD(hhmmss+4);
- session->driver.nmea.subseconds = atof(hhmmss+4) - session->driver.nmea.date.tm_sec;
+ session->driver.nmea.date.tm_min = DD(hhmmss + 2);
+ session->driver.nmea.date.tm_sec = DD(hhmmss + 4);
+ session->driver.nmea.subseconds =
+ atof(hhmmss + 4) - session->driver.nmea.date.tm_sec;
}
static void register_fractional_time(const char *tag, const char *fld,
struct gps_device_t *session)
{
- if (fld[0]!='\0') {
- session->driver.nmea.last_frac_time=session->driver.nmea.this_frac_time;
+ if (fld[0] != '\0') {
+ session->driver.nmea.last_frac_time =
+ session->driver.nmea.this_frac_time;
session->driver.nmea.this_frac_time = atof(fld);
session->driver.nmea.latch_frac_time = true;
- gpsd_report(LOG_DATA, "%s: registers fractional time %.2f\n",
+ gpsd_report(LOG_DATA, "%s: registers fractional time %.2f\n",
tag, session->driver.nmea.this_frac_time);
}
}
@@ -132,58 +133,59 @@ static void register_fractional_time(const char *tag, const char *fld,
*
**************************************************************************/
-static gps_mask_t processGPRMC(int count, char *field[], struct gps_device_t *session)
+static gps_mask_t processGPRMC(int count, char *field[],
+ struct gps_device_t *session)
/* Recommend Minimum Course Specific GPS/TRANSIT Data */
{
/*
- RMC,225446.33,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E,A*68
- 1 225446.33 Time of fix 22:54:46 UTC
- 2 A Status of Fix: A = Autonomous, valid;
- D = Differential, valid; V = invalid
- 3,4 4916.45,N Latitude 49 deg. 16.45 min North
- 5,6 12311.12,W Longitude 123 deg. 11.12 min West
- 7 000.5 Speed over ground, Knots
- 8 054.7 Course Made Good, True north
- 9 181194 Date of fix 18 November 1994
- 10,11 020.3,E Magnetic variation 20.3 deg East
- 12 A FAA mode indicator (NMEA 2.3 and later)
- A=autonomous, D=differential, E=Estimated,
- N=not valid, S=Simulator, M=Manual input mode
- *68 mandatory nmea_checksum
-
- * SiRF chipsets don't return either Mode Indicator or magnetic variation.
+ * RMC,225446.33,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E,A*68
+ * 1 225446.33 Time of fix 22:54:46 UTC
+ * 2 A Status of Fix: A = Autonomous, valid;
+ * D = Differential, valid; V = invalid
+ * 3,4 4916.45,N Latitude 49 deg. 16.45 min North
+ * 5,6 12311.12,W Longitude 123 deg. 11.12 min West
+ * 7 000.5 Speed over ground, Knots
+ * 8 054.7 Course Made Good, True north
+ * 9 181194 Date of fix 18 November 1994
+ * 10,11 020.3,E Magnetic variation 20.3 deg East
+ * 12 A FAA mode indicator (NMEA 2.3 and later)
+ * A=autonomous, D=differential, E=Estimated,
+ * N=not valid, S=Simulator, M=Manual input mode
+ * *68 mandatory nmea_checksum
+ *
+ * * SiRF chipsets don't return either Mode Indicator or magnetic variation.
*/
gps_mask_t mask = 0;
- if (strcmp(field[2], "V")==0) {
+ if (strcmp(field[2], "V") == 0) {
/* copes with Magellan EC-10X, see below */
if (session->gpsdata.status != STATUS_NO_FIX) {
session->gpsdata.status = STATUS_NO_FIX;
- mask |= STATUS_SET;
+ mask |= STATUS_IS;
}
if (session->newdata.mode >= MODE_2D) {
session->newdata.mode = MODE_NO_FIX;
- mask |= MODE_SET;
+ mask |= MODE_IS;
}
/* set something nz, so it won't look like an unknown sentence */
- mask |= ONLINE_SET;
- } else if (strcmp(field[2], "A")==0) {
+ mask |= ONLINE_IS;
+ } else if (strcmp(field[2], "A") == 0) {
/*
* The MKT3301, Royaltek RGM-3800, and possibly other
* devices deliver bogus time values when the navigation
* warning bit is set.
*/
- if (count > 9 && field[1][0]!='\0' && field[9][0]!='\0') {
+ if (count > 9 && field[1][0] != '\0' && field[9][0] != '\0') {
merge_hhmmss(field[1], session);
merge_ddmmyy(field[9], session);
- mask |= TIME_SET;
+ mask |= TIME_IS;
register_fractional_time(field[0], field[1], session);
}
do_lat_lon(&field[3], &session->newdata);
- mask |= LATLON_SET;
+ mask |= LATLON_IS;
session->newdata.speed = atof(field[7]) * KNOTS_TO_MPS;
session->newdata.track = atof(field[8]);
- mask |= (TRACK_SET | SPEED_SET);
+ mask |= (TRACK_IS | SPEED_IS);
/*
* This copes with GPSes like the Magellan EC-10X that *only* emit
* GPRMC. In this case we set mode and status here so the client
@@ -192,15 +194,15 @@ static gps_mask_t processGPRMC(int count, char *field[], struct gps_device_t *se
*/
if (session->gpsdata.status == STATUS_NO_FIX) {
session->gpsdata.status = STATUS_FIX; /* could be DGPS_FIX, we can't tell */
- mask |= STATUS_SET;
+ mask |= STATUS_IS;
}
if (session->newdata.mode < MODE_2D) {
session->newdata.mode = MODE_2D;
- mask |= MODE_SET;
+ mask |= MODE_IS;
}
}
- gpsd_report(LOG_DATA,
+ gpsd_report(LOG_DATA,
"RMC: ddmmyy=%s hhmmss=%s lat=%.2f lon=%.2f "
"speed=%.2f track=%.2f mode=%d status=%d mask=%s\n",
field[9], field[1],
@@ -209,64 +211,65 @@ static gps_mask_t processGPRMC(int count, char *field[], struct gps_device_t *se
session->newdata.speed,
session->newdata.track,
session->newdata.mode,
- session->gpsdata.status,
- gpsd_maskdump(mask));
+ session->gpsdata.status, gpsd_maskdump(mask));
return mask;
}
-static gps_mask_t processGPGLL(int count, char *field[], struct gps_device_t *session)
+static gps_mask_t processGPGLL(int count, char *field[],
+ struct gps_device_t *session)
/* Geographic position - Latitude, Longitude */
{
/* Introduced in NMEA 3.0.
-
- $GPGLL,4916.45,N,12311.12,W,225444,A,A*5C
-
- 1,2: 4916.46,N Latitude 49 deg. 16.45 min. North
- 3,4: 12311.12,W Longitude 123 deg. 11.12 min. West
- 5: 225444 Fix taken at 22:54:44 UTC
- 6: A Data valid
- 7: A Autonomous mode
- 8: *5C Mandatory NMEA checksum
-
- 1,2 Latitude, N (North) or S (South)
- 3,4 Longitude, E (East) or W (West)
- 5 UTC of position
- 6 A=Active, V=Void
- 7 Mode Indicator
- A = Autonomous mode
- D = Differential Mode
- E = Estimated (dead-reckoning) mode
- M = Manual Input Mode
- S = Simulated Mode
- N = Data Not Valid
-
- I found a note at <http://www.secoh.ru/windows/gps/nmfqexep.txt>
- indicating that the Garmin 65 does not return time and status.
- SiRF chipsets don't return the Mode Indicator.
- This code copes gracefully with both quirks.
-
- Unless you care about the FAA indicator, this sentence supplies nothing
- that GPRMC doesn't already. But at least one Garmin GPS -- the 48
- actually ships updates in GPLL that aren't redundant.
+ *
+ * $GPGLL,4916.45,N,12311.12,W,225444,A,A*5C
+ *
+ * 1,2: 4916.46,N Latitude 49 deg. 16.45 min. North
+ * 3,4: 12311.12,W Longitude 123 deg. 11.12 min. West
+ * 5: 225444 Fix taken at 22:54:44 UTC
+ * 6: A Data valid
+ * 7: A Autonomous mode
+ * 8: *5C Mandatory NMEA checksum
+ *
+ * 1,2 Latitude, N (North) or S (South)
+ * 3,4 Longitude, E (East) or W (West)
+ * 5 UTC of position
+ * 6 A=Active, V=Void
+ * 7 Mode Indicator
+ * A = Autonomous mode
+ * D = Differential Mode
+ * E = Estimated (dead-reckoning) mode
+ * M = Manual Input Mode
+ * S = Simulated Mode
+ * N = Data Not Valid
+ *
+ * I found a note at <http://www.secoh.ru/windows/gps/nmfqexep.txt>
+ * indicating that the Garmin 65 does not return time and status.
+ * SiRF chipsets don't return the Mode Indicator.
+ * This code copes gracefully with both quirks.
+ *
+ * Unless you care about the FAA indicator, this sentence supplies nothing
+ * that GPRMC doesn't already. But at least one Garmin GPS -- the 48
+ * actually ships updates in GPLL that aren't redundant.
*/
char *status = field[7];
- gps_mask_t mask = ERROR_SET;
+ gps_mask_t mask = ERROR_IS;
- if (field[5][0]!='\0') {
+ if (field[5][0] != '\0') {
merge_hhmmss(field[5], session);
register_fractional_time(field[0], field[5], session);
if (session->driver.nmea.date.tm_year == 0)
- gpsd_report(LOG_WARN, "can't use GLL time until after ZDA or RMC has supplied a year.\n");
+ gpsd_report(LOG_WARN,
+ "can't use GLL time until after ZDA or RMC has supplied a year.\n");
else {
- mask = TIME_SET;
+ mask = TIME_IS;
}
}
- if (strcmp(field[6], "A")==0 && (count < 8 || *status != 'N')) {
+ if (strcmp(field[6], "A") == 0 && (count < 8 || *status != 'N')) {
int newstatus = session->gpsdata.status;
- mask &=~ ERROR_SET;
+ mask &= ~ERROR_IS;
do_lat_lon(&field[1], &session->newdata);
- mask |= LATLON_SET;
+ mask |= LATLON_IS;
if (count >= 8 && *status == 'D')
newstatus = STATUS_DGPS_FIX; /* differential */
else
@@ -280,59 +283,60 @@ static gps_mask_t processGPGLL(int count, char *field[], struct gps_device_t *se
*/
if (session->newdata.mode < MODE_2D) {
session->newdata.mode = MODE_2D;
- mask |= MODE_SET;
+ mask |= MODE_IS;
}
session->gpsdata.status = newstatus;
- mask |= STATUS_SET;
+ mask |= STATUS_IS;
}
- gpsd_report(LOG_DATA,
+ gpsd_report(LOG_DATA,
"GLL: hhmmss=%s lat=%.2f lon=%.2f mode=%d status=%d mask=%s\n",
field[5],
session->newdata.latitude,
session->newdata.longitude,
session->newdata.mode,
- session->gpsdata.status,
- gpsd_maskdump(mask));
+ session->gpsdata.status, gpsd_maskdump(mask));
return mask;
}
-static gps_mask_t processGPGGA(int c UNUSED, char *field[], struct gps_device_t *session)
+static gps_mask_t processGPGGA(int c UNUSED, char *field[],
+ struct gps_device_t *session)
/* Global Positioning System Fix Data */
{
/*
- GGA,123519,4807.038,N,01131.324,E,1,08,0.9,545.4,M,46.9,M, , *42
- 1 123519 Fix taken at 12:35:19 UTC
- 2,3 4807.038,N Latitude 48 deg 07.038' N
- 4,5 01131.324,E Longitude 11 deg 31.324' E
- 6 1 Fix quality: 0 = invalid, 1 = GPS, 2 = DGPS,
- 3=PPS (Precise Position Service),
- 4=RTK (Real Time Kinematic) with fixed integers,
- 5=Float RTK, 6=Estimated, 7=Manual, 8=Simulator
- 7 08 Number of satellites being tracked
- 8 0.9 Horizontal dilution of position
- 9,10 545.4,M Altitude, Metres above mean sea level
- 11,12 46.9,M Height of geoid (mean sea level) above WGS84
- ellipsoid, in Meters
- (empty field) time in seconds since last DGPS update
- (empty field) DGPS station ID number (0000-1023)
- */
+ * GGA,123519,4807.038,N,01131.324,E,1,08,0.9,545.4,M,46.9,M, , *42
+ * 1 123519 Fix taken at 12:35:19 UTC
+ * 2,3 4807.038,N Latitude 48 deg 07.038' N
+ * 4,5 01131.324,E Longitude 11 deg 31.324' E
+ * 6 1 Fix quality: 0 = invalid, 1 = GPS, 2 = DGPS,
+ * 3=PPS (Precise Position Service),
+ * 4=RTK (Real Time Kinematic) with fixed integers,
+ * 5=Float RTK, 6=Estimated, 7=Manual, 8=Simulator
+ * 7 08 Number of satellites being tracked
+ * 8 0.9 Horizontal dilution of position
+ * 9,10 545.4,M Altitude, Metres above mean sea level
+ * 11,12 46.9,M Height of geoid (mean sea level) above WGS84
+ * ellipsoid, in Meters
+ * (empty field) time in seconds since last DGPS update
+ * (empty field) DGPS station ID number (0000-1023)
+ */
gps_mask_t mask;
session->gpsdata.status = atoi(field[6]);
- mask = STATUS_SET;
+ mask = STATUS_IS;
if (session->gpsdata.status > STATUS_NO_FIX) {
char *altitude;
merge_hhmmss(field[1], session);
register_fractional_time(field[0], field[1], session);
if (session->driver.nmea.date.tm_year == 0)
- gpsd_report(LOG_WARN, "can't use GGA time until after ZDA or RMC has supplied a year.\n");
+ gpsd_report(LOG_WARN,
+ "can't use GGA time until after ZDA or RMC has supplied a year.\n");
else {
- mask |= TIME_SET;
+ mask |= TIME_IS;
}
do_lat_lon(&field[2], &session->newdata);
- mask |= LATLON_SET;
+ mask |= LATLON_IS;
session->gpsdata.satellites_used = atoi(field[7]);
altitude = field[9];
/*
@@ -342,12 +346,13 @@ static gps_mask_t processGPGGA(int c UNUSED, char *field[], struct gps_device_t
*/
if (altitude[0] == '\0') {
if (session->newdata.mode == MODE_3D) {
- session->newdata.mode = session->gpsdata.status ? MODE_2D : MODE_NO_FIX;
- mask |= MODE_SET;
+ session->newdata.mode =
+ session->gpsdata.status ? MODE_2D : MODE_NO_FIX;
+ mask |= MODE_IS;
}
} else {
session->newdata.altitude = atof(altitude);
- mask |= ALTITUDE_SET;
+ mask |= ALTITUDE_IS;
/*
* This is a bit dodgy. Technically we shouldn't set the mode
* bit until we see GSA. But it may be later in the cycle,
@@ -357,41 +362,43 @@ static gps_mask_t processGPGGA(int c UNUSED, char *field[], struct gps_device_t
*/
if (session->newdata.mode < MODE_3D) {
session->newdata.mode = MODE_3D;
- mask |= MODE_SET;
+ mask |= MODE_IS;
}
}
if (strlen(field[11]) > 0) {
- session->gpsdata.separation = atof(field[11]);
+ session->gpsdata.separation = atof(field[11]);
} else {
- session->gpsdata.separation = wgs84_separation(session->newdata.latitude,session->newdata.longitude);
+ session->gpsdata.separation =
+ wgs84_separation(session->newdata.latitude,
+ session->newdata.longitude);
}
}
- gpsd_report(LOG_DATA,
+ gpsd_report(LOG_DATA,
"GGA: hhmmss=%s lat=%.2f lon=%.2f alt=%.2f mode=%d status=%d mask=%s\n",
field[1],
session->newdata.latitude,
session->newdata.longitude,
session->newdata.altitude,
session->newdata.mode,
- session->gpsdata.status,
- gpsd_maskdump(mask));
+ session->gpsdata.status, gpsd_maskdump(mask));
return mask;
}
-static gps_mask_t processGPGSA(int count, char *field[], struct gps_device_t *session)
+static gps_mask_t processGPGSA(int count, char *field[],
+ struct gps_device_t *session)
/* GPS DOP and Active Satellites */
{
/*
- eg1. $GPGSA,A,3,,,,,,16,18,,22,24,,,3.6,2.1,2.2*3C
- eg2. $GPGSA,A,3,19,28,14,18,27,22,31,39,,,,,1.7,1.0,1.3*35
- 1 = Mode:
- M=Manual, forced to operate in 2D or 3D
- A=Automatic, 3D/2D
- 2 = Mode: 1=Fix not available, 2=2D, 3=3D
- 3-14 = PRNs of satellites used in position fix (null for unused fields)
- 15 = PDOP
- 16 = HDOP
- 17 = VDOP
+ * eg1. $GPGSA,A,3,,,,,,16,18,,22,24,,,3.6,2.1,2.2*3C
+ * eg2. $GPGSA,A,3,19,28,14,18,27,22,31,39,,,,,1.7,1.0,1.3*35
+ * 1 = Mode:
+ * M=Manual, forced to operate in 2D or 3D
+ * A=Automatic, 3D/2D
+ * 2 = Mode: 1=Fix not available, 2=2D, 3=3D
+ * 3-14 = PRNs of satellites used in position fix (null for unused fields)
+ * 15 = PDOP
+ * 16 = HDOP
+ * 17 = VDOP
*/
gps_mask_t mask;
@@ -403,8 +410,8 @@ static gps_mask_t processGPGSA(int count, char *field[], struct gps_device_t *se
* Alarmingly, it's possible this error may be generic to SiRFstarIII.
*/
if (count < 17) {
- gpsd_report(LOG_DATA, "GPGSA: malformed, setting ONLINE_SET only.\n");
- mask = ONLINE_SET;
+ gpsd_report(LOG_DATA, "GPGSA: malformed, setting ONLINE_IS only.\n");
+ mask = ONLINE_IS;
} else {
int i;
session->newdata.mode = atoi(field[2]);
@@ -416,79 +423,85 @@ static gps_mask_t processGPGSA(int count, char *field[], struct gps_device_t *se
if (session->newdata.mode == 0 && field[2][0] == 'E')
mask = 0;
else
- mask = MODE_SET;
+ mask = MODE_IS;
gpsd_report(LOG_PROG, "GPGSA sets mode %d\n", session->newdata.mode);
clear_dop(&session->gpsdata.dop);
session->gpsdata.dop.pdop = atof(field[15]);
session->gpsdata.dop.hdop = atof(field[16]);
session->gpsdata.dop.vdop = atof(field[17]);
session->gpsdata.satellites_used = 0;
- memset(session->gpsdata.used,0,sizeof(session->gpsdata.used));
+ memset(session->gpsdata.used, 0, sizeof(session->gpsdata.used));
/* the magic 6 here counts the tag, two mode fields, and the DOP fields */
for (i = 0; i < count - 6; i++) {
- int prn = atoi(field[i+3]);
+ int prn = atoi(field[i + 3]);
if (prn > 0)
- session->gpsdata.used[session->gpsdata.satellites_used++] = prn;
+ session->gpsdata.used[session->gpsdata.satellites_used++] =
+ prn;
}
- mask |= DOP_SET | USED_SET;
+ mask |= DOP_IS | USED_IS;
/* FIXME: perhaps dump the satellite vector here? */
- gpsd_report(LOG_DATA,
+ gpsd_report(LOG_DATA,
"GPGSA: mode=%d used=%d pdop=%.2f hdop=%.2f vdop=%.2f mask=%s\n",
session->newdata.mode,
session->gpsdata.satellites_used,
session->gpsdata.dop.pdop,
session->gpsdata.dop.hdop,
- session->gpsdata.dop.vdop,
- gpsd_maskdump(mask));
+ session->gpsdata.dop.vdop, gpsd_maskdump(mask));
}
return mask;
}
-static gps_mask_t processGPGSV(int count, char *field[], struct gps_device_t *session)
+static gps_mask_t processGPGSV(int count, char *field[],
+ struct gps_device_t *session)
/* GPS Satellites in View */
{
/*
- GSV,2,1,08,01,40,083,46,02,17,308,41,12,07,344,39,14,22,228,45*75
- 2 Number of sentences for full data
- 1 Sentence 1 of 2
- 08 Total number of satellites in view
- 01 Satellite PRN number
- 40 Elevation, degrees
- 083 Azimuth, degrees
- 46 Signal-to-noise ratio in decibels
- <repeat for up to 4 satellites per sentence>
- There my be up to three GSV sentences in a data packet
+ * GSV,2,1,08,01,40,083,46,02,17,308,41,12,07,344,39,14,22,228,45*75
+ * 2 Number of sentences for full data
+ * 1 Sentence 1 of 2
+ * 08 Total number of satellites in view
+ * 01 Satellite PRN number
+ * 40 Elevation, degrees
+ * 083 Azimuth, degrees
+ * 46 Signal-to-noise ratio in decibels
+ * <repeat for up to 4 satellites per sentence>
+ * There my be up to three GSV sentences in a data packet
*/
int n, fldnum;
if (count <= 3) {
gpsd_zero_satellites(&session->gpsdata);
session->gpsdata.satellites_visible = 0;
- return ERROR_SET;
+ return ERROR_IS;
}
if (count % 4 != 0) {
- gpsd_report(LOG_WARN, "malformed GPGSV - fieldcount %d %% 4 != 0\n", count);
+ gpsd_report(LOG_WARN, "malformed GPGSV - fieldcount %d %% 4 != 0\n",
+ count);
gpsd_zero_satellites(&session->gpsdata);
session->gpsdata.satellites_visible = 0;
- return ERROR_SET;
+ return ERROR_IS;
}
session->driver.nmea.await = atoi(field[1]);
if (sscanf(field[2], "%d", &session->driver.nmea.part) < 1) {
gpsd_zero_satellites(&session->gpsdata);
- return ERROR_SET;
+ return ERROR_IS;
} else if (session->driver.nmea.part == 1)
gpsd_zero_satellites(&session->gpsdata);
- for (fldnum = 4; fldnum < count; ) {
+ for (fldnum = 4; fldnum < count;) {
if (session->gpsdata.satellites_visible >= MAXCHANNELS) {
gpsd_report(LOG_ERROR, "internal error - too many satellites!\n");
gpsd_zero_satellites(&session->gpsdata);
break;
}
- session->gpsdata.PRN[session->gpsdata.satellites_visible] = atoi(field[fldnum++]);
- session->gpsdata.elevation[session->gpsdata.satellites_visible] = atoi(field[fldnum++]);
- session->gpsdata.azimuth[session->gpsdata.satellites_visible] = atoi(field[fldnum++]);
- session->gpsdata.ss[session->gpsdata.satellites_visible] = (float)atoi(field[fldnum++]);
+ session->gpsdata.PRN[session->gpsdata.satellites_visible] =
+ atoi(field[fldnum++]);
+ session->gpsdata.elevation[session->gpsdata.satellites_visible] =
+ atoi(field[fldnum++]);
+ session->gpsdata.azimuth[session->gpsdata.satellites_visible] =
+ atoi(field[fldnum++]);
+ session->gpsdata.ss[session->gpsdata.satellites_visible] =
+ (float)atoi(field[fldnum++]);
/*
* Incrementing this unconditionally falls afoul of chipsets like
* the Motorola Oncore GT+ that emit empty fields at the end of the
@@ -498,15 +511,17 @@ static gps_mask_t processGPGSV(int count, char *field[], struct gps_device_t *se
if (session->gpsdata.PRN[session->gpsdata.satellites_visible] != 0)
session->gpsdata.satellites_visible++;
}
- if (session->driver.nmea.part == session->driver.nmea.await && atoi(field[3]) != session->gpsdata.satellites_visible)
- gpsd_report(LOG_WARN, "GPGSV field 3 value of %d != actual count %d\n",
+ if (session->driver.nmea.part == session->driver.nmea.await
+ && atoi(field[3]) != session->gpsdata.satellites_visible)
+ gpsd_report(LOG_WARN,
+ "GPGSV field 3 value of %d != actual count %d\n",
atoi(field[3]), session->gpsdata.satellites_visible);
/* not valid data until we've seen a complete set of parts */
if (session->driver.nmea.part < session->driver.nmea.await) {
- gpsd_report(LOG_PROG, "Partial satellite data (%d of %d).\n",
+ gpsd_report(LOG_PROG, "Partial satellite data (%d of %d).\n",
session->driver.nmea.part, session->driver.nmea.await);
- return ERROR_SET;
+ return ERROR_IS;
}
/*
* This sanity check catches an odd behavior of SiRFstarII receivers.
@@ -519,76 +534,76 @@ static gps_mask_t processGPGSV(int count, char *field[], struct gps_device_t *se
for (n = 0; n < session->gpsdata.satellites_visible; n++)
if (session->gpsdata.azimuth[n] != 0)
goto sane;
- gpsd_report(LOG_WARN, "Satellite data no good (%d of %d).\n",
+ gpsd_report(LOG_WARN, "Satellite data no good (%d of %d).\n",
session->driver.nmea.part, session->driver.nmea.await);
gpsd_zero_satellites(&session->gpsdata);
- return ERROR_SET;
+ return ERROR_IS;
sane:
session->gpsdata.skyview_time = NAN;
- gpsd_report(LOG_DATA, "GSV: Satellite data OK (%d of %d).\n",
+ gpsd_report(LOG_DATA, "GSV: Satellite data OK (%d of %d).\n",
session->driver.nmea.part, session->driver.nmea.await);
// FIXME: Dump satellite state at LOG_DATA level on final sentence
- return SATELLITE_SET;
+ return SATELLITE_IS;
}
-static gps_mask_t processPGRME(int c UNUSED, char *field[], struct gps_device_t *session)
+static gps_mask_t processPGRME(int c UNUSED, char *field[],
+ struct gps_device_t *session)
/* Garmin Estimated Position Error */
{
/*
- $PGRME,15.0,M,45.0,M,25.0,M*22
- 1 = horizontal error estimate
- 2 = units
- 3 = vertical error estimate
- 4 = units
- 5 = spherical error estimate
- 6 = units
- *
- * Garmin won't say, but the general belief is that these are 50% CEP.
- * We follow the advice at <http://gpsinformation.net/main/errors.htm>.
- * If this assumption changes here, it should also change in garmin.c
- * where we scale error estimates from Garmin binary packets, and
- * in libgpsd_core.c where we generate $PGRME.
+ * $PGRME,15.0,M,45.0,M,25.0,M*22
+ * 1 = horizontal error estimate
+ * 2 = units
+ * 3 = vertical error estimate
+ * 4 = units
+ * 5 = spherical error estimate
+ * 6 = units
+ * *
+ * * Garmin won't say, but the general belief is that these are 50% CEP.
+ * * We follow the advice at <http://gpsinformation.net/main/errors.htm>.
+ * * If this assumption changes here, it should also change in garmin.c
+ * * where we scale error estimates from Garmin binary packets, and
+ * * in libgpsd_core.c where we generate $PGRME.
*/
gps_mask_t mask;
- if ((strcmp(field[2], "M")!=0) ||
- (strcmp(field[4], "M")!=0) ||
- (strcmp(field[6], "M")!=0)) {
- session->newdata.epx =
+ if ((strcmp(field[2], "M") != 0) ||
+ (strcmp(field[4], "M") != 0) || (strcmp(field[6], "M") != 0)) {
+ session->newdata.epx =
session->newdata.epy =
- session->newdata.epv =
- session->gpsdata.epe = 100;
- mask = ERROR_SET;
- }
- else
- {
- session->newdata.epx = session->newdata.epy = atof(field[1]) * (1/sqrt(2)) * (GPSD_CONFIDENCE/CEP50_SIGMA);
- session->newdata.epv = atof(field[3]) * (GPSD_CONFIDENCE/CEP50_SIGMA);
- session->gpsdata.epe = atof(field[5]) * (GPSD_CONFIDENCE/CEP50_SIGMA);
- mask = HERR_SET | VERR_SET | PERR_SET;
+ session->newdata.epv = session->gpsdata.epe = 100;
+ mask = ERROR_IS;
+ } else {
+ session->newdata.epx = session->newdata.epy =
+ atof(field[1]) * (1 / sqrt(2)) * (GPSD_CONFIDENCE / CEP50_SIGMA);
+ session->newdata.epv =
+ atof(field[3]) * (GPSD_CONFIDENCE / CEP50_SIGMA);
+ session->gpsdata.epe =
+ atof(field[5]) * (GPSD_CONFIDENCE / CEP50_SIGMA);
+ mask = HERR_IS | VERR_IS | PERR_IS;
}
gpsd_report(LOG_DATA, "PGRME: epx=%.2f epy=%.2f epv=%.2f mask=%s\n",
session->newdata.epx,
session->newdata.epy,
- session->newdata.epv,
- gpsd_maskdump(mask));
+ session->newdata.epv, gpsd_maskdump(mask));
return mask;
}
-static gps_mask_t processGPGBS(int c UNUSED, char *field[], struct gps_device_t *session)
+static gps_mask_t processGPGBS(int c UNUSED, char *field[],
+ struct gps_device_t *session)
/* NMEA 3.0 Estimated Position Error */
{
/*
- $GPGBS,082941.00,2.4,1.5,3.9,25,,-43.7,27.5*65
- 1) UTC time of the fix associated with this sentence (hhmmss.ss)
- 2) Expected error in latitude (meters)
- 3) Expected error in longitude (meters)
- 4) Expected error in altitude (meters)
- 5) PRN of most likely failed satellite
- 6) Probability of missed detection for most likely failed satellite
- 7) Estimate of bias in meters on most likely failed satellite
- 8) Standard deviation of bias estimate
- 9) Checksum
+ * $GPGBS,082941.00,2.4,1.5,3.9,25,,-43.7,27.5*65
+ * 1) UTC time of the fix associated with this sentence (hhmmss.ss)
+ * 2) Expected error in latitude (meters)
+ * 3) Expected error in longitude (meters)
+ * 4) Expected error in altitude (meters)
+ * 5) PRN of most likely failed satellite
+ * 6) Probability of missed detection for most likely failed satellite
+ * 7) Estimate of bias in meters on most likely failed satellite
+ * 8) Standard deviation of bias estimate
+ * 9) Checksum
*/
/* register fractional time for end-of-cycle detection */
@@ -596,45 +611,47 @@ static gps_mask_t processGPGBS(int c UNUSED, char *field[], struct gps_device_t
/* check that we're associated with the current fix */
if (session->driver.nmea.date.tm_hour == DD(field[1])
- && session->driver.nmea.date.tm_min == DD(field[1]+2)
- && session->driver.nmea.date.tm_sec == DD(field[1]+4)) {
+ && session->driver.nmea.date.tm_min == DD(field[1] + 2)
+ && session->driver.nmea.date.tm_sec == DD(field[1] + 4)) {
session->newdata.epy = atof(field[2]);
session->newdata.epx = atof(field[3]);
session->newdata.epv = atof(field[4]);
gpsd_report(LOG_DATA, "GBS: epx=%.2f epy=%.2f epv=%.2f mask=%s\n",
session->newdata.epx,
session->newdata.epy,
- session->newdata.epv,
- gpsd_maskdump(HERR_SET | VERR_SET));
- return HERR_SET | VERR_SET;
+ session->newdata.epv, gpsd_maskdump(HERR_IS | VERR_IS));
+ return HERR_IS | VERR_IS;
} else {
- gpsd_report(LOG_PROG, "second in $GPGBS error estimates doesn't match.\n");
+ gpsd_report(LOG_PROG,
+ "second in $GPGBS error estimates doesn't match.\n");
return 0;
}
}
-static gps_mask_t processGPZDA(int c UNUSED, char *field[], struct gps_device_t *session)
+static gps_mask_t processGPZDA(int c UNUSED, char *field[],
+ struct gps_device_t *session)
/* Time & Date */
{
/*
- $GPZDA,160012.71,11,03,2004,-1,00*7D
- 1) UTC time (hours, minutes, seconds, may have fractional subsecond)
- 2) Day, 01 to 31
- 3) Month, 01 to 12
- 4) Year (4 digits)
- 5) Local zone description, 00 to +- 13 hours
- 6) Local zone minutes description, apply same sign as local hours
- 7) Checksum
-
- Note: some devices, like the uBlox ANTARIS 4h, are known to ship ZDAs
- with some fields blank under poorly-understood circumstances (probably
- when they don't have satellite lock yet).
+ * $GPZDA,160012.71,11,03,2004,-1,00*7D
+ * 1) UTC time (hours, minutes, seconds, may have fractional subsecond)
+ * 2) Day, 01 to 31
+ * 3) Month, 01 to 12
+ * 4) Year (4 digits)
+ * 5) Local zone description, 00 to +- 13 hours
+ * 6) Local zone minutes description, apply same sign as local hours
+ * 7) Checksum
+ *
+ * Note: some devices, like the uBlox ANTARIS 4h, are known to ship ZDAs
+ * with some fields blank under poorly-understood circumstances (probably
+ * when they don't have satellite lock yet).
*/
gps_mask_t mask;
- if (field[1][0]=='\0' || field[2][0]=='\0' || field[3][0]=='\0' || field[4][0]=='\0') {
+ if (field[1][0] == '\0' || field[2][0] == '\0' || field[3][0] == '\0'
+ || field[4][0] == '\0') {
gpsd_report(LOG_WARN, "malformed ZDA\n");
- mask = ERROR_SET;
+ mask = ERROR_IS;
} else {
merge_hhmmss(field[1], session);
/*
@@ -644,144 +661,150 @@ static gps_mask_t processGPZDA(int c UNUSED, char *field[], struct gps_device_t
* like they have a variable fix reporting cycle.
*/
session->driver.nmea.date.tm_year = atoi(field[4]) - 1900;
- session->driver.nmea.date.tm_mon = atoi(field[3])-1;
+ session->driver.nmea.date.tm_mon = atoi(field[3]) - 1;
session->driver.nmea.date.tm_mday = atoi(field[2]);
- mask = TIME_SET;
+ mask = TIME_IS;
};
- gpsd_report(LOG_DATA, "ZDA: mask=%s\n",
- gpsd_maskdump(mask));
+ gpsd_report(LOG_DATA, "ZDA: mask=%s\n", gpsd_maskdump(mask));
return mask;
}
#ifdef TNT_ENABLE
-static gps_mask_t processTNTHTM(int c UNUSED, char *field[], struct gps_device_t *session)
+static gps_mask_t processTNTHTM(int c UNUSED, char *field[],
+ struct gps_device_t *session)
{
/*
* Proprietary sentence for True North Technologies Magnetic Compass.
* This may also apply to some Honeywell units since they may have been
* designed by True North.
-
- HTM,x.x,a,x.x,a,x.x,a,x.x,x.x*hh<cr><lf>
- Fields in order:
- 1. True heading in degrees
- 2. magnetometer status character:
- C = magnetometer calibration alarm
- L = low alarm
- M = low warning
- N = normal
- O = high warning
- P = high alarm
- V = magnetometer voltage level alarm
- 3. pitch angle
- 4. pitch status character - see field 2 above
- 5. roll angle
- 6. roll status character - see field 2 above
- 7. dip angle
- 8. relative magnitude horizontal component of earth's magnetic field
- *hh mandatory nmea_checksum
+
+ $PTNTHTM,14223,N,169,N,-43,N,13641,2454*15
+
+ HTM,x.x,a,x.x,a,x.x,a,x.x,x.x*hh<cr><lf>
+ Fields in order:
+ 1. True heading (compass measurement + deviation + variation)
+ 2. magnetometer status character:
+ C = magnetometer calibration alarm
+ L = low alarm
+ M = low warning
+ N = normal
+ O = high warning
+ P = high alarm
+ V = magnetometer voltage level alarm
+ 3. pitch angle
+ 4. pitch status character - see field 2 above
+ 5. roll angle
+ 6. roll status character - see field 2 above
+ 7. dip angle
+ 8. relative magnitude horizontal component of earth's magnetic field
+ *hh mandatory nmea_checksum
+
+ By default, angles are reported as 26-bit integers: weirdly, the
+ technical manual says either 0 to 65535 or -32768 to 32767 can
+ occur as a range.
*/
gps_mask_t mask;
- mask = ONLINE_SET;
-
- //gpsd_zero_satellites(&session->gpsdata);
-
- /*
- * Heading maps to track.
- * Pitch maps to climb.
- * Roll maps to speed.
- * Dip maps to altitude.
- */
- session->newdata.time = timestamp();
- session->newdata.track = atof(field[1]);
- session->gpsdata.headingStatus = *field[2];
- session->newdata.climb = atof(field[3]);
- session->gpsdata.pitchStatus = *field[4];
- session->newdata.speed = atof(field[5]);
- session->gpsdata.rollStatus = *field[6];
- session->newdata.altitude = atof(field[7]);
- session->gpsdata.horzField = atof(field[8]);
- session->newdata.mode = MODE_3D;
- mask |= (STATUS_SET | MODE_SET | TRACK_SET | SPEED_SET | CLIMB_SET | ALTITUDE_SET);
- session->gpsdata.status = STATUS_FIX; /* could be DGPS_FIX */
-
- gpsd_report(LOG_RAW, "Heading %lf %c.\n", session->newdata.track, session->gpsdata.headingStatus);
+ mask = ONLINE_IS;
+
+ session->gpsdata.attitude.heading = atof(field[1]);
+ session->gpsdata.attitude.mag_st = *field[2];
+ session->gpsdata.attitude.pitch = atof(field[3]);
+ session->gpsdata.attitude.pitch_st = *field[4];
+ session->gpsdata.attitude.roll = atof(field[5]);
+ session->gpsdata.attitude.roll_st = *field[6];
+ session->gpsdata.attitude.yaw = NAN;
+ session->gpsdata.attitude.yaw_st = '\0';
+ session->gpsdata.attitude.dip = atof(field[7]);
+ session->gpsdata.attitude.mag_len = NAN;
+ session->gpsdata.attitude.mag_x = atof(field[8]);
+ session->gpsdata.attitude.mag_y = NAN;
+ session->gpsdata.attitude.mag_z = NAN;
+ session->gpsdata.attitude.acc_len = NAN;
+ session->gpsdata.attitude.acc_x = NAN;
+ session->gpsdata.attitude.acc_y = NAN;
+ session->gpsdata.attitude.acc_z = NAN;
+ session->gpsdata.attitude.gyro_x = NAN;
+ session->gpsdata.attitude.gyro_y = NAN;
+ mask |= (ATT_IS);
+
+ gpsd_report(LOG_RAW, "time %.3f, heading %lf (%c).\n",
+ session->newdata.time,
+ session->gpsdata.attitude.heading,
+ session->gpsdata.attitude.mag_st);
return mask;
}
#endif /* TNT_ENABLE */
#ifdef OCEANSERVER_ENABLE
-static gps_mask_t processOHPR(int c UNUSED, char *field[], struct gps_device_t *session)
+static gps_mask_t processOHPR(int c UNUSED, char *field[],
+ struct gps_device_t *session)
{
/*
* Proprietary sentence for OceanServer Magnetic Compass.
-
- OHPR,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x*hh<cr><lf>
- Fields in order:
- 1. Azimuth
- 2. Pitch Angle
- 3. Roll Angle
- 4. Temperature
- 5. Depth (feet)
- 6. Magnetic Vector Length
- 7-9. 3 axis Magnetic Field readings x,y,z
- 10. Acceleration Vector Length
- 11-13. 3 axis Acceleration Readings x,y,z
- 14. Reserved
- 15-16. 2 axis Gyro Output, X,y
- 17. Reserved
- 18. Reserved
- *hh mandatory nmea_checksum
+
+ OHPR,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x,x.x*hh<cr><lf>
+ Fields in order:
+ 1. Azimuth
+ 2. Pitch Angle
+ 3. Roll Angle
+ 4. Sensor temp, degrees centigrade
+ 5. Depth (feet)
+ 6. Magnetic Vector Length
+ 7-9. 3 axis Magnetic Field readings x,y,z
+ 10. Acceleration Vector Length
+ 11-13. 3 axis Acceleration Readings x,y,z
+ 14. Reserved
+ 15-16. 2 axis Gyro Output, X,y
+ 17. Reserved
+ 18. Reserved
+ *hh mandatory nmea_checksum
*/
gps_mask_t mask;
- mask = ONLINE_SET;
-
- //gpsd_zero_satellites(&session->gpsdata);
-
- /*
- * Heading maps to track.
- * Pitch maps to climb.
- * Roll maps to speed.
- * Depth maps to altitude.
- */
- session->newdata.time = timestamp();
- session->newdata.track = atof(field[1]);
- session->newdata.climb = atof(field[2]);
- session->newdata.speed = atof(field[3]);
- session->gpsdata.compass.temperature = atof(field[4]);
- session->newdata.altitude = atof(field[5]);
- session->gpsdata.compass.magnetic_length = atof(field[6]);
- session->gpsdata.compass.magnetic_field_x = atof(field[7]);
- session->gpsdata.compass.magnetic_field_y = atof(field[8]);
- session->gpsdata.compass.magnetic_field_z = atof(field[9]);
- session->gpsdata.compass.acceleration_length = atof(field[10]);
- session->gpsdata.compass.acceleration_field_x = atof(field[11]);
- session->gpsdata.compass.acceleration_field_y = atof(field[12]);
- session->gpsdata.compass.acceleration_field_z = atof(field[13]);
- session->gpsdata.compass.gyro_output_x = atof(field[15]);
- session->gpsdata.compass.gyro_output_y = atof(field[16]);
- session->newdata.mode = MODE_3D;
- mask |= (STATUS_SET | MODE_SET | TRACK_SET | SPEED_SET | CLIMB_SET | ALTITUDE_SET);
- session->gpsdata.status = STATUS_FIX; /* could be DGPS_FIX */
-
- gpsd_report(LOG_RAW, "Heading %lf.\n", session->newdata.track);
+ mask = ONLINE_IS;
+
+ session->gpsdata.attitude.heading = atof(field[1]);
+ session->gpsdata.attitude.mag_st = '\0';
+ session->gpsdata.attitude.pitch = atof(field[2]);
+ session->gpsdata.attitude.pitch_st = '\0';
+ session->gpsdata.attitude.roll = atof(field[3]);
+ session->gpsdata.attitude.roll_st = '\0';
+ session->gpsdata.attitude.yaw = NAN;
+ session->gpsdata.attitude.yaw_st = '\0';
+ session->gpsdata.attitude.dip = NAN;
+ session->gpsdata.attitude.temp = atof(field[4]);
+ session->gpsdata.attitude.depth = atof(field[5]) / METERS_TO_FEET;
+ session->gpsdata.attitude.mag_len = atof(field[6]);
+ session->gpsdata.attitude.mag_x = atof(field[7]);
+ session->gpsdata.attitude.mag_y = atof(field[8]);
+ session->gpsdata.attitude.mag_z = atof(field[9]);
+ session->gpsdata.attitude.acc_len = atof(field[10]);
+ session->gpsdata.attitude.acc_x = atof(field[11]);
+ session->gpsdata.attitude.acc_y = atof(field[12]);
+ session->gpsdata.attitude.acc_z = atof(field[13]);
+ session->gpsdata.attitude.gyro_x = atof(field[15]);
+ session->gpsdata.attitude.gyro_y = atof(field[16]);
+ mask |= (ALTITUDE_IS);
+
+ gpsd_report(LOG_RAW, "Heading %lf.\n", session->gpsdata.attitude.heading);
return mask;
}
#endif /* OCEANSERVER_ENABLE */
#ifdef ASHTECH_ENABLE
-static gps_mask_t processPASHR(int c UNUSED, char *field[], struct gps_device_t *session)
+static gps_mask_t processPASHR(int c UNUSED, char *field[],
+ struct gps_device_t *session)
{
gps_mask_t mask;
mask = 0;
- if (0 == strcmp("RID", field[1])) { /* Receiver ID */
- (void)snprintf(session->subtype, sizeof(session->subtype)-1,
+ if (0 == strcmp("RID", field[1])) { /* Receiver ID */
+ (void)snprintf(session->subtype, sizeof(session->subtype) - 1,
"%s ver %s", field[2], field[3]);
gpsd_report(LOG_DATA, "PASHR,RID: subtype=%s mask={}\n",
session->subtype);
return mask;
- } else if (0 == strcmp("POS", field[1])) { /* 3D Position */
- mask |= MODE_SET | STATUS_SET | CLEAR_SET;
+ } else if (0 == strcmp("POS", field[1])) { /* 3D Position */
+ mask |= MODE_IS | STATUS_IS | CLEAR_IS;
if (0 == strlen(field[2])) {
/* empty first field means no 3D fix is available */
session->gpsdata.status = STATUS_NO_FIX;
@@ -807,43 +830,36 @@ static gps_mask_t processPASHR(int c UNUSED, char *field[], struct gps_device_t
session->gpsdata.dop.hdop = atof(field[15]);
session->gpsdata.dop.vdop = atof(field[16]);
session->gpsdata.dop.tdop = atof(field[17]);
- mask |= (TIME_SET | LATLON_SET | ALTITUDE_SET);
- mask |= (SPEED_SET | TRACK_SET | CLIMB_SET);
- mask |= DOP_SET;
- gpsd_report(LOG_DATA, "PASHR,POS: hhmmss=%s lat=%.2f lon=%.2f alt=%.f speed=%.2f track=%.2f climb=%.2f mode=%d status=%d pdop=%.2f hdop=%.2f vdop=%.2f tdop=%.2f mask=%s\n",
- field[4],
- session->newdata.latitude,
- session->newdata.longitude,
- session->newdata.altitude,
- session->newdata.speed,
- session->newdata.track,
- session->newdata.climb,
- session->newdata.mode,
- session->gpsdata.status,
- session->gpsdata.dop.pdop,
- session->gpsdata.dop.hdop,
- session->gpsdata.dop.vdop,
- session->gpsdata.dop.tdop,
- gpsd_maskdump(mask));
+ mask |= (TIME_IS | LATLON_IS | ALTITUDE_IS);
+ mask |= (SPEED_IS | TRACK_IS | CLIMB_IS);
+ mask |= DOP_IS;
+ gpsd_report(LOG_DATA,
+ "PASHR,POS: hhmmss=%s lat=%.2f lon=%.2f alt=%.f speed=%.2f track=%.2f climb=%.2f mode=%d status=%d pdop=%.2f hdop=%.2f vdop=%.2f tdop=%.2f mask=%s\n",
+ field[4], session->newdata.latitude,
+ session->newdata.longitude, session->newdata.altitude,
+ session->newdata.speed, session->newdata.track,
+ session->newdata.climb, session->newdata.mode,
+ session->gpsdata.status, session->gpsdata.dop.pdop,
+ session->gpsdata.dop.hdop, session->gpsdata.dop.vdop,
+ session->gpsdata.dop.tdop, gpsd_maskdump(mask));
}
- } else if (0 == strcmp("SAT", field[1])) { /* Satellite Status */
+ } else if (0 == strcmp("SAT", field[1])) { /* Satellite Status */
int i, n, p, u;
n = session->gpsdata.satellites_visible = atoi(field[2]);
u = 0;
for (i = 0; i < n; i++) {
- session->gpsdata.PRN[i] = p = atoi(field[3+i*5+0]);
- session->gpsdata.azimuth[i] = atoi(field[3+i*5+1]);
- session->gpsdata.elevation[i] = atoi(field[3+i*5+2]);
- session->gpsdata.ss[i] = atof(field[3+i*5+3]);
- if (field[3+i*5+4][0] == 'U')
+ session->gpsdata.PRN[i] = p = atoi(field[3 + i * 5 + 0]);
+ session->gpsdata.azimuth[i] = atoi(field[3 + i * 5 + 1]);
+ session->gpsdata.elevation[i] = atoi(field[3 + i * 5 + 2]);
+ session->gpsdata.ss[i] = atof(field[3 + i * 5 + 3]);
+ if (field[3 + i * 5 + 4][0] == 'U')
session->gpsdata.used[u++] = p;
}
session->gpsdata.satellites_used = u;
gpsd_report(LOG_DATA, "PASHR,SAT: used=%d mask=%s\n",
- session->gpsdata.satellites_used,
- gpsd_maskdump(mask));
+ session->gpsdata.satellites_used, gpsd_maskdump(mask));
session->gpsdata.skyview_time = NAN;
- mask |= SATELLITE_SET | USED_SET;
+ mask |= SATELLITE_IS | USED_IS;
}
return mask;
}
@@ -861,7 +877,7 @@ static short nmea_checksum(char *sentence, unsigned char *correct_sum)
if (correct_sum)
*correct_sum = sum;
(void)snprintf(csum, sizeof(csum), "%02X", sum);
- return(csum[0]==toupper(p[0])) && (csum[1]==toupper(p[1]));
+ return (csum[0] == toupper(p[0])) && (csum[1] == toupper(p[1]));
}
#endif /* __ UNUSED__ */
@@ -872,52 +888,62 @@ static short nmea_checksum(char *sentence, unsigned char *correct_sum)
**************************************************************************/
/*@ -mayaliasunique @*/
-gps_mask_t nmea_parse(char *sentence, struct gps_device_t *session)
+gps_mask_t nmea_parse(char *sentence, struct gps_device_t * session)
/* parse an NMEA sentence, unpack it into a session structure */
{
- typedef gps_mask_t (*nmea_decoder)(int count, char *f[], struct gps_device_t *session);
- static struct {
+ typedef gps_mask_t(*nmea_decoder) (int count, char *f[],
+ struct gps_device_t * session);
+ static struct
+ {
char *name;
int nf; /* minimum number of fields required to parse */
nmea_decoder decoder;
} nmea_phrase[] = {
/*@ -nullassign @*/
- {"PGRMC", 0, NULL}, /* ignore Garmin Sensor Config */
- {"PGRME", 7, processPGRME},
- {"PGRMI", 0, NULL}, /* ignore Garmin Sensor Init */
- {"PGRMO", 0, NULL}, /* ignore Garmin Sentence Enable */
- /*
- * Basic sentences must come after the PG* ones, otherwise
- * Garmins can get stuck in a loop that looks like this:
- *
- * 1. A Garmin GPS in NMEA mode is detected.
- *
- * 2. PGRMC is sent to reconfigure to Garmin binary mode.
- * If successful, the GPS echoes the phrase.
- *
- * 3. nmea_parse() sees the echo as RMC because the talker ID is
- * ignored, and fails to recognize the echo as PGRMC and ignore it.
- *
- * 4. The mode is changed back to NMEA, resulting in an infinite loop.
- */
- {"RMC", 8, processGPRMC},
- {"GGA", 13, processGPGGA},
- {"GLL", 7, processGPGLL},
- {"GSA", 17, processGPGSA},
- {"GSV", 0, processGPGSV},
- {"VTG", 0, NULL}, /* ignore Velocity Track made Good */
- {"ZDA", 7, processGPZDA},
- {"GBS", 7, processGPGBS},
+ {
+ "PGRMC", 0, NULL}, /* ignore Garmin Sensor Config */
+ {
+ "PGRME", 7, processPGRME}, {
+ "PGRMI", 0, NULL}, /* ignore Garmin Sensor Init */
+ {
+ "PGRMO", 0, NULL}, /* ignore Garmin Sentence Enable */
+ /*
+ * Basic sentences must come after the PG* ones, otherwise
+ * Garmins can get stuck in a loop that looks like this:
+ *
+ * 1. A Garmin GPS in NMEA mode is detected.
+ *
+ * 2. PGRMC is sent to reconfigure to Garmin binary mode.
+ * If successful, the GPS echoes the phrase.
+ *
+ * 3. nmea_parse() sees the echo as RMC because the talker ID is
+ * ignored, and fails to recognize the echo as PGRMC and ignore it.
+ *
+ * 4. The mode is changed back to NMEA, resulting in an infinite loop.
+ */
+ {
+ "RMC", 8, processGPRMC}, {
+ "GGA", 13, processGPGGA}, {
+ "GLL", 7, processGPGLL}, {
+ "GSA", 17, processGPGSA}, {
+ "GSV", 0, processGPGSV}, {
+ "VTG", 0, NULL}, /* ignore Velocity Track made Good */
+ {
+ "ZDA", 7, processGPZDA}, {
+ "GBS", 7, processGPGBS},
#ifdef TNT_ENABLE
- {"PTNTHTM", 9, processTNTHTM},
+ {
+ "PTNTHTM", 9, processTNTHTM},
#endif /* TNT_ENABLE */
#ifdef ASHTECH_ENABLE
- {"PASHR", 3, processPASHR}, /* general handler for Ashtech */
+ {
+ "PASHR", 3, processPASHR}, /* general handler for Ashtech */
#endif /* ASHTECH_ENABLE */
#ifdef OCEANSERVER_ENABLE
- {"OHPR", 18, processOHPR},
+ {
+ "OHPR", 18, processOHPR},
#endif /* OCEANSERVER_ENABLE */
- /*@ +nullassign @*/
+ /*@ +nullassign @*/
};
int count;
@@ -936,61 +962,68 @@ gps_mask_t nmea_parse(char *sentence, struct gps_device_t *session)
*/
if (strlen(sentence) > NMEA_MAX) {
gpsd_report(LOG_WARN, "Overlong packet rejected.\n");
- return ONLINE_SET;
+ return ONLINE_IS;
}
/*@ -usedef @*//* splint 3.1.1 seems to have a bug here */
/* make an editable copy of the sentence */
strncpy((char *)session->driver.nmea.fieldcopy, sentence, NMEA_MAX);
/* discard the checksum part */
- for (p = (char *)session->driver.nmea.fieldcopy; (*p!='*') && (*p >=' '); )
+ for (p = (char *)session->driver.nmea.fieldcopy;
+ (*p != '*') && (*p >= ' ');)
++p;
if (*p == '*')
- *p++ = ','; /* otherwise we drop the last field */
+ *p++ = ','; /* otherwise we drop the last field */
*p = '\0';
e = p;
/* split sentence copy on commas, filling the field array */
count = 0;
- t = p; /* end of sentence */
- p = (char *)session->driver.nmea.fieldcopy + 1; /* beginning of tag, 'G' not '$' */
+ t = p; /* end of sentence */
+ p = (char *)session->driver.nmea.fieldcopy + 1; /* beginning of tag, 'G' not '$' */
/* while there is a search string and we haven't run off the buffer... */
- while((p != NULL) && (p <= t)) {
- session->driver.nmea.field[count] = p; /* we have a field. record it */
+ while ((p != NULL) && (p <= t)) {
+ session->driver.nmea.field[count] = p; /* we have a field. record it */
/*@ -compdef @*/
- if ((p = strchr(p, ',')) != NULL) { /* search for the next delimiter */
- *p = '\0'; /* replace it with a NUL */
- count++; /* bump the counters and continue */
+ if ((p = strchr(p, ',')) != NULL) { /* search for the next delimiter */
+ *p = '\0'; /* replace it with a NUL */
+ count++; /* bump the counters and continue */
p++;
}
/*@ +compdef @*/
}
/* point remaining fields at empty string, just in case */
- for (i = (unsigned int)count;
- i < (unsigned)(sizeof(session->driver.nmea.field)/sizeof(session->driver.nmea.field[0]));
- i++)
+ for (i = (unsigned int)count;
+ i <
+ (unsigned)(sizeof(session->driver.nmea.field) /
+ sizeof(session->driver.nmea.field[0])); i++)
session->driver.nmea.field[i] = e;
/* sentences handlers will tell us whren they have fractional time */
session->driver.nmea.latch_frac_time = false;
/* dispatch on field zero, the sentence tag */
- for (thistag = i = 0; i < (unsigned)(sizeof(nmea_phrase)/sizeof(nmea_phrase[0])); ++i) {
+ for (thistag = i = 0;
+ i < (unsigned)(sizeof(nmea_phrase) / sizeof(nmea_phrase[0])); ++i) {
s = session->driver.nmea.field[0];
if (strlen(nmea_phrase[i].name) == 3)
- s += 2; /* skip talker ID */
+ s += 2; /* skip talker ID */
if (strcmp(nmea_phrase[i].name, s) == 0) {
- if (nmea_phrase[i].decoder!=NULL && (count >= nmea_phrase[i].nf)) {
- retval = (nmea_phrase[i].decoder)(count, session->driver.nmea.field, session);
+ if (nmea_phrase[i].decoder != NULL
+ && (count >= nmea_phrase[i].nf)) {
+ retval =
+ (nmea_phrase[i].decoder) (count,
+ session->driver.nmea.field,
+ session);
strncpy(session->gpsdata.tag, nmea_phrase[i].name, MAXTAGLEN);
/*
* Must force this to be nz, as we're gong to rely on a zero
* value to mean "no previous tag" later.
*/
- thistag = i+1;
+ thistag = i + 1;
} else
- retval = ONLINE_SET; /* unknown sentence */
+ retval = ONLINE_IS; /* unknown sentence */
break;
}
}
@@ -998,16 +1031,21 @@ gps_mask_t nmea_parse(char *sentence, struct gps_device_t *session)
/* general handler for MKT3301 vendor specifics */
#ifdef MKT3301_ENABLE
if (strncmp("PMTK", session->driver.nmea.field[0], 4) == 0)
- retval = processMKT3301(count, session->driver.nmea.field, session);
+ retval = processMKT3301(count, session->driver.nmea.field, session);
#endif /* MKT3301_ENABLE */
/*@ +usedef @*/
/* timestamp recording for fixes happens here */
- if ((retval & TIME_SET)!=0) {
- session->newdata.time = (double)mkgmtime(&session->driver.nmea.date)+session->driver.nmea.subseconds;
- gpsd_report(LOG_DATA, "%s computed time is %2f = %s\n",
- session->driver.nmea.field[0],
- session->newdata.time,
+ if ((retval & TIME_IS) != 0) {
+ /*
+ * WARNING: This assumes time is always field 0, and that field 0
+ * is a timestamp whenever TIME_IS is set.
+ */
+ session->newdata.time =
+ (double)mkgmtime(&session->driver.nmea.date) +
+ session->driver.nmea.subseconds;
+ gpsd_report(LOG_DATA, "%s computed time is %2f = %s\n",
+ session->driver.nmea.field[0], session->newdata.time,
asctime(&session->driver.nmea.date));
}
@@ -1022,34 +1060,38 @@ gps_mask_t nmea_parse(char *sentence, struct gps_device_t *session)
* occurs just befiore timestamp increments also occurs in
* mid-cycle, as in the Garmin eXplorist 210; those might jitter.
*/
- if (session->driver.nmea.latch_frac_time)
- {
- gpsd_report(LOG_PROG,
- "%s reporting cycle started on %.2f.\n",
- session->driver.nmea.field[0], session->driver.nmea.this_frac_time);
- if (!GPS_TIME_EQUAL(session->driver.nmea.this_frac_time, session->driver.nmea.last_frac_time)) {
+ if (session->driver.nmea.latch_frac_time) {
+ gpsd_report(LOG_PROG,
+ "%s reporting cycle started on %.2f.\n",
+ session->driver.nmea.field[0],
+ session->driver.nmea.this_frac_time);
+ if (!GPS_TIME_EQUAL
+ (session->driver.nmea.this_frac_time,
+ session->driver.nmea.last_frac_time)) {
uint lasttag = session->driver.nmea.lasttag;
- retval |= CLEAR_SET;
- gpsd_report(LOG_PROG,
- "%s starts a reporting cycle.\n",
+ retval |= CLEAR_IS;
+ gpsd_report(LOG_PROG,
+ "%s starts a reporting cycle.\n",
session->driver.nmea.field[0]);
/*
* Have we seen a previously timestamped NMEA tag?
* If so, designate as end-of-cycle marker.
*/
- if (lasttag > 0 && (session->driver.nmea.cycle_enders & (1 << lasttag))==0) {
+ if (lasttag > 0
+ && (session->driver.nmea.cycle_enders & (1 << lasttag)) ==
+ 0) {
session->driver.nmea.cycle_enders |= (1 << lasttag);
- gpsd_report(LOG_PROG,
- "tagged %s as a cycle ender.\n",
- nmea_phrase[lasttag-1].name);
+ gpsd_report(LOG_PROG,
+ "tagged %s as a cycle ender.\n",
+ nmea_phrase[lasttag - 1].name);
}
}
/* here's where we check for end-of-cycle */
if (session->driver.nmea.cycle_enders & (1 << thistag)) {
- gpsd_report(LOG_PROG,
- "%s ends a reporting cycle.\n",
+ gpsd_report(LOG_PROG,
+ "%s ends a reporting cycle.\n",
session->driver.nmea.field[0]);
- retval |= REPORT_SET;
+ retval |= REPORT_IS;
}
session->driver.nmea.lasttag = thistag;
}
@@ -1060,6 +1102,7 @@ gps_mask_t nmea_parse(char *sentence, struct gps_device_t *session)
return retval;
}
+
/*@ +mayaliasunique @*/
#endif /* NMEA_ENABLE */
@@ -1074,7 +1117,7 @@ void nmea_add_checksum(char *sentence)
} else {
gpsd_report(LOG_ERROR, "Bad NMEA sentence: '%s'\n", sentence);
}
- while ( ((c = *p) != '*') && (c != '\0')) {
+ while (((c = *p) != '*') && (c != '\0')) {
sum ^= c;
p++;
}
@@ -1095,13 +1138,13 @@ ssize_t nmea_write(struct gps_device_t *session, char *buf, size_t len UNUSED)
return gpsd_write(session, session->msgbuf, session->msgbuflen);
}
-ssize_t nmea_send(struct gps_device_t *session, const char *fmt, ... )
+ssize_t nmea_send(struct gps_device_t * session, const char *fmt, ...)
{
char buf[BUFSIZ];
va_list ap;
- va_start(ap, fmt) ;
- (void)vsnprintf(buf, sizeof(buf)-5, fmt, ap);
+ va_start(ap, fmt);
+ (void)vsnprintf(buf, sizeof(buf) - 5, fmt, ap);
va_end(ap);
return nmea_write(session, buf, strlen(buf));
}
diff --git a/driver_oncore.c b/driver_oncore.c
index d10fe2c4..64af1a4b 100644
--- a/driver_oncore.c
+++ b/driver_oncore.c
@@ -20,43 +20,56 @@
#include "bits.h"
/*@ +charint @*/
-static char enableEa[] = { 'E', 'a', 1 };
-static char enableBb[] = { 'B', 'b', 1 };
-static char getfirmware[] = { 'C', 'j' };
-static char enableEn[] = { 'E', 'n', 1, 0, 100, 100, 1, 0,0,0,0,0,0,0,0,0,0 };
+static char enableEa[] = { 'E', 'a', 1 };
+static char enableBb[] = { 'B', 'b', 1 };
+static char getfirmware[] = { 'C', 'j' };
+static char enableEn[] =
+ { 'E', 'n', 1, 0, 100, 100, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
/*static char enableAt2[] = { 'A', 't', 2, };*/
-static char pollAs[] = { 'A', 's', 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff };
-static char pollAt[] = { 'A', 't', 0xff };
-static char pollAy[] = { 'A', 'y', 0xff, 0xff, 0xff, 0xff };
-static char pollBo[] = { 'B', 'o', 0x01 };
+static unsigned char pollAs[] =
+ { 'A', 's', 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff,
+ 0xff, 0xff, 0xff
+};
+static unsigned char pollAt[] = { 'A', 't', 0xff };
+static unsigned char pollAy[] = { 'A', 'y', 0xff, 0xff, 0xff, 0xff };
+static char pollBo[] = { 'B', 'o', 0x01 };
+
/*@ -charint @*/
/*
* These routines are specific to this driver
*/
-static gps_mask_t oncore_parse_input(struct gps_device_t *);
-static gps_mask_t oncore_dispatch(struct gps_device_t *, unsigned char *, size_t );
-static gps_mask_t oncore_msg_navsol(struct gps_device_t *, unsigned char *, size_t );
-static gps_mask_t oncore_msg_utc_offset(struct gps_device_t *, unsigned char *, size_t );
-static gps_mask_t oncore_msg_pps_delay(struct gps_device_t *, unsigned char *, size_t );
-static gps_mask_t oncore_msg_svinfo(struct gps_device_t *, unsigned char *, size_t );
-static gps_mask_t oncore_msg_time_raim(struct gps_device_t *, unsigned char *, size_t );
-static gps_mask_t oncore_msg_firmware(struct gps_device_t *, unsigned char *, size_t );
+static gps_mask_t oncore_parse_input(struct gps_device_t *);
+static gps_mask_t oncore_dispatch(struct gps_device_t *, unsigned char *,
+ size_t);
+static gps_mask_t oncore_msg_navsol(struct gps_device_t *, unsigned char *,
+ size_t);
+static gps_mask_t oncore_msg_utc_offset(struct gps_device_t *,
+ unsigned char *, size_t);
+static gps_mask_t oncore_msg_pps_delay(struct gps_device_t *, unsigned char *,
+ size_t);
+static gps_mask_t oncore_msg_svinfo(struct gps_device_t *, unsigned char *,
+ size_t);
+static gps_mask_t oncore_msg_time_raim(struct gps_device_t *, unsigned char *,
+ size_t);
+static gps_mask_t oncore_msg_firmware(struct gps_device_t *, unsigned char *,
+ size_t);
/*
* These methods may be called elsewhere in gpsd
*/
-static ssize_t oncore_control_send(struct gps_device_t *, char *, size_t);
-static void oncore_event_hook(struct gps_device_t *, event_t);
-static bool oncore_set_speed(struct gps_device_t *, speed_t, char, int);
-static void oncore_set_mode(struct gps_device_t *, int);
+static ssize_t oncore_control_send(struct gps_device_t *, char *, size_t);
+static void oncore_event_hook(struct gps_device_t *, event_t);
+static bool oncore_set_speed(struct gps_device_t *, speed_t, char, int);
+static void oncore_set_mode(struct gps_device_t *, int);
/*
* Decode the navigation solution message
*/
static gps_mask_t
-oncore_msg_navsol(struct gps_device_t *session, unsigned char *buf, size_t data_len)
+oncore_msg_navsol(struct gps_device_t *session, unsigned char *buf,
+ size_t data_len)
{
gps_mask_t mask;
unsigned char flags;
@@ -70,7 +83,7 @@ oncore_msg_navsol(struct gps_device_t *session, unsigned char *buf, size_t data_
if (data_len != 76)
return 0;
- mask = ONLINE_SET;
+ mask = ONLINE_IS;
gpsd_report(LOG_IO, "oncore NAVSOL - navigation data\n");
flags = (unsigned char)getub(buf, 72);
@@ -87,49 +100,30 @@ oncore_msg_navsol(struct gps_device_t *session, unsigned char *buf, size_t data_
session->newdata.mode = MODE_NO_FIX;
session->gpsdata.status = STATUS_NO_FIX;
}
- mask |= MODE_SET;
+ mask |= MODE_IS;
/*@ +predboolothers @*/
/* Unless we have seen non-zero utc offset data, the time is GPS time
* and not UTC time. Do not use it.
*/
if (session->context->leap_seconds) {
- unpacked_date.tm_mon = (int)getub(buf, 4) - 1;
- unpacked_date.tm_mday = (int)getub(buf, 5);
- unpacked_date.tm_year = (int)getbeuw(buf, 6) - 1900;
- unpacked_date.tm_hour = (int)getub(buf, 8);
- unpacked_date.tm_min = (int)getub(buf, 9);
- unpacked_date.tm_sec = (int)getub(buf, 10);
- nsec = (uint)getbeul(buf, 11);
+ unpacked_date.tm_mon = (int)getub(buf, 4) - 1;
+ unpacked_date.tm_mday = (int)getub(buf, 5);
+ unpacked_date.tm_year = (int)getbeuw(buf, 6) - 1900;
+ unpacked_date.tm_hour = (int)getub(buf, 8);
+ unpacked_date.tm_min = (int)getub(buf, 9);
+ unpacked_date.tm_sec = (int)getub(buf, 10);
+ nsec = (uint) getbeul(buf, 11);
/*@ -unrecog */
- session->newdata.time =
- (double)timegm(&unpacked_date)+nsec * 1e-9;
+ session->newdata.time = (double)timegm(&unpacked_date) + nsec * 1e-9;
/*@ +unrecog */
- mask |= TIME_SET;
-
-#ifdef NTPSHM_ENABLE
- /* Only update the NTP time if we've seen the leap-seconds data.
- * Else we may be providing GPS time.
- */
- if (session->context->enable_ntpshm) {
- /* 0.175 seems best at 9600 for UT+, not sure what the fudge
- * should be at other baud rates or for other models.
- * If you change this be sure to allow for multiple baud
- * rates/models.
- */
- (void)ntpshm_put(session, session->newdata.time, 0.175);
- }
-#endif /* NTPSHM_ENABLE */
-
- gpsd_report(LOG_IO, "oncore NAVSOL - time: %04d-%02d-%02d %02d:%02d:%02d.%09d\n",
- unpacked_date.tm_year+1900,
- unpacked_date.tm_mon+1,
- unpacked_date.tm_mday,
- unpacked_date.tm_hour,
- unpacked_date.tm_min,
- unpacked_date.tm_sec,
- nsec);
+ mask |= TIME_IS;
+ gpsd_report(LOG_IO,
+ "oncore NAVSOL - time: %04d-%02d-%02d %02d:%02d:%02d.%09d\n",
+ unpacked_date.tm_year + 1900, unpacked_date.tm_mon + 1,
+ unpacked_date.tm_mday, unpacked_date.tm_hour,
+ unpacked_date.tm_min, unpacked_date.tm_sec, nsec);
}
/*@-type@*/
@@ -141,86 +135,87 @@ oncore_msg_navsol(struct gps_device_t *session, unsigned char *buf, size_t data_
dop = getbeuw(buf, 35) / 10.0f;
/*@+type@*/
- gpsd_report(LOG_IO, "oncore NAVSOL - %lf %lf %.2lfm-%.2lfm | %.2fm/s %.1fdeg dop=%.1f\n", lat, lon, alt,wgs84_separation(lat,lon), speed, track, (float )dop);
-
- session->newdata.latitude = lat;
- session->newdata.longitude = lon;
- session->gpsdata.separation = wgs84_separation(session->newdata.latitude, session->newdata.longitude);
- session->newdata.altitude = alt - session->gpsdata.separation;
- session->newdata.speed = speed;
- session->newdata.track = track;
+ gpsd_report(LOG_IO,
+ "oncore NAVSOL - %lf %lf %.2lfm-%.2lfm | %.2fm/s %.1fdeg dop=%.1f\n",
+ lat, lon, alt, wgs84_separation(lat, lon), speed, track,
+ (float)dop);
+
+ session->newdata.latitude = lat;
+ session->newdata.longitude = lon;
+ session->gpsdata.separation =
+ wgs84_separation(session->newdata.latitude,
+ session->newdata.longitude);
+ session->newdata.altitude = alt - session->gpsdata.separation;
+ session->newdata.speed = speed;
+ session->newdata.track = track;
- mask |= LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET ;
+ mask |= LATLON_IS | ALTITUDE_IS | SPEED_IS | TRACK_IS;
gpsd_zero_satellites(&session->gpsdata);
/* Merge the satellite information from the Bb message. */
Bbused = 0;
nsv = 0;
for (i = st = 0; i < 8; i++) {
- int sv, mode, sn, status;
+ int sv, mode, sn, status;
- off = 40 + 4 * i;
- sv = (int)getub(buf, off);
- mode = (int)getub(buf, off+1);
- sn = (int)getub(buf, off+2);
- status = (int)getub(buf, off+3);
+ off = 40 + 4 * i;
+ sv = (int)getub(buf, off);
+ mode = (int)getub(buf, off + 1);
+ sn = (int)getub(buf, off + 2);
+ status = (int)getub(buf, off + 3);
- gpsd_report(LOG_IO, "%2d %2d %2d %3d %02x\n",i,sv,mode,sn,status);
+ gpsd_report(LOG_IO, "%2d %2d %2d %3d %02x\n", i, sv, mode, sn,
+ status);
if (sn) {
- session->gpsdata.PRN[st] = sv;
- session->gpsdata.ss[st] = (double)sn;
+ session->gpsdata.PRN[st] = sv;
+ session->gpsdata.ss[st] = (double)sn;
for (j = 0; (int)j < session->driver.oncore.visible; j++)
- if (session->driver.oncore.PRN[j] == sv) {
- session->gpsdata.elevation[st] =
- session->driver.oncore.elevation[j];
- session->gpsdata.azimuth[st] =
- session->driver.oncore.azimuth[j];
+ if (session->driver.oncore.PRN[j] == sv) {
+ session->gpsdata.elevation[st] =
+ session->driver.oncore.elevation[j];
+ session->gpsdata.azimuth[st] =
+ session->driver.oncore.azimuth[j];
Bbused |= 1 << j;
break;
}
st++;
if (status & 0x80)
- session->gpsdata.used[nsv++] = sv;
- }
+ session->gpsdata.used[nsv++] = sv;
+ }
}
for (j = 0; (int)j < session->driver.oncore.visible; j++)
- /*@ -boolops @*/
- if (!(Bbused & (1 << j))) {
+ /*@ -boolops @*/
+ if (!(Bbused & (1 << j))) {
session->gpsdata.PRN[st] = session->driver.oncore.PRN[j];
- session->gpsdata.elevation[st] =
- session->driver.oncore.elevation[j];
- session->gpsdata.azimuth[st] =
- session->driver.oncore.azimuth[j];
+ session->gpsdata.elevation[st] =
+ session->driver.oncore.elevation[j];
+ session->gpsdata.azimuth[st] = session->driver.oncore.azimuth[j];
st++;
}
- /*@ +boolops @*/
+ /*@ +boolops @*/
session->gpsdata.skyview_time = session->newdata.time;
session->gpsdata.satellites_used = (int)nsv;
session->gpsdata.satellites_visible = (int)st;
- mask |= SATELLITE_SET | USED_SET;
-
+ mask |= SATELLITE_IS | USED_IS;
+
/* Some messages can only be polled. As they are not so
* important, would be enough to poll e.g. one message per cycle.
*/
- (void)oncore_control_send(session,pollAs,sizeof(pollAs));
- (void)oncore_control_send(session,pollAt,sizeof(pollAt));
- (void)oncore_control_send(session,pollAy,sizeof(pollAy));
- (void)oncore_control_send(session,pollBo,sizeof(pollBo));
-
- gpsd_report(LOG_DATA, "NAVSOL: time=%.2f lat=%.2f lon=%.2f alt=%.2f speed=%.2f track=%.2f mode=%d status=%d visible=%d used=%d mask=%s\n",
- session->newdata.time,
- session->newdata.latitude,
- session->newdata.longitude,
- session->newdata.altitude,
- session->newdata.speed,
- session->newdata.track,
- session->newdata.mode,
- session->gpsdata.status,
+ (void)oncore_control_send(session, (char *)pollAs, sizeof(pollAs));
+ (void)oncore_control_send(session, (char *)pollAt, sizeof(pollAt));
+ (void)oncore_control_send(session, (char *)pollAy, sizeof(pollAy));
+ (void)oncore_control_send(session, pollBo, sizeof(pollBo));
+
+ gpsd_report(LOG_DATA,
+ "NAVSOL: time=%.2f lat=%.2f lon=%.2f alt=%.2f speed=%.2f track=%.2f mode=%d status=%d visible=%d used=%d mask=%s\n",
+ session->newdata.time, session->newdata.latitude,
+ session->newdata.longitude, session->newdata.altitude,
+ session->newdata.speed, session->newdata.track,
+ session->newdata.mode, session->gpsdata.status,
session->gpsdata.satellites_used,
- session->gpsdata.satellites_visible,
- gpsd_maskdump(mask));
+ session->gpsdata.satellites_visible, gpsd_maskdump(mask));
return mask;
}
@@ -228,7 +223,8 @@ oncore_msg_navsol(struct gps_device_t *session, unsigned char *buf, size_t data_
* GPS Leap Seconds = UTC offset
*/
static gps_mask_t
-oncore_msg_utc_offset(struct gps_device_t *session, unsigned char *buf, size_t data_len)
+oncore_msg_utc_offset(struct gps_device_t *session, unsigned char *buf,
+ size_t data_len)
{
int utc_offset;
@@ -238,18 +234,19 @@ oncore_msg_utc_offset(struct gps_device_t *session, unsigned char *buf, size_t d
gpsd_report(LOG_IO, "oncore UTCTIME - leap seconds\n");
utc_offset = (int)getub(buf, 4);
if (utc_offset == 0)
- return 0; /* that part of almanac not received yet */
+ return 0; /* that part of almanac not received yet */
session->context->leap_seconds = utc_offset;
session->context->valid |= LEAP_SECOND_VALID;
- return 0; /* no flag for leap seconds update */
+ return 0; /* no flag for leap seconds update */
}
/**
* PPS delay
*/
static gps_mask_t
-oncore_msg_pps_delay(struct gps_device_t *session, unsigned char *buf, size_t data_len)
+oncore_msg_pps_delay(struct gps_device_t *session, unsigned char *buf,
+ size_t data_len)
{
double pps_delay;
@@ -267,7 +264,8 @@ oncore_msg_pps_delay(struct gps_device_t *session, unsigned char *buf, size_t da
* GPS Satellite Info
*/
static gps_mask_t
-oncore_msg_svinfo(struct gps_device_t *session, unsigned char *buf, size_t data_len)
+oncore_msg_svinfo(struct gps_device_t *session, unsigned char *buf,
+ size_t data_len)
{
unsigned int i, nchan;
unsigned int off;
@@ -279,42 +277,43 @@ oncore_msg_svinfo(struct gps_device_t *session, unsigned char *buf, size_t data_
gpsd_report(LOG_IO, "oncore SVINFO - satellite data\n");
nchan = (unsigned int)getub(buf, 4);
- gpsd_report(LOG_IO, "oncore SVINFO - %d satellites:\n",nchan);
+ gpsd_report(LOG_IO, "oncore SVINFO - %d satellites:\n", nchan);
/* Then we clamp the value to not read outside the table. */
if (nchan > 12)
nchan = 12;
session->driver.oncore.visible = (int)nchan;
for (i = 0; i < nchan; i++) {
/* get info for one channel/satellite */
- off = 5+7*i;
+ off = 5 + 7 * i;
- sv = (int)getub(buf, off);
- el = (int)getub(buf, off+3);
- az = (int)getbeuw(buf, off+4);
+ sv = (int)getub(buf, off);
+ el = (int)getub(buf, off + 3);
+ az = (int)getbeuw(buf, off + 4);
- gpsd_report(LOG_IO, "%2d %2d %2d %3d\n",i,sv,el,az);
+ gpsd_report(LOG_IO, "%2d %2d %2d %3d\n", i, sv, el, az);
/* Store for use when Ea messages come. */
- session->driver.oncore.PRN[i] = sv;
- session->driver.oncore.elevation[i] = el;
- session->driver.oncore.azimuth[i] = az;
+ session->driver.oncore.PRN[i] = sv;
+ session->driver.oncore.elevation[i] = el;
+ session->driver.oncore.azimuth[i] = az;
/* If it has an entry in the satellite list, update it! */
for (j = 0; j < session->gpsdata.satellites_visible; j++)
if (session->gpsdata.PRN[j] == sv) {
- session->gpsdata.elevation[j] = el;
- session->gpsdata.azimuth[j] = az;
+ session->gpsdata.elevation[j] = el;
+ session->gpsdata.azimuth[j] = az;
}
}
gpsd_report(LOG_DATA, "SVINFO: mask={SATELLITE}\n");
- return SATELLITE_SET;
+ return SATELLITE_IS;
}
/**
* GPS Time RAIM
*/
static gps_mask_t
-oncore_msg_time_raim(struct gps_device_t *session UNUSED, unsigned char *buf UNUSED, size_t data_len UNUSED)
+oncore_msg_time_raim(struct gps_device_t *session UNUSED,
+ unsigned char *buf UNUSED, size_t data_len UNUSED)
{
return 0;
}
@@ -323,7 +322,8 @@ oncore_msg_time_raim(struct gps_device_t *session UNUSED, unsigned char *buf UNU
* GPS Firmware
*/
static gps_mask_t
-oncore_msg_firmware(struct gps_device_t *session UNUSED, unsigned char *buf UNUSED, size_t data_len UNUSED)
+oncore_msg_firmware(struct gps_device_t *session UNUSED,
+ unsigned char *buf UNUSED, size_t data_len UNUSED)
{
return 0;
}
@@ -334,50 +334,53 @@ oncore_msg_firmware(struct gps_device_t *session UNUSED, unsigned char *buf UNUS
* Parse the data from the device
*/
/*@ +charint @*/
-gps_mask_t oncore_dispatch(struct gps_device_t *session, unsigned char *buf, size_t len)
+gps_mask_t oncore_dispatch(struct gps_device_t * session, unsigned char *buf,
+ size_t len)
{
unsigned int type;
if (len == 0)
return 0;
- type = ONCTYPE(buf[2],buf[3]);
+ type = ONCTYPE(buf[2], buf[3]);
/* we may need to dump the raw packet */
gpsd_report(LOG_RAW, "raw oncore packet type 0x%04x length %zd: %s\n",
- type, len, gpsd_hexdump_wrapper(buf, len, LOG_WARN));
+ type, len, gpsd_hexdump_wrapper(buf, len, LOG_WARN));
(void)snprintf(session->gpsdata.tag, sizeof(session->gpsdata.tag),
- "MOT-%c%c", type>>8, type&0xff);
+ "MOT-%c%c", type >> 8, type & 0xff);
session->cycle_end_reliable = true;
- switch (type)
- {
- case ONCTYPE('B','b'):
+ switch (type) {
+ case ONCTYPE('B', 'b'):
return oncore_msg_svinfo(session, buf, len);
- case ONCTYPE('E','a'):
- return oncore_msg_navsol(session, buf, len) | (CLEAR_SET | REPORT_SET);
- case ONCTYPE('E','n'):
+ case ONCTYPE('E', 'a'):
+ return oncore_msg_navsol(session, buf, len) | (CLEAR_IS | REPORT_IS);
+ case ONCTYPE('E', 'n'):
return oncore_msg_time_raim(session, buf, len);
- case ONCTYPE('C','j'):
+ case ONCTYPE('C', 'j'):
return oncore_msg_firmware(session, buf, len);
- case ONCTYPE('B','o'):
+ case ONCTYPE('B', 'o'):
return oncore_msg_utc_offset(session, buf, len);
- case ONCTYPE('A','s'):
- return 0; /* position hold mode */
- case ONCTYPE('A','t'):
- return 0; /* position hold position */
- case ONCTYPE('A','y'):
+ case ONCTYPE('A', 's'):
+ return 0; /* position hold mode */
+ case ONCTYPE('A', 't'):
+ return 0; /* position hold position */
+ case ONCTYPE('A', 'y'):
return oncore_msg_pps_delay(session, buf, len);
default:
/* XXX This gets noisy in a hurry. Change once your driver works */
gpsd_report(LOG_WARN, "unknown packet id @@%c%c length %zd: %s\n",
- type>>8, type&0xff, len, gpsd_hexdump_wrapper(buf, len, LOG_WARN));
+ type >> 8, type & 0xff, len, gpsd_hexdump_wrapper(buf,
+ len,
+ LOG_WARN));
return 0;
}
}
+
/*@ -charint @*/
/**********************************************************
@@ -395,47 +398,61 @@ static ssize_t oncore_control_send(struct gps_device_t *session,
{
size_t i;
char checksum = 0;
-
+
session->msgbuf[0] = '@';
session->msgbuf[1] = '@';
for (i = 0; i < msglen; i++) {
- checksum ^= session->msgbuf[i+2] = msg[i];
+ checksum ^= session->msgbuf[i + 2] = msg[i];
}
session->msgbuf[msglen + 2] = checksum;
session->msgbuf[msglen + 3] = '\r';
session->msgbuf[msglen + 4] = '\n';
session->msgbuflen = msglen + 5;
-
+
gpsd_report(LOG_IO, "writing oncore control type %c%c:%s\n",
- msg[0],msg[1], gpsd_hexdump_wrapper(session->msgbuf, session->msgbuflen, LOG_IO));
+ msg[0], msg[1], gpsd_hexdump_wrapper(session->msgbuf,
+ session->msgbuflen,
+ LOG_IO));
return gpsd_write(session, session->msgbuf, session->msgbuflen);
}
+
/*@ -charint +usedef +compdef @*/
static void oncore_event_hook(struct gps_device_t *session, event_t event)
{
if (event == event_wakeup)
- (void)oncore_control_send(session,getfirmware,sizeof(getfirmware));
+ (void)oncore_control_send(session, getfirmware, sizeof(getfirmware));
/*
* FIXME: It might not be necessary to call this on reactivate.
* Experiment to see if the holds its settings through a close.
*/
if (event == event_identified || event == event_reactivate) {
- (void)oncore_control_send(session,enableEa,sizeof(enableEa));
- (void)oncore_control_send(session,enableBb,sizeof(enableBb));
- (void)oncore_control_send(session,enableEn,sizeof(enableEn));
- /*(void)oncore_control_send(session,enableAt2,sizeof(enableAt2));*/
- /*(void)oncore_control_send(session,pollAs,sizeof(pollAs));*/
- (void)oncore_control_send(session,pollBo,sizeof(pollBo));
+ (void)oncore_control_send(session, enableEa, sizeof(enableEa));
+ (void)oncore_control_send(session, enableBb, sizeof(enableBb));
+ (void)oncore_control_send(session, enableEn, sizeof(enableEn));
+ /*(void)oncore_control_send(session,enableAt2,sizeof(enableAt2)); */
+ /*(void)oncore_control_send(session,pollAs,sizeof(pollAs)); */
+ (void)oncore_control_send(session, pollBo, sizeof(pollBo));
}
}
+#ifdef NTPSHM_ENABLE
+static double oncore_ntp_offset(struct gps_device_t *session)
+{
+ /*
+ * Only one sentence (NAVSOL) ships time. 0.175 seems best at
+ * 9600 for UT+, not sure what the fudge should be at other baud
+ * rates or for other models.
+ */
+ return 0.175;
+}
+#endif /* NTPSHM_ENABLE */
+
#ifdef ALLOW_RECONFIGURE
static bool oncore_set_speed(struct gps_device_t *session UNUSED,
speed_t speed UNUSED,
- char parity UNUSED,
- int stopbits UNUSED)
+ char parity UNUSED, int stopbits UNUSED)
{
/*
* Set port operating mode, speed, parity, stopbits etc. here.
@@ -452,7 +469,7 @@ static void oncore_set_mode(struct gps_device_t *session, int mode)
{
if (mode == MODE_NMEA) {
/* send the mode switch control string */
- /* oncore_to_nmea(session->gpsdata.gps_fd,session->gpsdata.baudrate);*/
+ /* oncore_to_nmea(session->gpsdata.gps_fd,session->gpsdata.baudrate); */
session->gpsdata.dev.driver_mode = MODE_NMEA;
/*
* Anticipatory switching works only when the packet getter is the
@@ -472,7 +489,8 @@ static gps_mask_t oncore_parse_input(struct gps_device_t *session)
gps_mask_t st;
if (session->packet.type == ONCORE_PACKET) {
- st = oncore_dispatch(session, session->packet.outbuffer, session->packet.outbuflen);
+ st = oncore_dispatch(session, session->packet.outbuffer,
+ session->packet.outbuflen);
session->gpsdata.dev.driver_mode = MODE_BINARY;
return st;
#ifdef NMEA_ENABLE
@@ -486,6 +504,7 @@ static gps_mask_t oncore_parse_input(struct gps_device_t *session)
}
/* This is everything we export */
+/* *INDENT-OFF* */
const struct gps_type_t oncore_binary = {
/* Full name of type */
.type_name = "oncore binary",
@@ -520,6 +539,9 @@ const struct gps_type_t oncore_binary = {
/* Control string sender - should provide checksum and headers/trailer */
.control_send = oncore_control_send,
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = oncore_ntp_offset,
+#endif /* NTPSHM_ENABLE */
};
+/* *INDENT-ON* */
#endif /* defined(ONCORE_ENABLE) && defined(BINARY_ENABLE) */
-
diff --git a/driver_proto.c b/driver_proto.c
index f10b8690..9b4ca583 100644
--- a/driver_proto.c
+++ b/driver_proto.c
@@ -89,14 +89,14 @@ _proto__msg_navsol(struct gps_device_t *session, unsigned char *buf, size_t data
if ((flags & _PROTO__SOLUTION_VALID) == 0)
return 0;
- mask = ONLINE_SET;
+ mask = ONLINE_IS;
/* extract ECEF navigation solution here */
/* or extract the local tangential plane (ENU) solution */
[Px, Py, Pz, Vx, Vy, Vz] = GET_ECEF_FIX();
ecef_to_wgs84fix(&session->newdata, &session->separation,
Px, Py, Pz, Vx, Vy, Vz);
- mask |= LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET ;
+ mask |= LATLON_IS | ALTITUDE_IS | SPEED_IS | TRACK_IS | CLIMB_IS ;
session->newdata.epx = GET_LONGITUDE_ERROR();
session->newdata.epy = GET_LATITUDE_ERROR();
@@ -106,17 +106,17 @@ _proto__msg_navsol(struct gps_device_t *session, unsigned char *buf, size_t data
session->gpsdata.dop.hdop = GET_HDOP();
session->gpsdata.dop.vdop = GET_VDOP();
/* other DOP if available */
- mask |= DOP_SET;
+ mask |= DOP_IS;
session->newdata.mode = GET_FIX_MODE();
session->gpsdata.status = GET_FIX_STATUS();
/*
- * Mix in CLEAR_SET to clue the daemon in about when to clear fix
- * information. Mix in REPORT_SET when the sentence is reliably
+ * Mix in CLEAR_IS to clue the daemon in about when to clear fix
+ * information. Mix in REPORT_IS when the sentence is reliably
* the last in a reporting cycle.
*/
- mask |= MODE_SET | STATUS_SET | REPORT_SET;
+ mask |= MODE_IS | STATUS_IS | REPORT_IS;
/*
* At the end of each packet-cracking function, report at LOG_DATA level
@@ -159,7 +159,7 @@ _proto__msg_utctime(struct gps_device_t *session, unsigned char *buf, size_t dat
t = gpstime_to_unix(gps_week, tow/1000.0) - session->context->leap_seconds;
session->newdata.time = t;
- return TIME_SET | ONLINE_SET;
+ return TIME_IS | ONLINE_IS;
}
/**
@@ -213,7 +213,7 @@ _proto__msg_svinfo(struct gps_device_t *session, unsigned char *buf, size_t data
"SVINFO: visible=%d used=%d mask={SATELLITE|USED}\n",
session->gpsdata.satellites_visible,
session->gpsdata.satellites_used);
- return SATELLITE_SET | USED_SET;
+ return SATELLITE_IS | USED_IS;
}
/**
@@ -235,9 +235,9 @@ gps_mask_t _proto__dispatch(struct gps_device_t *session, unsigned char *buf, si
*/
session->cycle_end_reliable = true;
if (msgid == MY_START_OF_CYCLE)
- retmask |= CLEAR_SET;
+ retmask |= CLEAR_IS;
else if (msgid == MY_END_OF_CYCLE)
- retmask |= REPORT_SET;
+ retmask |= REPORT_IS;
type = GET_MESSAGE_TYPE();
@@ -424,6 +424,23 @@ static void _proto__set_mode(struct gps_device_t *session, int mode)
}
#endif /* ALLOW_RECONFIGURE */
+#ifdef NTPSHM_ENABLE
+static double _proto_ntp_offset(struct gps_device_t *session)
+{
+ /*
+ * If NTP notification is enabled, the GPS will occasionally NTP
+ * its notion of the time. This will lag behind actual time by
+ * some amount which has to be determined by observation vs. (say
+ * WWVB radio broadcasts) and, furthermore, may differ by baud
+ * rate. This method is for computing the NTP fudge factor. If
+ * it's absent, an offset of 0.0 will be assumed, effectively
+ * falling back on what's in ntp.conf. When it returns NAN,
+ * nothing will be sent to NTP.
+ */
+ return MAGIC_CONSTANT;
+}
+#endif /* NTPSHM_ENABLE */
+
static void _proto__wrapup(struct gps_device_t *session)
{
}
@@ -443,6 +460,7 @@ static void _proto__wrapup(struct gps_device_t *session)
/* any driver must use to compile. */
/* This is everything we export */
+/* *INDENT-OFF* */
const struct gps_type_t _proto__binary = {
/* Full name of type */
.type_name = "_proto_ binary",
@@ -476,6 +494,10 @@ const struct gps_type_t _proto__binary = {
/* Control string sender - should provide checksum and headers/trailer */
.control_send = _proto__control_send,
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = _proto_ntp_offset,
+#endif /* NTPSHM_ENABLE */
+/* *INDENT-ON* */
};
#endif /* defined(_PROTO__ENABLE) && defined(BINARY_ENABLE) */
diff --git a/driver_rtcm2.c b/driver_rtcm2.c
index aff0c2c9..c680cf43 100644
--- a/driver_rtcm2.c
+++ b/driver_rtcm2.c
@@ -60,7 +60,7 @@ BSD terms apply: see the file COPYING in the distribution root for details.
#include <string.h>
#include <stdbool.h>
#include <stdio.h>
-#include <math.h> /* for round() */
+#include <math.h> /* for round() */
#include "gpsd.h"
#include "driver_rtcm2.h"
@@ -73,7 +73,7 @@ static unsigned int tx_speed[] = { 25, 50, 100, 110, 150, 200, 250, 300 };
#define DIMENSION(a) (unsigned)(sizeof(a)/sizeof(a[0]))
-void rtcm2_unpack(/*@out@*/struct rtcm2_t *tp, char *buf)
+void rtcm2_unpack( /*@out@*/ struct rtcm2_t *tp, char *buf)
/* break out the raw bits into the content fields */
{
int len;
@@ -92,67 +92,69 @@ void rtcm2_unpack(/*@out@*/struct rtcm2_t *tp, char *buf)
switch (tp->type) {
case 1:
case 9:
- {
- struct b_correction_t *m = &msg->msg_type.type1.corrections[0];
-
- while (len >= 0) {
- if (len >= 2) {
- tp->ranges.sat[n].ident = m->w3.satident1;
- tp->ranges.sat[n].udre = m->w3.udre1;
- tp->ranges.sat[n].issuedata = m->w4.issuedata1;
- tp->ranges.sat[n].rangerr = m->w3.pc1 *
- (m->w3.scale1 ? PCLARGE : PCSMALL);
- tp->ranges.sat[n].rangerate = m->w4.rangerate1 *
- (m->w3.scale1 ? RRLARGE : RRSMALL);
- n++;
- }
- if (len >= 4) {
- tp->ranges.sat[n].ident = m->w4.satident2;
- tp->ranges.sat[n].udre = m->w4.udre2;
- tp->ranges.sat[n].issuedata = m->w6.issuedata2;
- tp->ranges.sat[n].rangerr = m->w5.pc2 *
- (m->w4.scale2 ? PCLARGE : PCSMALL);
- tp->ranges.sat[n].rangerate = m->w5.rangerate2 *
- (m->w4.scale2 ? RRLARGE : RRSMALL);
- n++;
- }
- if (len >= 5) {
- tp->ranges.sat[n].ident = m->w6.satident3;
- tp->ranges.sat[n].udre = m->w6.udre3;
- tp->ranges.sat[n].issuedata = m->w7.issuedata3;
- /*@ -shiftimplementation @*/
- tp->ranges.sat[n].rangerr = ((m->w6.pc3_h<<8)|(m->w7.pc3_l)) *
- (m->w6.scale3 ? PCLARGE : PCSMALL);
- tp->ranges.sat[n].rangerate = m->w7.rangerate3 *
- (m->w6.scale3 ? RRLARGE : RRSMALL);
- /*@ +shiftimplementation @*/
- n++;
- }
- len -= 5;
- m++;
+ {
+ struct b_correction_t *m = &msg->msg_type.type1.corrections[0];
+
+ while (len >= 0) {
+ if (len >= 2) {
+ tp->ranges.sat[n].ident = m->w3.satident1;
+ tp->ranges.sat[n].udre = m->w3.udre1;
+ tp->ranges.sat[n].issuedata = m->w4.issuedata1;
+ tp->ranges.sat[n].rangerr = m->w3.pc1 *
+ (m->w3.scale1 ? PCLARGE : PCSMALL);
+ tp->ranges.sat[n].rangerate = m->w4.rangerate1 *
+ (m->w3.scale1 ? RRLARGE : RRSMALL);
+ n++;
+ }
+ if (len >= 4) {
+ tp->ranges.sat[n].ident = m->w4.satident2;
+ tp->ranges.sat[n].udre = m->w4.udre2;
+ tp->ranges.sat[n].issuedata = m->w6.issuedata2;
+ tp->ranges.sat[n].rangerr = m->w5.pc2 *
+ (m->w4.scale2 ? PCLARGE : PCSMALL);
+ tp->ranges.sat[n].rangerate = m->w5.rangerate2 *
+ (m->w4.scale2 ? RRLARGE : RRSMALL);
+ n++;
}
- tp->ranges.nentries = n;
+ if (len >= 5) {
+ tp->ranges.sat[n].ident = m->w6.satident3;
+ tp->ranges.sat[n].udre = m->w6.udre3;
+ tp->ranges.sat[n].issuedata = m->w7.issuedata3;
+ /*@ -shiftimplementation @*/
+ tp->ranges.sat[n].rangerr =
+ ((m->w6.pc3_h << 8) | (m->w7.pc3_l)) *
+ (m->w6.scale3 ? PCLARGE : PCSMALL);
+ tp->ranges.sat[n].rangerate =
+ m->w7.rangerate3 * (m->w6.scale3 ? RRLARGE : RRSMALL);
+ /*@ +shiftimplementation @*/
+ n++;
+ }
+ len -= 5;
+ m++;
}
+ tp->ranges.nentries = n;
+ }
break;
case 3:
- {
- struct rtcm2_msg3 *m = &msg->msg_type.type3;
+ {
+ struct rtcm2_msg3 *m = &msg->msg_type.type3;
- if ((tp->ecef.valid = len >= 4)) {
- tp->ecef.x = ((m->w3.x_h<<8)|(m->w4.x_l))*XYZ_SCALE;
- tp->ecef.y = ((m->w4.y_h<<16)|(m->w5.y_l))*XYZ_SCALE;
- tp->ecef.z = ((m->w5.z_h<<24)|(m->w6.z_l))*XYZ_SCALE;
- }
+ if ((tp->ecef.valid = len >= 4)) {
+ tp->ecef.x = ((m->w3.x_h << 8) | (m->w4.x_l)) * XYZ_SCALE;
+ tp->ecef.y = ((m->w4.y_h << 16) | (m->w5.y_l)) * XYZ_SCALE;
+ tp->ecef.z = ((m->w5.z_h << 24) | (m->w6.z_l)) * XYZ_SCALE;
}
+ }
break;
case 4:
if ((tp->reference.valid = len >= 2)) {
- struct rtcm2_msg4 *m = &msg->msg_type.type4;
+ struct rtcm2_msg4 *m = &msg->msg_type.type4;
tp->reference.system =
- (m->w3.dgnss==0) ? NAVSYSTEM_GPS :
- ((m->w3.dgnss==1) ? NAVSYSTEM_GLONASS : NAVSYSTEM_UNKNOWN);
- tp->reference.sense = (m->w3.dat != 0) ? SENSE_GLOBAL : SENSE_LOCAL;
+ (m->w3.dgnss == 0) ? NAVSYSTEM_GPS :
+ ((m->w3.dgnss == 1) ? NAVSYSTEM_GLONASS : NAVSYSTEM_UNKNOWN);
+ tp->reference.sense =
+ (m->w3.dat != 0) ? SENSE_GLOBAL : SENSE_LOCAL;
if (m->w3.datum_alpha_char1) {
tp->reference.datum[n++] = (char)(m->w3.datum_alpha_char1);
}
@@ -171,9 +173,10 @@ void rtcm2_unpack(/*@out@*/struct rtcm2_t *tp, char *buf)
tp->reference.datum[n++] = '\0';
if (len >= 4) {
tp->reference.dx = m->w5.dx * DXYZ_SCALE;
- tp->reference.dy = ((m->w5.dy_h << 8) | m->w6.dy_l) * DXYZ_SCALE;
+ tp->reference.dy =
+ ((m->w5.dy_h << 8) | m->w6.dy_l) * DXYZ_SCALE;
tp->reference.dz = m->w6.dz * DXYZ_SCALE;
- } else
+ } else
tp->reference.sense = SENSE_INVALID;
}
break;
@@ -183,13 +186,15 @@ void rtcm2_unpack(/*@out@*/struct rtcm2_t *tp, char *buf)
struct b_health_t *m = &msg->msg_type.type5.health[n];
csp->ident = m->sat_id;
- csp->iodl = m->issue_of_data_link!=0;
+ csp->iodl = m->issue_of_data_link != 0;
csp->health = m->data_health;
- /*@i@*/csp->snr = (uint)(m->cn0?(m->cn0+CNR_OFFSET):SNR_BAD);
- csp->health_en = m->health_enable!=0;
- csp->new_data = m->new_nav_data!=0;
- csp->los_warning = m->loss_warn!=0;
- csp->tou = m->time_unhealthy*TU_SCALE;
+ /*@+ignoresigns@*/
+ csp->snr = (int)(m->cn0 ? (m->cn0 + CNR_OFFSET) : SNR_BAD);
+ /*@-ignoresigns@*/
+ csp->health_en = m->health_enable != 0;
+ csp->new_data = m->new_nav_data != 0;
+ csp->los_warning = m->loss_warn != 0;
+ csp->tou = m->time_unhealthy * TU_SCALE;
}
tp->conhealth.nentries = n;
break;
@@ -199,15 +204,19 @@ void rtcm2_unpack(/*@out@*/struct rtcm2_t *tp, char *buf)
struct b_station_t *mp = &msg->msg_type.type7.almanac[w];
np->latitude = mp->w3.lat * LA_SCALE;
- /*@i@*/np->longitude = ((mp->w3.lon_h << 8) | mp->w4.lon_l) * LO_SCALE;
+ /*@-shiftimplementation@*/
+ np->longitude = ((mp->w3.lon_h << 8) | mp->w4.lon_l) * LO_SCALE;
+ /*@+shiftimplementation@*/
np->range = mp->w4.range;
- np->frequency = (((mp->w4.freq_h << 6) | mp->w5.freq_l) * FREQ_SCALE) + FREQ_OFFSET;
+ np->frequency =
+ (((mp->w4.freq_h << 6) | mp->w5.freq_l) * FREQ_SCALE) +
+ FREQ_OFFSET;
np->health = mp->w5.health;
np->station_id = mp->w5.station_id,
- np->bitrate = tx_speed[mp->w5.bit_rate];
+ np->bitrate = tx_speed[mp->w5.bit_rate];
n++;
}
- tp->almanac.nentries = (unsigned)(len/3);
+ tp->almanac.nentries = (unsigned)(len / 3);
break;
case 16:
/*@ -boolops @*/
@@ -230,22 +239,23 @@ void rtcm2_unpack(/*@out@*/struct rtcm2_t *tp, char *buf)
break;
default:
- memcpy(tp->words, msg->msg_type.rtcm2_msgunk, (RTCM2_WORDS_MAX-2)*sizeof(isgps30bits_t));
+ memcpy(tp->words, msg->msg_type.rtcm2_msgunk,
+ (RTCM2_WORDS_MAX - 2) * sizeof(isgps30bits_t));
break;
}
}
-bool rtcm2_repack(struct rtcm2_t *tp, isgps30bits_t *buf)
+bool rtcm2_repack(struct rtcm2_t *tp, isgps30bits_t * buf)
/* repack the content fields into the raw bits */
{
int len, sval;
unsigned int n, w, uval;
- struct rtcm2_msg_t *msg = (struct rtcm2_msg_t *)buf;
- struct rtcm2_msghw1 *wp = (struct rtcm2_msghw1 *)buf;
+ struct rtcm2_msg_t *msg = (struct rtcm2_msg_t *)buf;
+ struct rtcm2_msghw1 *wp = (struct rtcm2_msghw1 *)buf;
msg->w1.msgtype = tp->type;
msg->w2.frmlen = tp->length;
- msg->w2.zcnt = (unsigned) round(tp->zcount / ZCOUNT_SCALE);
+ msg->w2.zcnt = (unsigned)round(tp->zcount / ZCOUNT_SCALE);
msg->w1.refstaid = tp->refstaid;
msg->w2.sqnum = tp->seqnum;
msg->w2.stathlth = tp->stathlth;
@@ -253,67 +263,79 @@ bool rtcm2_repack(struct rtcm2_t *tp, isgps30bits_t *buf)
len = (int)tp->length;
n = 0;
switch (tp->type) {
- case 1: /* S */
+ case 1: /* S */
case 9:
- {
- struct b_correction_t *m = &msg->msg_type.type1.corrections[0];
-
- while (len >= 0) {
- if (len >= 2) {
- struct rangesat_t *ssp = &tp->ranges.sat[n];
- m->w3.satident1 = ssp->ident;
- m->w3.udre1 = ssp->udre;
- m->w4.issuedata1 = ssp->issuedata;
- m->w3.scale1 = (unsigned)((ssp->rangerr > MAXPCSMALL) ||
- (ssp->rangerr < (-MAXPCSMALL)) ||
- (ssp->rangerate > MAXRRSMALL) ||
- (ssp->rangerate < (-MAXRRSMALL)));
- m->w3.pc1 = (int) round(ssp->rangerr / (m->w3.scale1 ? PCLARGE : PCSMALL));
- m->w4.rangerate1 = (int) round(ssp->rangerate / (m->w3.scale1 ? RRLARGE : RRSMALL));
- n++;
- }
- if (len >= 4) {
- struct rangesat_t *ssp = &tp->ranges.sat[n];
- m->w4.satident2 = ssp->ident;
- m->w4.udre2 = ssp->udre;
- m->w6.issuedata2 = ssp->issuedata;
- m->w4.scale2 = (unsigned)((ssp->rangerr > MAXPCSMALL) ||
- (ssp->rangerr < (-MAXPCSMALL)) ||
- (ssp->rangerate > MAXRRSMALL) ||
- (ssp->rangerate < (-MAXRRSMALL)));
- m->w5.pc2 = (int) round(ssp->rangerr / (m->w4.scale2 ? PCLARGE : PCSMALL));
- m->w5.rangerate2 = (int) round(ssp->rangerate / (m->w4.scale2 ? RRLARGE : RRSMALL));
- n++;
- }
- if (len >= 5) {
- struct rangesat_t *ssp = &tp->ranges.sat[n];
- m->w6.satident3 = ssp->ident;
- m->w6.udre3 = ssp->udre;
- m->w7.issuedata3 = ssp->issuedata;
- m->w6.scale3 = (unsigned)((ssp->rangerr > MAXPCSMALL) ||
- (ssp->rangerr < (-MAXPCSMALL)) ||
- (ssp->rangerate > MAXRRSMALL) ||
- (ssp->rangerate < (-MAXRRSMALL)));
- sval = (int) round(ssp->rangerr / (m->w6.scale3 ? PCLARGE : PCSMALL));
- /*@ -shiftimplementation @*/
- m->w6.pc3_h = sval >> 8;
- /*@ +shiftimplementation @*/
- m->w7.pc3_l = (unsigned)sval & 0xff;
- m->w7.rangerate3 = (int) round(ssp->rangerate / (m->w6.scale3 ? RRLARGE : RRSMALL));
- n++;
- }
- len -= 5;
- m++;
+ {
+ struct b_correction_t *m = &msg->msg_type.type1.corrections[0];
+
+ while (len >= 0) {
+ if (len >= 2) {
+ struct rangesat_t *ssp = &tp->ranges.sat[n];
+ m->w3.satident1 = ssp->ident;
+ m->w3.udre1 = ssp->udre;
+ m->w4.issuedata1 = ssp->issuedata;
+ m->w3.scale1 = (unsigned)((ssp->rangerr > MAXPCSMALL) ||
+ (ssp->rangerr < (-MAXPCSMALL)) ||
+ (ssp->rangerate > MAXRRSMALL) ||
+ (ssp->rangerate < (-MAXRRSMALL)));
+ m->w3.pc1 =
+ (int)round(ssp->rangerr /
+ (m->w3.scale1 ? PCLARGE : PCSMALL));
+ m->w4.rangerate1 =
+ (int)round(ssp->rangerate /
+ (m->w3.scale1 ? RRLARGE : RRSMALL));
+ n++;
}
- tp->ranges.nentries = n;
+ if (len >= 4) {
+ struct rangesat_t *ssp = &tp->ranges.sat[n];
+ m->w4.satident2 = ssp->ident;
+ m->w4.udre2 = ssp->udre;
+ m->w6.issuedata2 = ssp->issuedata;
+ m->w4.scale2 = (unsigned)((ssp->rangerr > MAXPCSMALL) ||
+ (ssp->rangerr < (-MAXPCSMALL)) ||
+ (ssp->rangerate > MAXRRSMALL) ||
+ (ssp->rangerate < (-MAXRRSMALL)));
+ m->w5.pc2 =
+ (int)round(ssp->rangerr /
+ (m->w4.scale2 ? PCLARGE : PCSMALL));
+ m->w5.rangerate2 =
+ (int)round(ssp->rangerate /
+ (m->w4.scale2 ? RRLARGE : RRSMALL));
+ n++;
+ }
+ if (len >= 5) {
+ struct rangesat_t *ssp = &tp->ranges.sat[n];
+ m->w6.satident3 = ssp->ident;
+ m->w6.udre3 = ssp->udre;
+ m->w7.issuedata3 = ssp->issuedata;
+ m->w6.scale3 = (unsigned)((ssp->rangerr > MAXPCSMALL) ||
+ (ssp->rangerr < (-MAXPCSMALL)) ||
+ (ssp->rangerate > MAXRRSMALL) ||
+ (ssp->rangerate < (-MAXRRSMALL)));
+ sval =
+ (int)round(ssp->rangerr /
+ (m->w6.scale3 ? PCLARGE : PCSMALL));
+ /*@ -shiftimplementation @*/
+ m->w6.pc3_h = sval >> 8;
+ /*@ +shiftimplementation @*/
+ m->w7.pc3_l = (unsigned)sval & 0xff;
+ m->w7.rangerate3 =
+ (int)round(ssp->rangerate /
+ (m->w6.scale3 ? RRLARGE : RRSMALL));
+ n++;
+ }
+ len -= 5;
+ m++;
}
+ tp->ranges.nentries = n;
+ }
break;
- case 3: /* R */
+ case 3: /* R */
if (tp->ecef.valid) {
- struct rtcm2_msg3 *m = &msg->msg_type.type3;
- unsigned x = (unsigned) round(tp->ecef.x / XYZ_SCALE);
- unsigned y = (unsigned) round(tp->ecef.y / XYZ_SCALE);
- unsigned z = (unsigned) round(tp->ecef.z / XYZ_SCALE);
+ struct rtcm2_msg3 *m = &msg->msg_type.type3;
+ unsigned x = (unsigned)round(tp->ecef.x / XYZ_SCALE);
+ unsigned y = (unsigned)round(tp->ecef.y / XYZ_SCALE);
+ unsigned z = (unsigned)round(tp->ecef.z / XYZ_SCALE);
m->w4.x_l = x & 0xff;
m->w3.x_h = x >> 8;
@@ -323,9 +345,9 @@ bool rtcm2_repack(struct rtcm2_t *tp, isgps30bits_t *buf)
m->w5.z_h = z >> 24;
}
break;
- case 4: /* D */
+ case 4: /* D */
if (tp->reference.valid) {
- struct rtcm2_msg4 *m = &msg->msg_type.type4;
+ struct rtcm2_msg4 *m = &msg->msg_type.type4;
m->w3.dgnss = (unsigned)tp->reference.system;
m->w3.dat = (unsigned)(tp->reference.sense == SENSE_GLOBAL);
@@ -352,15 +374,15 @@ bool rtcm2_repack(struct rtcm2_t *tp, isgps30bits_t *buf)
m->w4.datum_sub_div_char3 = 0;
/*@ +predboolothers +type @*/
if (tp->reference.system != NAVSYSTEM_UNKNOWN) {
- m->w5.dx = (uint)round(tp->reference.dx / DXYZ_SCALE);
- uval = (uint)round(tp->reference.dy / DXYZ_SCALE);
+ m->w5.dx = (uint) round(tp->reference.dx / DXYZ_SCALE);
+ uval = (uint) round(tp->reference.dy / DXYZ_SCALE);
m->w5.dy_h = uval >> 8;
m->w6.dy_l = uval & 0xff;
- m->w6.dz = (uint)round(tp->reference.dz / DXYZ_SCALE);
+ m->w6.dz = (uint) round(tp->reference.dz / DXYZ_SCALE);
}
}
break;
- case 5: /* C */
+ case 5: /* C */
for (n = 0; n < (unsigned)len; n++) {
struct consat_t *csp = &tp->conhealth.sat[n];
struct b_health_t *m = &msg->msg_type.type5.health[n];
@@ -368,32 +390,36 @@ bool rtcm2_repack(struct rtcm2_t *tp, isgps30bits_t *buf)
m->sat_id = csp->ident;
m->issue_of_data_link = (unsigned)csp->iodl;
m->data_health = csp->health;
- m->cn0 = (csp->snr == SNR_BAD) ? 0 : (unsigned)csp->snr-CNR_OFFSET;
+ m->cn0 =
+ (csp->snr == SNR_BAD) ? 0 : (unsigned)csp->snr - CNR_OFFSET;
m->health_enable = (unsigned)csp->health_en;
m->new_nav_data = (unsigned)csp->new_data;
m->loss_warn = (unsigned)csp->los_warning;
m->time_unhealthy = (unsigned)(csp->tou / TU_SCALE);
}
break;
- case 7: /* A */
- for (w = 0; w < (RTCM2_WORDS_MAX - 2)/ 3; w++) {
+ case 7: /* A */
+ for (w = 0; w < (RTCM2_WORDS_MAX - 2) / 3; w++) {
struct station_t *np = &tp->almanac.station[n++];
struct b_station_t *mp = &msg->msg_type.type7.almanac[w];
- mp->w3.lat = (int) round(np->latitude / LA_SCALE);
- sval = (int) round(np->longitude / LO_SCALE);
+ mp->w3.lat = (int)round(np->latitude / LA_SCALE);
+ sval = (int)round(np->longitude / LO_SCALE);
/*@ -shiftimplementation @*/
mp->w3.lon_h = sval >> 8;
/*@ +shiftimplementation @*/
mp->w4.lon_l = (unsigned)sval & 0xff;
mp->w4.range = np->range;
- uval = (unsigned) round(((np->frequency-FREQ_OFFSET) / FREQ_SCALE));
+ uval =
+ (unsigned)round(((np->frequency - FREQ_OFFSET) / FREQ_SCALE));
mp->w4.freq_h = uval >> 6;
mp->w5.freq_l = uval & 0x3f;
mp->w5.health = np->health;
mp->w5.station_id = np->station_id;
mp->w5.bit_rate = 0;
- for (uval = 0; uval < (unsigned)(sizeof(tx_speed)/sizeof(tx_speed[0])); uval++)
+ for (uval = 0;
+ uval < (unsigned)(sizeof(tx_speed) / sizeof(tx_speed[0]));
+ uval++)
if (tx_speed[uval] == np->bitrate) {
mp->w5.bit_rate = uval;
break;
@@ -403,7 +429,7 @@ bool rtcm2_repack(struct rtcm2_t *tp, isgps30bits_t *buf)
}
tp->almanac.nentries = n;
break;
- case 16: /* T */
+ case 16: /* T */
/*@ -boolops @*/
for (w = 0; w < RTCM2_WORDS_MAX - 2; w++) {
if (!tp->message[n]) {
@@ -419,12 +445,13 @@ bool rtcm2_repack(struct rtcm2_t *tp, isgps30bits_t *buf)
}
msg->msg_type.type16.txt[w].byte3 = (unsigned)tp->message[n++];
}
- msg->w2.frmlen = w+1;
+ msg->w2.frmlen = w + 1;
/*@ +boolops @*/
break;
- default: /* U */
- memcpy(msg->msg_type.rtcm2_msgunk, tp->words, (RTCM2_WORDS_MAX-2)*sizeof(isgps30bits_t));
+ default: /* U */
+ memcpy(msg->msg_type.rtcm2_msgunk, tp->words,
+ (RTCM2_WORDS_MAX - 2) * sizeof(isgps30bits_t));
break;
}
@@ -436,38 +463,34 @@ bool rtcm2_repack(struct rtcm2_t *tp, isgps30bits_t *buf)
return true;
}
-static bool preamble_match(isgps30bits_t *w)
+static bool preamble_match(isgps30bits_t * w)
{
return (((struct rtcm2_msghw1 *)w)->preamble == PREAMBLE_PATTERN);
}
static bool length_check(struct gps_packet_t *lexer)
{
- return lexer->isgps.bufindex >= 2
- && lexer->isgps.bufindex >= ((struct rtcm2_msg_t *)lexer->isgps.buf)->w2.frmlen + 2u;
+ return lexer->isgps.bufindex >= 2
+ && lexer->isgps.bufindex >=
+ ((struct rtcm2_msg_t *)lexer->isgps.buf)->w2.frmlen + 2u;
}
enum isgpsstat_t rtcm2_decode(struct gps_packet_t *lexer, unsigned int c)
{
- return isgps_decode(lexer,
- preamble_match,
- length_check,
- RTCM2_WORDS_MAX,
- c);
+ return isgps_decode(lexer,
+ preamble_match, length_check, RTCM2_WORDS_MAX, c);
}
-void rtcm2_sager_dump(const struct rtcm2_t *rtcm, /*@out@*/char buf[], size_t buflen)
+void rtcm2_sager_dump(const struct rtcm2_t *rtcm, /*@out@*/ char buf[],
+ size_t buflen)
/* dump the contents of a parsed RTCM104 message */
{
unsigned int n;
(void)snprintf(buf, buflen, "H\t%u\t%u\t%0.1f\t%u\t%u\t%u\n",
- rtcm->type,
- rtcm->refstaid,
- rtcm->zcount,
- rtcm->seqnum,
- rtcm->length,
- rtcm->stathlth);
+ rtcm->type,
+ rtcm->refstaid,
+ rtcm->zcount, rtcm->seqnum, rtcm->length, rtcm->stathlth);
switch (rtcm->type) {
case 1:
@@ -479,9 +502,7 @@ void rtcm2_sager_dump(const struct rtcm2_t *rtcm, /*@out@*/char buf[], size_t bu
rsp->ident,
rsp->udre,
rsp->issuedata,
- rtcm->zcount,
- rsp->rangerr,
- rsp->rangerate);
+ rtcm->zcount, rsp->rangerr, rsp->rangerate);
}
break;
@@ -489,22 +510,18 @@ void rtcm2_sager_dump(const struct rtcm2_t *rtcm, /*@out@*/char buf[], size_t bu
if (rtcm->ecef.valid)
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"R\t%.2f\t%.2f\t%.2f\n",
- rtcm->ecef.x,
- rtcm->ecef.y,
- rtcm->ecef.z);
+ rtcm->ecef.x, rtcm->ecef.y, rtcm->ecef.z);
break;
case 4:
if (rtcm->reference.valid)
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"D\t%s\t%1d\t%s\t%.1f\t%.1f\t%.1f\n",
- (rtcm->reference.system==NAVSYSTEM_GPS) ? "GPS"
- : ((rtcm->reference.system==NAVSYSTEM_GLONASS) ? "GLONASS"
- : "UNKNOWN"),
- rtcm->reference.sense,
- rtcm->reference.datum,
- rtcm->reference.dx,
- rtcm->reference.dy,
+ (rtcm->reference.system == NAVSYSTEM_GPS) ? "GPS"
+ : ((rtcm->reference.system ==
+ NAVSYSTEM_GLONASS) ? "GLONASS" : "UNKNOWN"),
+ rtcm->reference.sense, rtcm->reference.datum,
+ rtcm->reference.dx, rtcm->reference.dy,
rtcm->reference.dz);
break;
@@ -519,12 +536,11 @@ void rtcm2_sager_dump(const struct rtcm2_t *rtcm, /*@out@*/char buf[], size_t bu
csp->snr,
(unsigned)csp->health_en,
(unsigned)csp->new_data,
- (unsigned)csp->los_warning,
- csp->tou);
+ (unsigned)csp->los_warning, csp->tou);
}
break;
- case 6: /* NOP msg */
+ case 6: /* NOP msg */
(void)strlcat(buf, "N\n", buflen);
break;
@@ -537,9 +553,7 @@ void rtcm2_sager_dump(const struct rtcm2_t *rtcm, /*@out@*/char buf[], size_t bu
ssp->longitude,
ssp->range,
ssp->frequency,
- ssp->health,
- ssp->station_id,
- ssp->bitrate);
+ ssp->health, ssp->station_id, ssp->bitrate);
}
break;
case 16:
diff --git a/driver_rtcm3.c b/driver_rtcm3.c
index c87d03e7..a46a55b9 100644
--- a/driver_rtcm3.c
+++ b/driver_rtcm3.c
@@ -38,9 +38,9 @@ BSD terms apply: see the file COPYING in the distribution root for details.
#include <assert.h>
#include "gpsd_config.h"
#ifndef S_SPLINT_S
- #ifdef HAVE_ARPA_INET
- #include <arpa/inet.h> /* for ntohl(3) and friends */
- #endif /* HAVE_ARPA_INET */
+#ifdef HAVE_ARPA_INET
+#include <arpa/inet.h> /* for ntohl(3) and friends */
+#endif /* HAVE_ARPA_INET */
#endif /* S_SPLINT_S */
#include "gpsd.h"
@@ -60,9 +60,11 @@ BSD terms apply: see the file COPYING in the distribution root for details.
/* Other magic values */
#define INVALID_PSEUDORANGE 0x80000 /* DF012 */
-/*@ -type @*/ /* re-enable when we're ready to take this live */
+/* Large case statements make GNU indent very confused */
+/* *INDENT-OFF* */
+/*@ -type @*//* re-enable when we're ready to take this live */
-void rtcm3_unpack(/*@out@*/struct rtcm3_t *rtcm, char *buf)
+void rtcm3_unpack( /*@out@*/ struct rtcm3_t *rtcm, char *buf)
/* break out the raw bits into the scaled report-structure fields */
{
unsigned int n, n2;
@@ -70,196 +72,237 @@ void rtcm3_unpack(/*@out@*/struct rtcm3_t *rtcm, char *buf)
unsigned int i;
signed long temp;
- /*@ -evalorder -sefparams -mayaliasunique @*/
+ /*@ -evalorder -sefparams -mayaliasunique @*/
#define ugrab(width) (bitcount += width, ubits(buf, bitcount-width, width))
#define sgrab(width) (bitcount += width, sbits(buf, bitcount-width, width))
assert(ugrab(8) == 0xD3);
assert(ugrab(6) == 0x00);
- rtcm->length = (uint)ugrab(10);
- rtcm->type = (uint)ugrab(12);
-
- switch(rtcm->type) {
- case 1001: /* GPS Basic RTK, L1 Only */
- rtcm->rtcmtypes.rtcm3_1001.header.station_id = (uint)ugrab(12);
- rtcm->rtcmtypes.rtcm3_1001.header.tow = (time_t)ugrab(30);
- rtcm->rtcmtypes.rtcm3_1001.header.sync = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1001.header.satcount = (ushort)ugrab(5);
- rtcm->rtcmtypes.rtcm3_1001.header.smoothing = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1001.header.interval = (ushort)ugrab(3);
+ rtcm->length = (uint) ugrab(10);
+ rtcm->type = (uint) ugrab(12);
+
+ switch (rtcm->type) {
+ case 1001: /* GPS Basic RTK, L1 Only */
+ rtcm->rtcmtypes.rtcm3_1001.header.station_id = (uint) ugrab(12);
+ rtcm->rtcmtypes.rtcm3_1001.header.tow = (time_t) ugrab(30);
+ rtcm->rtcmtypes.rtcm3_1001.header.sync = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1001.header.satcount = (ushort) ugrab(5);
+ rtcm->rtcmtypes.rtcm3_1001.header.smoothing = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1001.header.interval = (ushort) ugrab(3);
for (i = 0; i < rtcm->rtcmtypes.rtcm3_1001.header.satcount; i++) {
- rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].ident = (ushort)ugrab(6);
- rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.indicator = (unsigned char)ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].ident = (ushort) ugrab(6);
+ rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.indicator =
+ (unsigned char)ugrab(1);
temp = (unsigned long)ugrab(24);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.pseudorange = 0;
+ rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.pseudorange = 0;
else
- rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.pseudorange = temp * PSEUDORANGE_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.pseudorange =
+ temp * PSEUDORANGE_RESOLUTION;
temp = (long)sgrab(20);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.rangediff = 0;
+ rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.rangediff = 0;
else
- rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION;
- rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.locktime = (unsigned char)sgrab(7);
+ rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.rangediff =
+ temp * PSEUDORANGE_DIFF_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.locktime =
+ (unsigned char)sgrab(7);
}
- assert(bitcount == 64 + 58*rtcm->rtcmtypes.rtcm3_1001.header.satcount);
+ assert(bitcount ==
+ 64 + 58 * rtcm->rtcmtypes.rtcm3_1001.header.satcount);
break;
- case 1002: /* GPS Extended RTK, L1 Only */
- rtcm->rtcmtypes.rtcm3_1002.header.station_id = (uint)ugrab(12);
- rtcm->rtcmtypes.rtcm3_1002.header.tow = (time_t)ugrab(30);
- rtcm->rtcmtypes.rtcm3_1002.header.sync = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1002.header.satcount = (ushort)ugrab(5);
- rtcm->rtcmtypes.rtcm3_1002.header.smoothing = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1002.header.interval = (ushort)ugrab(3);
+ case 1002: /* GPS Extended RTK, L1 Only */
+ rtcm->rtcmtypes.rtcm3_1002.header.station_id = (uint) ugrab(12);
+ rtcm->rtcmtypes.rtcm3_1002.header.tow = (time_t) ugrab(30);
+ rtcm->rtcmtypes.rtcm3_1002.header.sync = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1002.header.satcount = (ushort) ugrab(5);
+ rtcm->rtcmtypes.rtcm3_1002.header.smoothing = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1002.header.interval = (ushort) ugrab(3);
for (i = 0; i < rtcm->rtcmtypes.rtcm3_1002.header.satcount; i++) {
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].ident = (ushort)ugrab(6);
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.indicator = (unsigned char)ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].ident = (ushort) ugrab(6);
+ rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.indicator =
+ (unsigned char)ugrab(1);
temp = (unsigned long)ugrab(24);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.pseudorange = 0;
+ rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.pseudorange = 0;
else
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.pseudorange = temp * PSEUDORANGE_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.pseudorange =
+ temp * PSEUDORANGE_RESOLUTION;
temp = (long)sgrab(20);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.rangediff = 0;
+ rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.rangediff = 0;
else
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION;
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.locktime = (unsigned char)sgrab(7);
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.ambiguity = (bool)ugrab(8);
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.CNR = (bool)ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
+ rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.rangediff =
+ temp * PSEUDORANGE_DIFF_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.locktime =
+ (unsigned char)sgrab(7);
+ rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.ambiguity =
+ (bool) ugrab(8);
+ rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.CNR =
+ (bool) ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
}
- assert(bitcount == 64 + 74*rtcm->rtcmtypes.rtcm3_1002.header.satcount);
+ assert(bitcount ==
+ 64 + 74 * rtcm->rtcmtypes.rtcm3_1002.header.satcount);
break;
- case 1003: /* GPS Basic RTK, L1 & L2 */
- rtcm->rtcmtypes.rtcm3_1003.header.station_id = (uint)ugrab(12);
- rtcm->rtcmtypes.rtcm3_1003.header.tow = (time_t)ugrab(30);
- rtcm->rtcmtypes.rtcm3_1003.header.sync = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1003.header.satcount = (ushort)ugrab(5);
- rtcm->rtcmtypes.rtcm3_1003.header.smoothing = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1003.header.interval = (ushort)ugrab(3);
+ case 1003: /* GPS Basic RTK, L1 & L2 */
+ rtcm->rtcmtypes.rtcm3_1003.header.station_id = (uint) ugrab(12);
+ rtcm->rtcmtypes.rtcm3_1003.header.tow = (time_t) ugrab(30);
+ rtcm->rtcmtypes.rtcm3_1003.header.sync = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1003.header.satcount = (ushort) ugrab(5);
+ rtcm->rtcmtypes.rtcm3_1003.header.smoothing = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1003.header.interval = (ushort) ugrab(3);
for (i = 0; i < rtcm->rtcmtypes.rtcm3_1003.header.satcount; i++) {
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].ident = (ushort)ugrab(6);
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.indicator = (unsigned char)ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].ident = (ushort) ugrab(6);
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.indicator =
+ (unsigned char)ugrab(1);
temp = (unsigned long)ugrab(24);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.pseudorange = 0;
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.pseudorange = 0;
else
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.pseudorange = temp * PSEUDORANGE_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.pseudorange =
+ temp * PSEUDORANGE_RESOLUTION;
temp = (long)sgrab(20);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.rangediff = 0;
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.rangediff = 0;
else
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION;
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.locktime = (unsigned char)sgrab(7);
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.indicator = (unsigned char)ugrab(2);
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.rangediff =
+ temp * PSEUDORANGE_DIFF_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.locktime =
+ (unsigned char)sgrab(7);
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.indicator =
+ (unsigned char)ugrab(2);
temp = (unsigned long)ugrab(24);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.pseudorange = 0;
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.pseudorange = 0;
else
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.pseudorange = temp * PSEUDORANGE_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.pseudorange =
+ temp * PSEUDORANGE_RESOLUTION;
temp = (long)sgrab(20);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.rangediff = 0;
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.rangediff = 0;
else
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION;
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.locktime = (unsigned char)sgrab(7);
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.rangediff =
+ temp * PSEUDORANGE_DIFF_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.locktime =
+ (unsigned char)sgrab(7);
}
- assert(bitcount == 64 + 101*rtcm->rtcmtypes.rtcm3_1003.header.satcount);
+ assert(bitcount ==
+ 64 + 101 * rtcm->rtcmtypes.rtcm3_1003.header.satcount);
break;
- case 1004: /* GPS Extended RTK, L1 & L2 */
- rtcm->rtcmtypes.rtcm3_1004.header.station_id = (uint)ugrab(12);
- rtcm->rtcmtypes.rtcm3_1004.header.tow = (time_t)ugrab(30);
- rtcm->rtcmtypes.rtcm3_1004.header.sync = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1004.header.satcount = (ushort)ugrab(5);
- rtcm->rtcmtypes.rtcm3_1004.header.smoothing = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1004.header.interval = (ushort)ugrab(3);
+ case 1004: /* GPS Extended RTK, L1 & L2 */
+ rtcm->rtcmtypes.rtcm3_1004.header.station_id = (uint) ugrab(12);
+ rtcm->rtcmtypes.rtcm3_1004.header.tow = (time_t) ugrab(30);
+ rtcm->rtcmtypes.rtcm3_1004.header.sync = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1004.header.satcount = (ushort) ugrab(5);
+ rtcm->rtcmtypes.rtcm3_1004.header.smoothing = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1004.header.interval = (ushort) ugrab(3);
for (i = 0; i < rtcm->rtcmtypes.rtcm3_1004.header.satcount; i++) {
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].ident = (ushort)ugrab(6);
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.indicator = (bool)ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].ident = (ushort) ugrab(6);
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.indicator =
+ (bool) ugrab(1);
temp = (unsigned long)ugrab(24);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.pseudorange = 0;
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.pseudorange = 0;
else
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.pseudorange = temp * PSEUDORANGE_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.pseudorange =
+ temp * PSEUDORANGE_RESOLUTION;
temp = (long)sgrab(20);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.rangediff = 0;
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.rangediff = 0;
else
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION;
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.locktime = (unsigned char)sgrab(7);
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.ambiguity = (bool)ugrab(8);
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.CNR = (bool)ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.indicator = (unsigned char)ugrab(2);
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.rangediff =
+ temp * PSEUDORANGE_DIFF_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.locktime =
+ (unsigned char)sgrab(7);
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.ambiguity =
+ (bool) ugrab(8);
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.CNR =
+ (bool) ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.indicator =
+ (unsigned char)ugrab(2);
temp = (unsigned long)ugrab(24);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.pseudorange = 0;
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.pseudorange = 0;
else
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.pseudorange = temp * PSEUDORANGE_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.pseudorange =
+ temp * PSEUDORANGE_RESOLUTION;
temp = (long)sgrab(20);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.rangediff = 0;
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.rangediff = 0;
else
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION;
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.locktime = (unsigned char)sgrab(7);
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.ambiguity = (bool)ugrab(8);
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.CNR = (bool)ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.rangediff =
+ temp * PSEUDORANGE_DIFF_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.locktime =
+ (unsigned char)sgrab(7);
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.ambiguity =
+ (bool) ugrab(8);
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.CNR =
+ (bool) ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
}
- assert(bitcount == 64 + 125*rtcm->rtcmtypes.rtcm3_1004.header.satcount);
+ assert(bitcount ==
+ 64 + 125 * rtcm->rtcmtypes.rtcm3_1004.header.satcount);
break;
- case 1005: /* Stationary Antenna Reference Point, No Height Information */
+ case 1005: /* Stationary Antenna Reference Point, No Height Information */
rtcm->rtcmtypes.rtcm3_1005.station_id = (unsigned short)ugrab(12);
- ugrab(6); /* reserved */
- if ((bool)ugrab(1))
+ ugrab(6); /* reserved */
+ if ((bool) ugrab(1))
rtcm->rtcmtypes.rtcm3_1005.system = NAVSYSTEM_GPS;
- else if ((bool)ugrab(1))
+ else if ((bool) ugrab(1))
rtcm->rtcmtypes.rtcm3_1005.system = NAVSYSTEM_GLONASS;
- else if ((bool)ugrab(1))
+ else if ((bool) ugrab(1))
rtcm->rtcmtypes.rtcm3_1005.system = NAVSYSTEM_GALILEO;
- rtcm->rtcmtypes.rtcm3_1005.reference_station = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1005.ecef_x = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1005.reference_station = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1005.ecef_x =
+ sgrab(38) * ANTENNA_POSITION_RESOLUTION;
rtcm->rtcmtypes.rtcm3_1005.single_receiver = ugrab(1);
ugrab(1);
- rtcm->rtcmtypes.rtcm3_1005.ecef_y = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1005.ecef_y =
+ sgrab(38) * ANTENNA_POSITION_RESOLUTION;
ugrab(2);
- rtcm->rtcmtypes.rtcm3_1005.ecef_z = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1005.ecef_z =
+ sgrab(38) * ANTENNA_POSITION_RESOLUTION;
assert(bitcount == 152);
break;
- case 1006: /* Stationary Antenna Reference Point, with Height Information */
+ case 1006: /* Stationary Antenna Reference Point, with Height Information */
rtcm->rtcmtypes.rtcm3_1006.station_id = (unsigned short)ugrab(12);
- ugrab(6); /* reserved */
- if ((bool)ugrab(1))
+ ugrab(6); /* reserved */
+ if ((bool) ugrab(1))
rtcm->rtcmtypes.rtcm3_1006.system = NAVSYSTEM_GPS;
- else if ((bool)ugrab(1))
+ else if ((bool) ugrab(1))
rtcm->rtcmtypes.rtcm3_1006.system = NAVSYSTEM_GLONASS;
- else if ((bool)ugrab(1))
+ else if ((bool) ugrab(1))
rtcm->rtcmtypes.rtcm3_1006.system = NAVSYSTEM_GALILEO;
- rtcm->rtcmtypes.rtcm3_1006.reference_station = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1006.ecef_x = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1006.reference_station = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1006.ecef_x =
+ sgrab(38) * ANTENNA_POSITION_RESOLUTION;
rtcm->rtcmtypes.rtcm3_1006.single_receiver = ugrab(1);
ugrab(1);
- rtcm->rtcmtypes.rtcm3_1006.ecef_y = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1006.ecef_y =
+ sgrab(38) * ANTENNA_POSITION_RESOLUTION;
ugrab(2);
- rtcm->rtcmtypes.rtcm3_1006.ecef_z = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
- rtcm->rtcmtypes.rtcm3_1006.height = ugrab(16) * ANTENNA_POSITION_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1006.ecef_z =
+ sgrab(38) * ANTENNA_POSITION_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1006.height =
+ ugrab(16) * ANTENNA_POSITION_RESOLUTION;
assert(bitcount == 168);
break;
- case 1007: /* Antenna Descriptor */
+ case 1007: /* Antenna Descriptor */
rtcm->rtcmtypes.rtcm3_1007.station_id = (unsigned short)ugrab(12);
n = (unsigned long)ugrab(8);
(void)memcpy(rtcm->rtcmtypes.rtcm3_1007.descriptor, buf + 4, n);
rtcm->rtcmtypes.rtcm3_1007.descriptor[n] = '\0';
bitcount += 8 * n;
rtcm->rtcmtypes.rtcm3_1007.setup_id = ugrab(8);
- assert(bitcount == (int)(40 + 8*n));
+ assert(bitcount == (int)(40 + 8 * n));
break;
- case 1008: /* Antenna Descriptor & Serial Number */
+ case 1008: /* Antenna Descriptor & Serial Number */
rtcm->rtcmtypes.rtcm3_1008.station_id = (unsigned short)ugrab(12);
n = (unsigned long)ugrab(8);
(void)memcpy(rtcm->rtcmtypes.rtcm3_1008.descriptor, buf + 4, n);
@@ -270,167 +313,215 @@ void rtcm3_unpack(/*@out@*/struct rtcm3_t *rtcm, char *buf)
(void)memcpy(rtcm->rtcmtypes.rtcm3_1008.serial, buf + 6 + n, n2);
rtcm->rtcmtypes.rtcm3_1008.serial[n2] = '\0';
bitcount += 8 * n2;
- assert(bitcount == (int)(48 + 8*(n+n2)));
+ assert(bitcount == (int)(48 + 8 * (n + n2)));
break;
- case 1009: /* GLONASS Basic RTK, L1 Only */
- rtcm->rtcmtypes.rtcm3_1009.header.station_id = (unsigned short)ugrab(12);
- rtcm->rtcmtypes.rtcm3_1009.header.tow = (time_t)ugrab(27);
- rtcm->rtcmtypes.rtcm3_1009.header.sync = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1009.header.satcount = (ushort)ugrab(5);
- rtcm->rtcmtypes.rtcm3_1009.header.smoothing = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1009.header.interval = (ushort)ugrab(3);
+ case 1009: /* GLONASS Basic RTK, L1 Only */
+ rtcm->rtcmtypes.rtcm3_1009.header.station_id =
+ (unsigned short)ugrab(12);
+ rtcm->rtcmtypes.rtcm3_1009.header.tow = (time_t) ugrab(27);
+ rtcm->rtcmtypes.rtcm3_1009.header.sync = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1009.header.satcount = (ushort) ugrab(5);
+ rtcm->rtcmtypes.rtcm3_1009.header.smoothing = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1009.header.interval = (ushort) ugrab(3);
for (i = 0; i < rtcm->rtcmtypes.rtcm3_1009.header.satcount; i++) {
- rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].ident = (ushort)ugrab(6);
- rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.indicator = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.channel = (ushort)ugrab(5);
+ rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].ident = (ushort) ugrab(6);
+ rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.indicator =
+ (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.channel =
+ (ushort) ugrab(5);
temp = (unsigned long)ugrab(25);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.pseudorange = 0;
+ rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.pseudorange = 0;
else
- rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.pseudorange = temp * PSEUDORANGE_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.pseudorange =
+ temp * PSEUDORANGE_RESOLUTION;
temp = (long)sgrab(20);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.rangediff = 0;
+ rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.rangediff = 0;
else
- rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION;
- rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.locktime = (unsigned char)sgrab(7);
+ rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.rangediff =
+ temp * PSEUDORANGE_DIFF_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.locktime =
+ (unsigned char)sgrab(7);
}
- assert(bitcount == 61 + 64*rtcm->rtcmtypes.rtcm3_1009.header.satcount);
+ assert(bitcount ==
+ 61 + 64 * rtcm->rtcmtypes.rtcm3_1009.header.satcount);
break;
- case 1010: /* GLONASS Extended RTK, L1 Only */
- rtcm->rtcmtypes.rtcm3_1010.header.station_id = (unsigned short)ugrab(12);
- rtcm->rtcmtypes.rtcm3_1010.header.tow = (time_t)ugrab(27);
- rtcm->rtcmtypes.rtcm3_1010.header.sync = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1010.header.satcount = (ushort)ugrab(5);
- rtcm->rtcmtypes.rtcm3_1010.header.smoothing = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1010.header.interval = (ushort)ugrab(3);
+ case 1010: /* GLONASS Extended RTK, L1 Only */
+ rtcm->rtcmtypes.rtcm3_1010.header.station_id =
+ (unsigned short)ugrab(12);
+ rtcm->rtcmtypes.rtcm3_1010.header.tow = (time_t) ugrab(27);
+ rtcm->rtcmtypes.rtcm3_1010.header.sync = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1010.header.satcount = (ushort) ugrab(5);
+ rtcm->rtcmtypes.rtcm3_1010.header.smoothing = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1010.header.interval = (ushort) ugrab(3);
for (i = 0; i < rtcm->rtcmtypes.rtcm3_1010.header.satcount; i++) {
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].ident = (ushort)ugrab(6);
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.indicator = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.channel = (ushort)ugrab(5);
+ rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].ident = (ushort) ugrab(6);
+ rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.indicator =
+ (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.channel =
+ (ushort) ugrab(5);
temp = (unsigned long)ugrab(25);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.pseudorange = 0;
+ rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.pseudorange = 0;
else
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.pseudorange = temp * PSEUDORANGE_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.pseudorange =
+ temp * PSEUDORANGE_RESOLUTION;
temp = (long)sgrab(20);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.rangediff = 0;
+ rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.rangediff = 0;
else
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION;
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.locktime = (unsigned char)sgrab(7);
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.ambiguity = (bool)ugrab(7);
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.CNR = (bool)ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
+ rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.rangediff =
+ temp * PSEUDORANGE_DIFF_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.locktime =
+ (unsigned char)sgrab(7);
+ rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.ambiguity =
+ (bool) ugrab(7);
+ rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.CNR =
+ (bool) ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
}
- assert(bitcount == 61 + 79*rtcm->rtcmtypes.rtcm3_1010.header.satcount);
+ assert(bitcount ==
+ 61 + 79 * rtcm->rtcmtypes.rtcm3_1010.header.satcount);
break;
- case 1011: /* GLONASS Basic RTK, L1 & L2 */
- rtcm->rtcmtypes.rtcm3_1011.header.station_id = (unsigned short)ugrab(12);
- rtcm->rtcmtypes.rtcm3_1011.header.tow = (time_t)ugrab(27);
- rtcm->rtcmtypes.rtcm3_1011.header.sync = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1011.header.satcount = (ushort)ugrab(5);
- rtcm->rtcmtypes.rtcm3_1011.header.smoothing = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1011.header.interval = (ushort)ugrab(3);
+ case 1011: /* GLONASS Basic RTK, L1 & L2 */
+ rtcm->rtcmtypes.rtcm3_1011.header.station_id =
+ (unsigned short)ugrab(12);
+ rtcm->rtcmtypes.rtcm3_1011.header.tow = (time_t) ugrab(27);
+ rtcm->rtcmtypes.rtcm3_1011.header.sync = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1011.header.satcount = (ushort) ugrab(5);
+ rtcm->rtcmtypes.rtcm3_1011.header.smoothing = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1011.header.interval = (ushort) ugrab(3);
for (i = 0; i < rtcm->rtcmtypes.rtcm3_1011.header.satcount; i++) {
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].ident = (ushort)ugrab(6);
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.indicator = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.channel = (ushort)ugrab(5);
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].ident = (ushort) ugrab(6);
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.indicator =
+ (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.channel =
+ (ushort) ugrab(5);
temp = (unsigned long)ugrab(25);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.pseudorange = 0;
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.pseudorange = 0;
else
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.pseudorange = temp * PSEUDORANGE_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.pseudorange =
+ temp * PSEUDORANGE_RESOLUTION;
temp = (long)sgrab(20);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.rangediff = 0;
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.rangediff = 0;
else
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION;
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.locktime = (unsigned char)sgrab(7);
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.ambiguity = (bool)ugrab(7);
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.CNR = (bool)ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.indicator = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.channel = (ushort)ugrab(5);
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.rangediff =
+ temp * PSEUDORANGE_DIFF_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.locktime =
+ (unsigned char)sgrab(7);
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.ambiguity =
+ (bool) ugrab(7);
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.CNR =
+ (bool) ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.indicator =
+ (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.channel =
+ (ushort) ugrab(5);
temp = (unsigned long)ugrab(25);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.pseudorange = 0;
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.pseudorange = 0;
else
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.pseudorange = temp * PSEUDORANGE_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.pseudorange =
+ temp * PSEUDORANGE_RESOLUTION;
temp = (long)sgrab(20);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.rangediff = 0;
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.rangediff = 0;
else
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION;
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.locktime = (unsigned char)sgrab(7);
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.ambiguity = (bool)ugrab(7);
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.CNR = (bool)ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.rangediff =
+ temp * PSEUDORANGE_DIFF_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.locktime =
+ (unsigned char)sgrab(7);
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.ambiguity =
+ (bool) ugrab(7);
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.CNR =
+ (bool) ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
}
- assert(bitcount == 61 + 107*rtcm->rtcmtypes.rtcm3_1011.header.satcount);
+ assert(bitcount ==
+ 61 + 107 * rtcm->rtcmtypes.rtcm3_1011.header.satcount);
break;
- case 1012: /* GLONASS Extended RTK, L1 & L2 */
- rtcm->rtcmtypes.rtcm3_1012.header.station_id = (unsigned short)ugrab(12);
- rtcm->rtcmtypes.rtcm3_1012.header.tow = (time_t)ugrab(27);
- rtcm->rtcmtypes.rtcm3_1012.header.sync = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1012.header.satcount = (ushort)ugrab(5);
- rtcm->rtcmtypes.rtcm3_1012.header.smoothing = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1012.header.interval = (ushort)ugrab(3);
+ case 1012: /* GLONASS Extended RTK, L1 & L2 */
+ rtcm->rtcmtypes.rtcm3_1012.header.station_id =
+ (unsigned short)ugrab(12);
+ rtcm->rtcmtypes.rtcm3_1012.header.tow = (time_t) ugrab(27);
+ rtcm->rtcmtypes.rtcm3_1012.header.sync = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1012.header.satcount = (ushort) ugrab(5);
+ rtcm->rtcmtypes.rtcm3_1012.header.smoothing = (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1012.header.interval = (ushort) ugrab(3);
for (i = 0; i < rtcm->rtcmtypes.rtcm3_1012.header.satcount; i++) {
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].ident = (ushort)ugrab(6);
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.indicator = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.channel = (ushort)ugrab(5);
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].ident = (ushort) ugrab(6);
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.indicator =
+ (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.channel =
+ (ushort) ugrab(5);
temp = (unsigned long)ugrab(25);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.pseudorange = 0;
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.pseudorange = 0;
else
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.pseudorange = temp * PSEUDORANGE_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.pseudorange =
+ temp * PSEUDORANGE_RESOLUTION;
temp = (long)sgrab(20);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.rangediff = 0;
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.rangediff = 0;
else
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION;
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.locktime = (unsigned char)sgrab(7);
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.indicator = (bool)ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.rangediff =
+ temp * PSEUDORANGE_DIFF_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.locktime =
+ (unsigned char)sgrab(7);
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.indicator =
+ (bool) ugrab(1);
temp = (unsigned long)ugrab(25);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.pseudorange = 0;
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.pseudorange = 0;
else
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.pseudorange = temp * PSEUDORANGE_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.pseudorange =
+ temp * PSEUDORANGE_RESOLUTION;
temp = (long)sgrab(20);
if (temp == INVALID_PSEUDORANGE)
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.rangediff = 0;
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.rangediff = 0;
else
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.rangediff = temp * PSEUDORANGE_DIFF_RESOLUTION;
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.locktime = (unsigned char)sgrab(7);
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.rangediff =
+ temp * PSEUDORANGE_DIFF_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.locktime =
+ (unsigned char)sgrab(7);
}
- assert(bitcount == 61 + 130*rtcm->rtcmtypes.rtcm3_1012.header.satcount);
+ assert(bitcount ==
+ 61 + 130 * rtcm->rtcmtypes.rtcm3_1012.header.satcount);
break;
- case 1013: /* System Parameters */
- rtcm->rtcmtypes.rtcm3_1013.station_id =(unsigned short)ugrab(12);
+ case 1013: /* System Parameters */
+ rtcm->rtcmtypes.rtcm3_1013.station_id = (unsigned short)ugrab(12);
rtcm->rtcmtypes.rtcm3_1013.mjd = (unsigned short)ugrab(16);
rtcm->rtcmtypes.rtcm3_1013.sod = (unsigned short)ugrab(17);
rtcm->rtcmtypes.rtcm3_1013.ncount = (unsigned long)ugrab(5);
rtcm->rtcmtypes.rtcm3_1013.leapsecs = (unsigned char)ugrab(8);
for (i = 0; i < rtcm->rtcmtypes.rtcm3_1013.ncount; i++) {
- rtcm->rtcmtypes.rtcm3_1013.announcements[i].id = (unsigned short)ugrab(12);
- rtcm->rtcmtypes.rtcm3_1013.announcements[i].sync = (bool)ugrab(1);
- rtcm->rtcmtypes.rtcm3_1013.announcements[i].interval = (unsigned short)ugrab(16);
+ rtcm->rtcmtypes.rtcm3_1013.announcements[i].id =
+ (unsigned short)ugrab(12);
+ rtcm->rtcmtypes.rtcm3_1013.announcements[i].sync =
+ (bool) ugrab(1);
+ rtcm->rtcmtypes.rtcm3_1013.announcements[i].interval =
+ (unsigned short)ugrab(16);
}
- assert(bitcount == 70 + 29*rtcm->rtcmtypes.rtcm3_1013.ncount);
+ assert(bitcount == 70 + 29 * rtcm->rtcmtypes.rtcm3_1013.ncount);
break;
case 1014:
- rtcm->rtcmtypes.rtcm3_1014.network_id =(int)ugrab(8);
- rtcm->rtcmtypes.rtcm3_1014.subnetwork_id =(int)ugrab(4);
- rtcm->rtcmtypes.rtcm3_1014.stationcount =(char)ugrab(5);
- rtcm->rtcmtypes.rtcm3_1014.master_id =(int)ugrab(12);
- rtcm->rtcmtypes.rtcm3_1014.aux_id =(int)ugrab(12);
- rtcm->rtcmtypes.rtcm3_1014.d_lat =(unsigned short)ugrab(20) * ANTENNA_DEGREE_RESOLUTION;
- rtcm->rtcmtypes.rtcm3_1014.d_lon =(unsigned short)ugrab(21) * ANTENNA_DEGREE_RESOLUTION;
- rtcm->rtcmtypes.rtcm3_1014.d_alt =(unsigned short)ugrab(23) / 1000;
+ rtcm->rtcmtypes.rtcm3_1014.network_id = (int)ugrab(8);
+ rtcm->rtcmtypes.rtcm3_1014.subnetwork_id = (int)ugrab(4);
+ rtcm->rtcmtypes.rtcm3_1014.stationcount = (char)ugrab(5);
+ rtcm->rtcmtypes.rtcm3_1014.master_id = (int)ugrab(12);
+ rtcm->rtcmtypes.rtcm3_1014.aux_id = (int)ugrab(12);
+ rtcm->rtcmtypes.rtcm3_1014.d_lat =
+ (unsigned short)ugrab(20) * ANTENNA_DEGREE_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1014.d_lon =
+ (unsigned short)ugrab(21) * ANTENNA_DEGREE_RESOLUTION;
+ rtcm->rtcmtypes.rtcm3_1014.d_alt = (unsigned short)ugrab(23) / 1000;
assert(bitcount == 117);
break;
@@ -457,331 +548,381 @@ void rtcm3_unpack(/*@out@*/struct rtcm3_t *rtcm, char *buf)
rtcm->rtcmtypes.rtcm3_1029.mjd = (unsigned short)ugrab(16);
rtcm->rtcmtypes.rtcm3_1029.sod = (unsigned short)ugrab(17);
rtcm->rtcmtypes.rtcm3_1029.len = (unsigned long)ugrab(7);
- n = rtcm->rtcmtypes.rtcm3_1029.unicode_units = (unsigned long)ugrab(8);
- (void)memcpy(rtcm->rtcmtypes.rtcm3_1029.text, buf+9, n);
- bitcount += 8*n;
- assert(bitcount == (int)(72+8*n));
+ n = rtcm->rtcmtypes.rtcm3_1029.unicode_units =
+ (unsigned long)ugrab(8);
+ (void)memcpy(rtcm->rtcmtypes.rtcm3_1029.text, buf + 9, n);
+ bitcount += 8 * n;
+ assert(bitcount == (int)(72 + 8 * n));
break;
}
#undef sgrab
#undef ugrab
- /*@ +evalorder +sefparams +mayaliasunique @*/
+ /*@ +evalorder +sefparams +mayaliasunique @*/
}
-void rtcm3_dump(struct rtcm3_t *rtcm, FILE *fp)
+void rtcm3_dump(struct rtcm3_t *rtcm, FILE * fp)
/* dump the contents of a parsed RTCM104 message */
{
int i;
- char *systems[] = {"GPS", "Glonass", "Galileo", "unknown"};
+ char *systems[] = { "GPS", "Glonass", "Galileo", "unknown" };
(void)fprintf(fp, "%u (%u):\n", rtcm->type, rtcm->length);
#define BOOL(c) (c!=0 ? 't' : 'f')
#define CODE(x) (unsigned int)(x)
#define INT(x) (unsigned int)(x)
- switch(rtcm->type) {
- case 1001:
- (void)fprintf(fp,
- " #station_id=%u, tow=%d sync=%c smoothing=%c interval=%u satcount=%u",
- rtcm->rtcmtypes.rtcm3_1001.header.station_id,
- (int)rtcm->rtcmtypes.rtcm3_1001.header.tow,
- BOOL(rtcm->rtcmtypes.rtcm3_1001.header.sync),
- BOOL(rtcm->rtcmtypes.rtcm3_1001.header.smoothing),
- rtcm->rtcmtypes.rtcm3_1001.header.interval,
- rtcm->rtcmtypes.rtcm3_1001.header.satcount);
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1001.header.satcount; i++) {
- (void)fprintf(fp,
- " ident=%u\n L1: ind=%u prange=%8.1f delta=%6.4f lockt=%u\n",
- rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].ident,
- CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.indicator),
- rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.pseudorange,
- rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.locktime));
- }
- break;
-
- case 1002:
- (void)fprintf(fp,
- " #station_id=%u, tow=%d sync=%c smoothing=%c interval=%u satcount=%u",
- rtcm->rtcmtypes.rtcm3_1002.header.station_id,
- (int)rtcm->rtcmtypes.rtcm3_1002.header.tow,
- BOOL(rtcm->rtcmtypes.rtcm3_1002.header.sync),
- BOOL(rtcm->rtcmtypes.rtcm3_1002.header.smoothing),
- rtcm->rtcmtypes.rtcm3_1002.header.interval,
- rtcm->rtcmtypes.rtcm3_1002.header.satcount);
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1002.header.satcount; i++) {
- (void)fprintf(fp,
- " ident=%u\n L1: ind=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n",
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].ident,
- CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.indicator),
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.pseudorange,
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.locktime),
- INT(rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.ambiguity),
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.CNR);
- }
- break;
-
- case 1003:
+ switch (rtcm->type) {
+ case 1001:
+ (void)fprintf(fp,
+ " #station_id=%u, tow=%d sync=%c smoothing=%c interval=%u satcount=%u",
+ rtcm->rtcmtypes.rtcm3_1001.header.station_id,
+ (int)rtcm->rtcmtypes.rtcm3_1001.header.tow,
+ BOOL(rtcm->rtcmtypes.rtcm3_1001.header.sync),
+ BOOL(rtcm->rtcmtypes.rtcm3_1001.header.smoothing),
+ rtcm->rtcmtypes.rtcm3_1001.header.interval,
+ rtcm->rtcmtypes.rtcm3_1001.header.satcount);
+ for (i = 0; i < rtcm->rtcmtypes.rtcm3_1001.header.satcount; i++) {
+ (void)fprintf(fp,
+ " ident=%u\n L1: ind=%u prange=%8.1f delta=%6.4f lockt=%u\n",
+ rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].ident,
+ CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
+ L1.indicator),
+ rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].
+ L1.pseudorange,
+ rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.rangediff,
+ INT(rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].
+ L1.locktime));
+ }
+ break;
+
+ case 1002:
+ (void)fprintf(fp,
+ " #station_id=%u, tow=%d sync=%c smoothing=%c interval=%u satcount=%u",
+ rtcm->rtcmtypes.rtcm3_1002.header.station_id,
+ (int)rtcm->rtcmtypes.rtcm3_1002.header.tow,
+ BOOL(rtcm->rtcmtypes.rtcm3_1002.header.sync),
+ BOOL(rtcm->rtcmtypes.rtcm3_1002.header.smoothing),
+ rtcm->rtcmtypes.rtcm3_1002.header.interval,
+ rtcm->rtcmtypes.rtcm3_1002.header.satcount);
+ for (i = 0; i < rtcm->rtcmtypes.rtcm3_1002.header.satcount; i++) {
+ (void)fprintf(fp,
+ " ident=%u\n L1: ind=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n",
+ rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].ident,
+ CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
+ L1.indicator),
+ rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].
+ L1.pseudorange,
+ rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.rangediff,
+ INT(rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].
+ L1.locktime),
+ INT(rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].
+ L1.ambiguity),
+ rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.CNR);
+ }
+ break;
+
+ case 1003:
+ (void)fprintf(fp,
+ " #station_id=%u, tow=%d sync=%c smoothing=%c interval=%u satcount=%u",
+ rtcm->rtcmtypes.rtcm3_1003.header.station_id,
+ (int)rtcm->rtcmtypes.rtcm3_1003.header.tow,
+ BOOL(rtcm->rtcmtypes.rtcm3_1003.header.sync),
+ BOOL(rtcm->rtcmtypes.rtcm3_1003.header.smoothing),
+ rtcm->rtcmtypes.rtcm3_1003.header.interval,
+ rtcm->rtcmtypes.rtcm3_1003.header.satcount);
+ for (i = 0; i < rtcm->rtcmtypes.rtcm3_1003.header.satcount; i++) {
+ (void)fprintf(fp,
+ " ident=%u\n L1: ind=%u prange=%8.1f delta=%6.4f lockt=%u\n L2: ind=%u prange=%8.1f delta=%6.4f lockt=%u\n",
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].ident,
+ CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
+ L1.indicator),
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
+ L1.pseudorange,
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.rangediff,
+ INT(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
+ L1.locktime),
+ CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
+ L2.indicator),
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
+ L2.pseudorange,
+ rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.rangediff,
+ INT(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
+ L2.locktime));
+ }
+ break;
+
+ case 1004:
+ (void)fprintf(fp,
+ " #station_id=%u, tow=%d sync=%c smoothing=%c interval=%u satcount=%u\n",
+ rtcm->rtcmtypes.rtcm3_1004.header.station_id,
+ (int)rtcm->rtcmtypes.rtcm3_1004.header.tow,
+ BOOL(rtcm->rtcmtypes.rtcm3_1004.header.sync),
+ BOOL(rtcm->rtcmtypes.rtcm3_1004.header.smoothing),
+ rtcm->rtcmtypes.rtcm3_1004.header.interval,
+ rtcm->rtcmtypes.rtcm3_1004.header.satcount);
+ for (i = 0; i < rtcm->rtcmtypes.rtcm3_1004.header.satcount; i++) {
+ (void)fprintf(fp,
+ " ident=%u\n L1: ind=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n L2: ind=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n",
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].ident,
+ CODE(rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].
+ L1.indicator),
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].
+ L1.pseudorange,
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.rangediff,
+ INT(rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].
+ L1.locktime),
+ INT(rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].
+ L1.ambiguity),
+ rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.CNR,
+ CODE(rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].
+ L2.indicator),
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].
+ L2.pseudorange,
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.rangediff,
+ INT(rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].
+ L2.locktime),
+ INT(rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].
+ L2.ambiguity),
+ rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.CNR);
+ }
+ break;
+
+ case 1005:
+ (void)fprintf(fp,
+ " station_id=%u, %s refstation=%c sro=%c x=%f y=%f z=%f\n",
+ rtcm->rtcmtypes.rtcm3_1005.station_id,
+ systems[rtcm->rtcmtypes.rtcm3_1005.system],
+ BOOL(rtcm->rtcmtypes.rtcm3_1005.reference_station),
+ BOOL(rtcm->rtcmtypes.rtcm3_1005.single_receiver),
+ rtcm->rtcmtypes.rtcm3_1005.ecef_x,
+ rtcm->rtcmtypes.rtcm3_1005.ecef_y,
+ rtcm->rtcmtypes.rtcm3_1005.ecef_z);
+ break;
+
+ case 1006:
+ (void)fprintf(fp,
+ " station_id=%u, %s refstation=%c sro=%c x=%f y=%f z=%f a=%f\n",
+ rtcm->rtcmtypes.rtcm3_1006.station_id,
+ systems[rtcm->rtcmtypes.rtcm3_1006.system],
+ BOOL(rtcm->rtcmtypes.rtcm3_1006.reference_station),
+ BOOL(rtcm->rtcmtypes.rtcm3_1006.single_receiver),
+ rtcm->rtcmtypes.rtcm3_1006.ecef_x,
+ rtcm->rtcmtypes.rtcm3_1006.ecef_y,
+ rtcm->rtcmtypes.rtcm3_1006.ecef_z,
+ rtcm->rtcmtypes.rtcm3_1006.height);
+ break;
+
+ case 1007:
+ (void)fprintf(fp,
+ " station_id=%u, desc=%s setup-id=%u\n",
+ rtcm->rtcmtypes.rtcm3_1007.station_id,
+ rtcm->rtcmtypes.rtcm3_1007.descriptor,
+ INT(rtcm->rtcmtypes.rtcm3_1007.setup_id));
+ break;
+
+ case 1008:
+ (void)fprintf(fp,
+ " station_id=%u, desc=%s setup-id=%u serial=%s\n",
+ rtcm->rtcmtypes.rtcm3_1008.station_id,
+ rtcm->rtcmtypes.rtcm3_1008.descriptor,
+ INT(rtcm->rtcmtypes.rtcm3_1008.setup_id),
+ rtcm->rtcmtypes.rtcm3_1008.serial);
+ break;
+
+ case 1009:
+ (void)fprintf(fp,
+ " #station_id=%u, tow=%d sync=%c smooting=%c interval=%u satcount=%u",
+ rtcm->rtcmtypes.rtcm3_1009.header.station_id,
+ (int)rtcm->rtcmtypes.rtcm3_1009.header.tow,
+ BOOL(rtcm->rtcmtypes.rtcm3_1009.header.sync),
+ BOOL(rtcm->rtcmtypes.rtcm3_1009.header.smoothing),
+ rtcm->rtcmtypes.rtcm3_1009.header.interval,
+ rtcm->rtcmtypes.rtcm3_1009.header.satcount);
+ for (i = 0; i < rtcm->rtcmtypes.rtcm3_1009.header.satcount; i++) {
+ (void)fprintf(fp,
+ " ident=%u\n L1: ind=%u channel=%u prange=%8.1f delta=%6.4f lockt=%u\n",
+ rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].ident,
+ CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
+ L1.indicator),
+ INT(rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].
+ L1.channel),
+ rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].
+ L1.pseudorange,
+ rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.rangediff,
+ INT(rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].
+ L1.locktime));
+ }
+ break;
+
+ case 1010:
+ (void)fprintf(fp,
+ " #station_id=%u, tow=%d sync=%c smooting=%c interval=%u satcount=%u",
+ rtcm->rtcmtypes.rtcm3_1010.header.station_id,
+ (int)rtcm->rtcmtypes.rtcm3_1010.header.tow,
+ BOOL(rtcm->rtcmtypes.rtcm3_1010.header.sync),
+ BOOL(rtcm->rtcmtypes.rtcm3_1010.header.smoothing),
+ rtcm->rtcmtypes.rtcm3_1010.header.interval,
+ rtcm->rtcmtypes.rtcm3_1010.header.satcount);
+ for (i = 0; i < rtcm->rtcmtypes.rtcm3_1010.header.satcount; i++) {
(void)fprintf(fp,
- " #station_id=%u, tow=%d sync=%c smoothing=%c interval=%u satcount=%u",
- rtcm->rtcmtypes.rtcm3_1003.header.station_id,
- (int)rtcm->rtcmtypes.rtcm3_1003.header.tow,
- BOOL(rtcm->rtcmtypes.rtcm3_1003.header.sync),
- BOOL(rtcm->rtcmtypes.rtcm3_1003.header.smoothing),
- rtcm->rtcmtypes.rtcm3_1003.header.interval,
- rtcm->rtcmtypes.rtcm3_1003.header.satcount);
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1003.header.satcount; i++) {
- (void)fprintf(fp,
- " ident=%u\n L1: ind=%u prange=%8.1f delta=%6.4f lockt=%u\n L2: ind=%u prange=%8.1f delta=%6.4f lockt=%u\n",
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].ident,
- CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.indicator),
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.pseudorange,
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.locktime),
- CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.indicator),
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.pseudorange,
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.locktime));
- }
- break;
-
- case 1004:
- (void)fprintf(fp,
- " #station_id=%u, tow=%d sync=%c smoothing=%c interval=%u satcount=%u\n",
- rtcm->rtcmtypes.rtcm3_1004.header.station_id,
- (int)rtcm->rtcmtypes.rtcm3_1004.header.tow,
- BOOL(rtcm->rtcmtypes.rtcm3_1004.header.sync),
- BOOL(rtcm->rtcmtypes.rtcm3_1004.header.smoothing),
- rtcm->rtcmtypes.rtcm3_1004.header.interval,
- rtcm->rtcmtypes.rtcm3_1004.header.satcount);
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1004.header.satcount; i++) {
- (void)fprintf(fp,
- " ident=%u\n L1: ind=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n L2: ind=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n",
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].ident,
- CODE(rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.indicator),
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.pseudorange,
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.locktime),
- INT(rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.ambiguity),
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.CNR,
- CODE(rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.indicator),
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.pseudorange,
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.locktime),
- INT(rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.ambiguity),
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.CNR);
- }
- break;
-
- case 1005:
- (void)fprintf(fp,
- " station_id=%u, %s refstation=%c sro=%c x=%f y=%f z=%f\n",
- rtcm->rtcmtypes.rtcm3_1005.station_id,
- systems[rtcm->rtcmtypes.rtcm3_1005.system],
- BOOL(rtcm->rtcmtypes.rtcm3_1005.reference_station),
- BOOL(rtcm->rtcmtypes.rtcm3_1005.single_receiver),
- rtcm->rtcmtypes.rtcm3_1005.ecef_x,
- rtcm->rtcmtypes.rtcm3_1005.ecef_y,
- rtcm->rtcmtypes.rtcm3_1005.ecef_z);
- break;
-
- case 1006:
- (void)fprintf(fp,
- " station_id=%u, %s refstation=%c sro=%c x=%f y=%f z=%f a=%f\n",
- rtcm->rtcmtypes.rtcm3_1006.station_id,
- systems[rtcm->rtcmtypes.rtcm3_1006.system],
- BOOL(rtcm->rtcmtypes.rtcm3_1006.reference_station),
- BOOL(rtcm->rtcmtypes.rtcm3_1006.single_receiver),
- rtcm->rtcmtypes.rtcm3_1006.ecef_x,
- rtcm->rtcmtypes.rtcm3_1006.ecef_y,
- rtcm->rtcmtypes.rtcm3_1006.ecef_z,
- rtcm->rtcmtypes.rtcm3_1006.height);
- break;
-
- case 1007:
- (void)fprintf(fp,
- " station_id=%u, desc=%s setup-id=%u\n",
- rtcm->rtcmtypes.rtcm3_1007.station_id,
- rtcm->rtcmtypes.rtcm3_1007.descriptor,
- INT(rtcm->rtcmtypes.rtcm3_1007.setup_id));
- break;
-
- case 1008:
- (void)fprintf(fp,
- " station_id=%u, desc=%s setup-id=%u serial=%s\n",
- rtcm->rtcmtypes.rtcm3_1008.station_id,
- rtcm->rtcmtypes.rtcm3_1008.descriptor,
- INT(rtcm->rtcmtypes.rtcm3_1008.setup_id),
- rtcm->rtcmtypes.rtcm3_1008.serial);
- break;
-
- case 1009:
- (void)fprintf(fp,
- " #station_id=%u, tow=%d sync=%c smooting=%c interval=%u satcount=%u",
- rtcm->rtcmtypes.rtcm3_1009.header.station_id,
- (int)rtcm->rtcmtypes.rtcm3_1009.header.tow,
- BOOL(rtcm->rtcmtypes.rtcm3_1009.header.sync),
- BOOL(rtcm->rtcmtypes.rtcm3_1009.header.smoothing),
- rtcm->rtcmtypes.rtcm3_1009.header.interval,
- rtcm->rtcmtypes.rtcm3_1009.header.satcount);
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1009.header.satcount; i++) {
- (void)fprintf(fp,
- " ident=%u\n L1: ind=%u channel=%u prange=%8.1f delta=%6.4f lockt=%u\n",
- rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].ident,
- CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.indicator),
- INT(rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.channel),
- rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.pseudorange,
- rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.locktime));
- }
- break;
-
- case 1010:
- (void)fprintf(fp,
- " #station_id=%u, tow=%d sync=%c smooting=%c interval=%u satcount=%u",
- rtcm->rtcmtypes.rtcm3_1010.header.station_id,
- (int)rtcm->rtcmtypes.rtcm3_1010.header.tow,
- BOOL(rtcm->rtcmtypes.rtcm3_1010.header.sync),
- BOOL(rtcm->rtcmtypes.rtcm3_1010.header.smoothing),
- rtcm->rtcmtypes.rtcm3_1010.header.interval,
- rtcm->rtcmtypes.rtcm3_1010.header.satcount);
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1010.header.satcount; i++) {
- (void)fprintf(fp,
- " ident=%u\n L1: ind=%u channel=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n",
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].ident,
- CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.indicator),
- INT(rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.channel),
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.pseudorange,
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.locktime),
- INT(rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.ambiguity),
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.CNR);
- }
- break;
-
- case 1011:
- (void)fprintf(fp,
- " #station_id=%u, tow=%d sync=%c smooting=%c interval=%u satcount=%u",
- rtcm->rtcmtypes.rtcm3_1011.header.station_id,
- (int)rtcm->rtcmtypes.rtcm3_1011.header.tow,
- BOOL(rtcm->rtcmtypes.rtcm3_1011.header.sync),
- BOOL(rtcm->rtcmtypes.rtcm3_1011.header.smoothing),
- rtcm->rtcmtypes.rtcm3_1011.header.interval,
- rtcm->rtcmtypes.rtcm3_1011.header.satcount);
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1011.header.satcount; i++) {
- (void)fprintf(fp,
- " ident=%u\n L1: ind=%u channel=%u prange=%8.1f delta=%6.4f lockt=%u\n L2: ind=%u prange=%8.1f delta=%6.4f lockt=%u\n",
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].ident,
- CODE(rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.indicator),
- INT(rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.channel),
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.pseudorange,
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.locktime),
- CODE(rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.indicator),
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.pseudorange,
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.locktime));
- }
- break;
-
- case 1012:
- (void)fprintf(fp,
- " #station_id=%u, tow=%d sync=%c smooting=%c interval=%u satcount=%u",
- rtcm->rtcmtypes.rtcm3_1012.header.station_id,
- (int)rtcm->rtcmtypes.rtcm3_1012.header.tow,
- BOOL(rtcm->rtcmtypes.rtcm3_1012.header.sync),
- BOOL(rtcm->rtcmtypes.rtcm3_1012.header.smoothing),
- rtcm->rtcmtypes.rtcm3_1012.header.interval,
- rtcm->rtcmtypes.rtcm3_1012.header.satcount);
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1012.header.satcount; i++) {
- (void)fprintf(fp,
- " ident=%u\n L1: ind=%u channel=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n L2: ind=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n",
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].ident,
- CODE(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.indicator),
- INT(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.channel),
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.pseudorange,
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.locktime),
- INT(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.ambiguity),
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.CNR,
- CODE(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.indicator),
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.pseudorange,
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.locktime),
- INT(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.ambiguity),
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.CNR);
- }
- break;
-
- case 1013:
+ " ident=%u\n L1: ind=%u channel=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n",
+ rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].ident,
+ CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
+ L1.indicator),
+ INT(rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].
+ L1.channel),
+ rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].
+ L1.pseudorange,
+ rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.rangediff,
+ INT(rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].
+ L1.locktime),
+ INT(rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].
+ L1.ambiguity),
+ rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.CNR);
+ }
+ break;
+
+ case 1011:
+ (void)fprintf(fp,
+ " #station_id=%u, tow=%d sync=%c smooting=%c interval=%u satcount=%u",
+ rtcm->rtcmtypes.rtcm3_1011.header.station_id,
+ (int)rtcm->rtcmtypes.rtcm3_1011.header.tow,
+ BOOL(rtcm->rtcmtypes.rtcm3_1011.header.sync),
+ BOOL(rtcm->rtcmtypes.rtcm3_1011.header.smoothing),
+ rtcm->rtcmtypes.rtcm3_1011.header.interval,
+ rtcm->rtcmtypes.rtcm3_1011.header.satcount);
+ for (i = 0; i < rtcm->rtcmtypes.rtcm3_1011.header.satcount; i++) {
(void)fprintf(fp,
- " station_id=%u, mjd=%u sec=%u leapsecs=%u ncount=%u\n",
- rtcm->rtcmtypes.rtcm3_1013.station_id,
- rtcm->rtcmtypes.rtcm3_1013.mjd,
- rtcm->rtcmtypes.rtcm3_1013.sod,
- INT(rtcm->rtcmtypes.rtcm3_1013.leapsecs),
- INT(rtcm->rtcmtypes.rtcm3_1013.ncount));
+ " ident=%u\n L1: ind=%u channel=%u prange=%8.1f delta=%6.4f lockt=%u\n L2: ind=%u prange=%8.1f delta=%6.4f lockt=%u\n",
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].ident,
+ CODE(rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].
+ L1.indicator),
+ INT(rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].
+ L1.channel),
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].
+ L1.pseudorange,
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.rangediff,
+ INT(rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].
+ L1.locktime),
+ CODE(rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].
+ L2.indicator),
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].
+ L2.pseudorange,
+ rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.rangediff,
+ INT(rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].
+ L2.locktime));
+ }
+ break;
+
+ case 1012:
+ (void)fprintf(fp,
+ " #station_id=%u, tow=%d sync=%c smooting=%c interval=%u satcount=%u",
+ rtcm->rtcmtypes.rtcm3_1012.header.station_id,
+ (int)rtcm->rtcmtypes.rtcm3_1012.header.tow,
+ BOOL(rtcm->rtcmtypes.rtcm3_1012.header.sync),
+ BOOL(rtcm->rtcmtypes.rtcm3_1012.header.smoothing),
+ rtcm->rtcmtypes.rtcm3_1012.header.interval,
+ rtcm->rtcmtypes.rtcm3_1012.header.satcount);
+ for (i = 0; i < rtcm->rtcmtypes.rtcm3_1012.header.satcount; i++) {
+ (void)fprintf(fp,
+ " ident=%u\n L1: ind=%u channel=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n L2: ind=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n",
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].ident,
+ CODE(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
+ L1.indicator),
+ INT(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
+ L1.channel),
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
+ L1.pseudorange,
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.rangediff,
+ INT(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
+ L1.locktime),
+ INT(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
+ L1.ambiguity),
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.CNR,
+ CODE(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
+ L2.indicator),
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
+ L2.pseudorange,
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.rangediff,
+ INT(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
+ L2.locktime),
+ INT(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
+ L2.ambiguity),
+ rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.CNR);
+ }
+ break;
+
+ case 1013:
+ (void)fprintf(fp,
+ " station_id=%u, mjd=%u sec=%u leapsecs=%u ncount=%u\n",
+ rtcm->rtcmtypes.rtcm3_1013.station_id,
+ rtcm->rtcmtypes.rtcm3_1013.mjd,
+ rtcm->rtcmtypes.rtcm3_1013.sod,
+ INT(rtcm->rtcmtypes.rtcm3_1013.leapsecs),
+ INT(rtcm->rtcmtypes.rtcm3_1013.ncount));
for (i = 0; i < rtcm->rtcmtypes.rtcm3_1013.ncount; i++)
(void)fprintf(fp,
" id=%u sync=%c interval=%u\n",
rtcm->rtcmtypes.rtcm3_1013.announcements[i].id,
- BOOL(rtcm->rtcmtypes.rtcm3_1013.announcements[i].sync),
- rtcm->rtcmtypes.rtcm3_1013.announcements[i].interval);
- break;
+ BOOL(rtcm->rtcmtypes.rtcm3_1013.
+ announcements[i].sync),
+ rtcm->rtcmtypes.rtcm3_1013.
+ announcements[i].interval);
+ break;
- case 1014:
- (void)fprintf(fp,
- " netid=%u subnetid=%u statcount=%u master=%u aux=%u lat=%f, lon=%f, alt=%f\n",
- rtcm->rtcmtypes.rtcm3_1014.network_id,
- rtcm->rtcmtypes.rtcm3_1014.subnetwork_id,
- (uint)rtcm->rtcmtypes.rtcm3_1014.stationcount,
- rtcm->rtcmtypes.rtcm3_1014.master_id,
- rtcm->rtcmtypes.rtcm3_1014.aux_id,
- rtcm->rtcmtypes.rtcm3_1014.d_lat,
- rtcm->rtcmtypes.rtcm3_1014.d_lon,
- rtcm->rtcmtypes.rtcm3_1014.d_alt);
- break;
+ case 1014:
+ (void)fprintf(fp,
+ " netid=%u subnetid=%u statcount=%u master=%u aux=%u lat=%f, lon=%f, alt=%f\n",
+ rtcm->rtcmtypes.rtcm3_1014.network_id,
+ rtcm->rtcmtypes.rtcm3_1014.subnetwork_id,
+ (uint) rtcm->rtcmtypes.rtcm3_1014.stationcount,
+ rtcm->rtcmtypes.rtcm3_1014.master_id,
+ rtcm->rtcmtypes.rtcm3_1014.aux_id,
+ rtcm->rtcmtypes.rtcm3_1014.d_lat,
+ rtcm->rtcmtypes.rtcm3_1014.d_lon,
+ rtcm->rtcmtypes.rtcm3_1014.d_alt);
+ break;
- case 1015:
- break;
+ case 1015:
+ break;
- case 1016:
- break;
+ case 1016:
+ break;
- case 1017:
- break;
+ case 1017:
+ break;
- case 1018:
- break;
+ case 1018:
+ break;
- case 1019:
- break;
+ case 1019:
+ break;
- case 1020:
- break;
+ case 1020:
+ break;
- case 1029:
- (void)fprintf(fp,
- " station_id=%u, mjd=%u sec=%u len=%u units=%u msg=%s\n",
- rtcm->rtcmtypes.rtcm3_1029.station_id,
- rtcm->rtcmtypes.rtcm3_1029.mjd,
- rtcm->rtcmtypes.rtcm3_1029.sod,
- INT(rtcm->rtcmtypes.rtcm3_1029.len),
- INT(rtcm->rtcmtypes.rtcm3_1029.unicode_units),
- (char *)rtcm->rtcmtypes.rtcm3_1029.text);
- break;
-
- default:
- (void)fprintf(fp, " Unknown content\n");
- break;
+ case 1029:
+ (void)fprintf(fp,
+ " station_id=%u, mjd=%u sec=%u len=%u units=%u msg=%s\n",
+ rtcm->rtcmtypes.rtcm3_1029.station_id,
+ rtcm->rtcmtypes.rtcm3_1029.mjd,
+ rtcm->rtcmtypes.rtcm3_1029.sod,
+ INT(rtcm->rtcmtypes.rtcm3_1029.len),
+ INT(rtcm->rtcmtypes.rtcm3_1029.unicode_units),
+ (char *)rtcm->rtcmtypes.rtcm3_1029.text);
+ break;
+
+ default:
+ (void)fprintf(fp, " Unknown content\n");
+ break;
}
#undef CODE
#undef BOOL
#undef INT
}
+/* *INDENT-ON* */
/*@ +type @*/
#endif /* RTCM104V3_ENABLE */
diff --git a/driver_sirf.c b/driver_sirf.c
index f562fc64..3769477f 100644
--- a/driver_sirf.c
+++ b/driver_sirf.c
@@ -58,117 +58,138 @@
* MID 30 Nav Lib SV State Data
* MID 31 Nav Lib Initialization data
* at 1Hz rate */
-static unsigned char enablesubframe[] = {0xa0, 0xa2, 0x00, 0x19,
- 0x80, /* MID 128 initialize Data Source */
- 0x00, 0x00, 0x00, 0x00, /* EXEF X */
- 0x00, 0x00, 0x00, 0x00, /* ECEF Y */
- 0x00, 0x00, 0x00, 0x00, /* ECEF Z */
- 0x00, 0x00, 0x00, 0x00, /* clock drift */
- 0x00, 0x00, 0x00, 0x00, /* time of week */
- 0x00, 0x00, /* week number */
- 0x0C, /* Chans 1-12 */
- /* change the next 0x10 to 0x08
- * for factory reset */
- 0x10,
- 0x00, 0x00, 0xb0, 0xb3};
-
-static unsigned char disablesubframe[] = {0xa0, 0xa2, 0x00, 0x19,
- 0x80, /* MID 128 initialize Data Source */
- 0x00, 0x00, 0x00, 0x00, /* EXEF X */
- 0x00, 0x00, 0x00, 0x00, /* ECEF Y */
- 0x00, 0x00, 0x00, 0x00, /* ECEF Z */
- 0x00, 0x00, 0x00, 0x00, /* clock drift */
- 0x00, 0x00, 0x00, 0x00, /* time of week */
- 0x00, 0x00, /* week number */
- 0x0C, /* Chans 1-12 */
-
- 0x00,
- 0x00, 0x00, 0xb0, 0xb3};
-
-static unsigned char modecontrol[] = {0xa0, 0xa2, 0x00, 0x0e,
- 0x88, /* MID 136 Mode Control */
- 0x00, 0x00, /* pad bytes */
- 0x00, /* degraded mode off */
- 0x00, 0x00, /* pad bytes */
- 0x00, 0x00, /* altitude */
- 0x00, /* altitude hold auto */
- 0x00, /* use last computed alt */
- 0x00, /* reserved */
- 0x00, /* disable degraded mode */
- 0x00, /* disable dead reckoning */
- 0x01, /* enable track smoothing */
- 0x00, 0x00, 0xb0, 0xb3};
+static unsigned char enablesubframe[] = {
+ 0xa0, 0xa2, 0x00, 0x19,
+ 0x80, /* MID 128 initialize Data Source */
+ 0x00, 0x00, 0x00, 0x00, /* EXEF X */
+ 0x00, 0x00, 0x00, 0x00, /* ECEF Y */
+ 0x00, 0x00, 0x00, 0x00, /* ECEF Z */
+ 0x00, 0x00, 0x00, 0x00, /* clock drift */
+ 0x00, 0x00, 0x00, 0x00, /* time of week */
+ 0x00, 0x00, /* week number */
+ 0x0C, /* Chans 1-12 */
+ /* change the next 0x10 to 0x08
+ * for factory reset */
+ 0x10,
+ 0x00, 0x00, 0xb0, 0xb3
+};
+
+static unsigned char disablesubframe[] = {
+ 0xa0, 0xa2, 0x00, 0x19,
+ 0x80, /* MID 128 initialize Data Source */
+ 0x00, 0x00, 0x00, 0x00, /* EXEF X */
+ 0x00, 0x00, 0x00, 0x00, /* ECEF Y */
+ 0x00, 0x00, 0x00, 0x00, /* ECEF Z */
+ 0x00, 0x00, 0x00, 0x00, /* clock drift */
+ 0x00, 0x00, 0x00, 0x00, /* time of week */
+ 0x00, 0x00, /* week number */
+ 0x0C, /* Chans 1-12 */
+
+ 0x00,
+ 0x00, 0x00, 0xb0, 0xb3
+};
+
+static unsigned char modecontrol[] = {
+ 0xa0, 0xa2, 0x00, 0x0e,
+ 0x88, /* MID 136 Mode Control */
+ 0x00, 0x00, /* pad bytes */
+ 0x00, /* degraded mode off */
+ 0x00, 0x00, /* pad bytes */
+ 0x00, 0x00, /* altitude */
+ 0x00, /* altitude hold auto */
+ 0x00, /* use last computed alt */
+ 0x00, /* reserved */
+ 0x00, /* disable degraded mode */
+ 0x00, /* disable dead reckoning */
+ 0x01, /* enable track smoothing */
+ 0x00, 0x00, 0xb0, 0xb3
+};
/* enable 1 PPS Time MID 52 *
* using Set Message Rate MID 166 */
static unsigned char enablemid52[] = {
- 0xa0, 0xa2, 0x00, 0x08,
- 0xa6, /* MID 166 */
- 0x00, /* enable/disable one message */
- 0x34, /* MID 52 */
- 0x01, /* sent once per second */
- 0x00, 0x00, 0x00, 0x00, /* unused, set to zero */
- 0x00, 0xdb, 0xb0, 0xb3};
+ 0xa0, 0xa2, 0x00, 0x08,
+ 0xa6, /* MID 166 */
+ 0x00, /* enable/disable one message */
+ 0x34, /* MID 52 */
+ 0x01, /* sent once per second */
+ 0x00, 0x00, 0x00, 0x00, /* unused, set to zero */
+ 0x00, 0xdb, 0xb0, 0xb3
+};
+
/*@ -charint @*/
#endif /* ALLOW_RECONFIGURE */
-static gps_mask_t sirf_msg_debug(unsigned char *, size_t );
-static gps_mask_t sirf_msg_errors(unsigned char *, size_t );
+static gps_mask_t sirf_msg_debug(unsigned char *, size_t);
+static gps_mask_t sirf_msg_errors(unsigned char *, size_t);
-static gps_mask_t sirf_msg_navdata(struct gps_device_t *, unsigned char *, size_t);
-static gps_mask_t sirf_msg_navsol(struct gps_device_t *, unsigned char *, size_t);
-static gps_mask_t sirf_msg_nlmd(struct gps_device_t *, unsigned char *, size_t);
-static gps_mask_t sirf_msg_ppstime(struct gps_device_t *, unsigned char *, size_t );
-static gps_mask_t sirf_msg_svinfo(struct gps_device_t *, unsigned char *, size_t);
+static gps_mask_t sirf_msg_navdata(struct gps_device_t *, unsigned char *,
+ size_t);
+static gps_mask_t sirf_msg_navsol(struct gps_device_t *, unsigned char *,
+ size_t);
+static gps_mask_t sirf_msg_nlmd(struct gps_device_t *, unsigned char *,
+ size_t);
+static gps_mask_t sirf_msg_ppstime(struct gps_device_t *, unsigned char *,
+ size_t);
+static gps_mask_t sirf_msg_svinfo(struct gps_device_t *, unsigned char *,
+ size_t);
#ifdef ALLOW_RECONFIGURE
-static gps_mask_t sirf_msg_swversion(struct gps_device_t *, unsigned char *, size_t);
-static gps_mask_t sirf_msg_sysparam(struct gps_device_t *, unsigned char *, size_t);
+static gps_mask_t sirf_msg_swversion(struct gps_device_t *, unsigned char *,
+ size_t);
+static gps_mask_t sirf_msg_sysparam(struct gps_device_t *, unsigned char *,
+ size_t);
#endif /* ALLOW_RECONFIGURE */
-static gps_mask_t sirf_msg_ublox(struct gps_device_t *, unsigned char *, size_t );
+static gps_mask_t sirf_msg_ublox(struct gps_device_t *, unsigned char *,
+ size_t);
-static bool sirf_write(int fd, unsigned char *msg) {
- unsigned int crc;
- size_t i, len;
- bool ok;
+static bool sirf_write(int fd, unsigned char *msg)
+{
+ unsigned int crc;
+ size_t i, len;
+ bool ok;
- len = (size_t)((msg[2] << 8) | msg[3]);
+ len = (size_t) ((msg[2] << 8) | msg[3]);
- /* calculate CRC */
- crc = 0;
- for (i = 0; i < len; i++)
+ /* calculate CRC */
+ crc = 0;
+ for (i = 0; i < len; i++)
crc += (int)msg[4 + i];
- crc &= 0x7fff;
-
- /* enter CRC after payload */
- msg[len + 4] = (unsigned char)((crc & 0xff00) >> 8);
- msg[len + 5] = (unsigned char)( crc & 0x00ff);
-
- gpsd_report(LOG_IO, "SiRF: Writing control type %02x:%s\n", msg[4],
- gpsd_hexdump_wrapper(msg, len+8, LOG_IO));
- ok = (write(fd, msg, len+8) == (ssize_t)(len+8));
- if ( !ok ) {
- gpsd_report(LOG_WARN, "SiRF: Writing error.\n");
- }
- (void)tcdrain(fd);
- return(ok);
+ crc &= 0x7fff;
+
+ /* enter CRC after payload */
+ msg[len + 4] = (unsigned char)((crc & 0xff00) >> 8);
+ msg[len + 5] = (unsigned char)(crc & 0x00ff);
+
+ gpsd_report(LOG_IO, "SiRF: Writing control type %02x:%s\n", msg[4],
+ gpsd_hexdump_wrapper(msg, len + 8, LOG_IO));
+ ok = (write(fd, msg, len + 8) == (ssize_t) (len + 8));
+ if (!ok) {
+ gpsd_report(LOG_WARN, "SiRF: Writing error.\n");
+ }
+ (void)tcdrain(fd);
+ return (ok);
}
#ifdef ALLOW_CONTROLSEND
-static ssize_t sirf_control_send(struct gps_device_t *session, char *msg, size_t len) {
+static ssize_t sirf_control_send(struct gps_device_t *session, char *msg,
+ size_t len)
+{
/*@ +charint +matchanyintegral -initallelements -mayaliasunique @*/
session->msgbuf[0] = (char)0xa0;
session->msgbuf[1] = (char)0xa2;
session->msgbuf[2] = (len >> 8) & 0xff;
session->msgbuf[3] = len & 0xff;
- memcpy(session->msgbuf+4, msg, len);
+ memcpy(session->msgbuf + 4, msg, len);
session->msgbuf[len + 6] = (char)0xb0;
session->msgbuf[len + 7] = (char)0xb3;
session->msgbuflen = len + 8;
+ /* *INDENT-OFF* */
return sirf_write(session->gpsdata.gps_fd,
- (unsigned char *)session->msgbuf) ? (int)session->msgbuflen : -1;
+ (unsigned char *)session->msgbuf) ? (int)session->msgbuflen : -1;
+ /* *INDENT-ON* */
/*@ -charint -matchanyintegral +initallelements +mayaliasunique @*/
}
#endif /* ALLOW_CONTROLSEND */
@@ -178,20 +199,22 @@ static bool sirf_speed(int ttyfd, speed_t speed, char parity, int stopbits)
/* change speed in binary mode */
{
/*@ +charint @*/
- static unsigned char msg[] = {0xa0, 0xa2, 0x00, 0x09,
- 0x86, /* byte 4:
- * Set Binary Serial Port
- * MID 134 */
- 0x00, 0x00, 0x12, 0xc0, /* bytes 5-8: 4800 bps */
- 0x08, /* byte 9: 8 data bits */
- 0x01, /* byte 10: 1 stop bit */
- 0x00, /* byte 11: no parity */
- 0x00, /* byte 12: reserved pad */
- 0x00, 0x00, 0xb0, 0xb3};
+ static unsigned char msg[] = {
+ 0xa0, 0xa2, 0x00, 0x09,
+ 0x86, /* byte 4:
+ * Set Binary Serial Port
+ * MID 134 */
+ 0x00, 0x00, 0x12, 0xc0, /* bytes 5-8: 4800 bps */
+ 0x08, /* byte 9: 8 data bits */
+ 0x01, /* byte 10: 1 stop bit */
+ 0x00, /* byte 11: no parity */
+ 0x00, /* byte 12: reserved pad */
+ 0x00, 0x00, 0xb0, 0xb3
+ };
/*@ -charint @*/
gpsd_report(LOG_PROG, "SiRF: sirf_speed(%d,%c,%d)\n",
- speed, parity, stopbits);
- if ( 9600 > speed ) {
+ speed, parity, stopbits);
+ if (9600 > speed) {
gpsd_report(LOG_WARN, "NTPD: SiRF may lag at less than 9600bps\n");
}
@@ -221,55 +244,56 @@ static bool sirf_to_nmea(int ttyfd, speed_t speed)
/* switch from binary to NMEA at specified baud */
{
/*@ +charint @*/
- static unsigned char msg[] = {0xa0, 0xa2, 0x00, 0x18,
- 0x81, 0x02,
- 0x01, 0x01, /* GGA */
- 0x00, 0x00, /* suppress GLL */
- 0x01, 0x01, /* GSA */
- 0x05, 0x01, /* GSV */
- 0x01, 0x01, /* RMC */
- 0x00, 0x00, /* suppress VTG */
- 0x00, 0x01, /* suppress MSS */
- 0x00, 0x01, /* suppress EPE */
- 0x00, 0x01, /* suppress EPE */
- 0x00, 0x01, /* suppress ZDA */
- 0x00, 0x00, /* unused */
- 0x12, 0xc0, /* 4800 bps */
- 0xb0, 0xb3};
- /*@ -charint @*/
-
- msg[26] = (unsigned char)HI(speed);
- msg[27] = (unsigned char)LO(speed);
- return (sirf_write(ttyfd, msg));
+ static unsigned char msg[] = { 0xa0, 0xa2, 0x00, 0x18,
+ 0x81, 0x02,
+ 0x01, 0x01, /* GGA */
+ 0x00, 0x00, /* suppress GLL */
+ 0x01, 0x01, /* GSA */
+ 0x05, 0x01, /* GSV */
+ 0x01, 0x01, /* RMC */
+ 0x00, 0x00, /* suppress VTG */
+ 0x00, 0x01, /* suppress MSS */
+ 0x00, 0x01, /* suppress EPE */
+ 0x00, 0x01, /* suppress EPE */
+ 0x00, 0x01, /* suppress ZDA */
+ 0x00, 0x00, /* unused */
+ 0x12, 0xc0, /* 4800 bps */
+ 0xb0, 0xb3
+ };
+ /*@ -charint @*/
+
+ msg[26] = (unsigned char)HI(speed);
+ msg[27] = (unsigned char)LO(speed);
+ return (sirf_write(ttyfd, msg));
}
static void sirfbin_mode(struct gps_device_t *session, int mode)
{
char parity = '0';
if (mode == MODE_NMEA) {
- (void)sirf_to_nmea(session->gpsdata.gps_fd,session->gpsdata.dev.baudrate);
+ (void)sirf_to_nmea(session->gpsdata.gps_fd,
+ session->gpsdata.dev.baudrate);
} else if (mode == MODE_BINARY) {
- switch ( session->gpsdata.dev.parity) {
+ switch (session->gpsdata.dev.parity) {
default:
case 'N':
- parity = '0';
- break;
+ parity = '0';
+ break;
case 'O':
- parity = '1';
- break;
+ parity = '1';
+ break;
case 'E':
- parity = '2';
- break;
-
+ parity = '2';
+ break;
+
}
// gpsd only supports 8[NO]1 or 7[EO]2
// thus the strange us of stopbits
(void)nmea_send(session,
"$PSRF100,0,%d,%d,%d,%c",
session->gpsdata.dev.baudrate,
- 9-session->gpsdata.dev.stopbits,
- session->gpsdata.dev.stopbits,
- parity);
+ 9 - session->gpsdata.dev.stopbits,
+ session->gpsdata.dev.stopbits, parity);
(void)usleep(333); /* guessed settling time */
session->gpsdata.dev.driver_mode = MODE_BINARY;
}
@@ -288,7 +312,7 @@ static ssize_t sirf_get(struct gps_device_t *session)
(void)gpsd_switch_driver(session, "Generic NMEA");
} else {
/* should never happen */
- gpsd_report(LOG_PROG, "SiRF: Unexpected packet type %d\n",
+ gpsd_report(LOG_PROG, "SiRF: Unexpected packet type %d\n",
session->packet.type);
(void)gpsd_switch_driver(session, "Generic NMEA");
}
@@ -298,27 +322,26 @@ static ssize_t sirf_get(struct gps_device_t *session)
static gps_mask_t sirf_msg_debug(unsigned char *buf, size_t len)
{
- char msgbuf[MAX_PACKET_LENGTH*3 + 2];
+ char msgbuf[MAX_PACKET_LENGTH * 3 + 2];
int i;
bzero(msgbuf, (int)sizeof(msgbuf));
/*@ +charint @*/
- if (0xe1 == buf[0]) { /* Development statistics messages */
+ if (0xe1 == buf[0]) { /* Development statistics messages */
for (i = 2; i < (int)len; i++)
- (void)snprintf(msgbuf+strlen(msgbuf),
- sizeof(msgbuf)-strlen(msgbuf),
- "%c", buf[i]^0xff);
+ (void)snprintf(msgbuf + strlen(msgbuf),
+ sizeof(msgbuf) - strlen(msgbuf),
+ "%c", buf[i] ^ 0xff);
gpsd_report(LOG_PROG, "SiRF: DEV 0xe1: %s\n", msgbuf);
- } else if (0xff == (unsigned char)buf[0]) { /* Debug messages */
+ } else if (0xff == (unsigned char)buf[0]) { /* Debug messages */
for (i = 1; i < (int)len; i++)
if (isprint(buf[i]))
- (void)snprintf(msgbuf+strlen(msgbuf),
- sizeof(msgbuf)-strlen(msgbuf),
- "%c", buf[i]);
+ (void)snprintf(msgbuf + strlen(msgbuf),
+ sizeof(msgbuf) - strlen(msgbuf), "%c", buf[i]);
else
- (void)snprintf(msgbuf+strlen(msgbuf),
- sizeof(msgbuf)-strlen(msgbuf),
+ (void)snprintf(msgbuf + strlen(msgbuf),
+ sizeof(msgbuf) - strlen(msgbuf),
"\\x%02x", (unsigned int)buf[i]);
gpsd_report(LOG_PROG, "SiRF: DBG 0xff: %s\n", msgbuf);
}
@@ -330,55 +353,56 @@ static gps_mask_t sirf_msg_errors(unsigned char *buf, size_t len UNUSED)
{
switch (getbeuw(buf, 1)) {
case 2:
- gpsd_report(LOG_PROG,
- "SiRF: EID 0x0a type 2: Subframe %u error on PRN %u\n",
+ gpsd_report(LOG_PROG,
+ "SiRF: EID 0x0a type 2: Subframe %u error on PRN %u\n",
getbeul(buf, 9), getbeul(buf, 5));
break;
case 4107:
- gpsd_report(LOG_PROG,
- "SiRF: EID 0x0a type 4107: neither KF nor LSQ fix.\n");
+ gpsd_report(LOG_PROG,
+ "SiRF: EID 0x0a type 4107: neither KF nor LSQ fix.\n");
break;
default:
- gpsd_report(LOG_PROG, "SiRF: EID 0x0a: Error MID %d\n",
- getbeuw(buf, 1));
+ gpsd_report(LOG_PROG, "SiRF: EID 0x0a: Error MID %d\n",
+ getbeuw(buf, 1));
break;
}
return 0;
}
/* Navigation Library Measurement Data MID 28 */
-static gps_mask_t sirf_msg_nlmd(struct gps_device_t *session,
- unsigned char *buf, size_t len)
+static gps_mask_t sirf_msg_nlmd(struct gps_device_t *session,
+ unsigned char *buf, size_t len)
{
double gps_tow = 0.0;
if (len != 56)
return 0;
-
+
/* oh barf, SiRF claims to be IEEE754 but supports two
* different double orders, neither IEEE754 */
/* Todo - decode the time, since this is the first MID with a
* good time stamp this will be good for ntpshm time */
- gpsd_report(LOG_PROG, "SiRF: MID 0x1c, NLMD, gps_tow: %f, %s\n",
- (double)gps_tow,
- gpsd_hexdump_wrapper( &gps_tow, 8, LOG_PROG));
+ gpsd_report(LOG_PROG, "SiRF: MID 0x1c, NLMD, gps_tow: %f, %s\n",
+ (double)gps_tow, gpsd_hexdump_wrapper(&gps_tow, 8, LOG_PROG));
return 0;
}
#ifdef ALLOW_RECONFIGURE
-static gps_mask_t sirf_msg_swversion(struct gps_device_t *session, unsigned char *buf, size_t len)
+static gps_mask_t sirf_msg_swversion(struct gps_device_t *session,
+ unsigned char *buf, size_t len)
{
double fv;
if (len < 20)
return 0;
- (void)strlcpy(session->subtype, (char *)buf+1, sizeof(session->subtype));
- fv = atof((char *)(buf+1));
+ (void)strlcpy(session->subtype, (char *)buf + 1,
+ sizeof(session->subtype));
+ fv = atof((char *)(buf + 1));
if (fv < 231) {
session->driver.sirf.driverstate |= SIRF_LT_231;
if (fv > 200)
@@ -391,10 +415,10 @@ static gps_mask_t sirf_msg_swversion(struct gps_device_t *session, unsigned char
session->driver.sirf.driverstate |= SIRF_GE_232;
session->context->valid |= LEAP_SECOND_VALID;
}
- if (strstr((char *)(buf+1), "ES"))
+ if (strstr((char *)(buf + 1), "ES"))
gpsd_report(LOG_INF, "SiRF: Firmware has XTrac capability\n");
- gpsd_report(LOG_PROG, "SiRF: fv: %0.2f, Driver state flags are: %0x\n",
- fv, session->driver.sirf.driverstate);
+ gpsd_report(LOG_PROG, "SiRF: fv: %0.2f, Driver state flags are: %0x\n",
+ fv, session->driver.sirf.driverstate);
#ifdef NTPSHM_ENABLE
session->driver.sirf.time_seen = 0;
#endif /* NTPSHM_ENABLE */
@@ -402,39 +426,73 @@ static gps_mask_t sirf_msg_swversion(struct gps_device_t *session, unsigned char
gpsd_report(LOG_PROG, "SiRF: Enabling subframe transmission...\n");
(void)sirf_write(session->gpsdata.gps_fd, enablesubframe);
}
- gpsd_report(LOG_DATA, "SiRF: FV 0x06: subtype='%s' mask={DEVICEID}\n",
- session->subtype);
- return DEVICEID_SET;
+ gpsd_report(LOG_DATA, "SiRF: FV 0x06: subtype='%s' mask={DEVICEID}\n",
+ session->subtype);
+ return DEVICEID_IS;
}
#endif /* ALLOW_RECONFIGURE */
-static gps_mask_t sirf_msg_navdata(struct gps_device_t *session, unsigned char *buf, size_t len)
+static gps_mask_t sirf_msg_navdata(struct gps_device_t *session,
+ unsigned char *buf, size_t len)
{
unsigned int i, words[10], chan, svid;
+ unsigned int preamble, parity;
if (len != 43)
return 0;
chan = (unsigned int)getub(buf, 1);
svid = (unsigned int)getub(buf, 2);
+
+ /* Data is in ICD 200d format, as munged by Sirf */
+ /* ICD == Interface Control Document */
+ /* download from http://www.navcen.uscg.gov/GPS/ICD200c.htm */
+ /* FIXME, the data is flakey, need to check 'parity' which is really a
+ * hamming code */
+
+ /* ICD words are really 30 bits, and their LSB is the LSB of the 32 bit
+ * int transporting them. The right most 6 bits are 'parity' and the top
+ * 2 bits are the bottom two parity bits from the previous word. Mask and
+ * shift these away to leave us with 3 data bytes per word */
+
+ /* gotta do the first word by hand, D29* and D30* seem missing */
words[0] = ((unsigned int)getbeul(buf, 3) & 0x3fffffff) >> 6;
- words[1] = ((unsigned int)getbeul(buf, 7) & 0x3fffffff) >> 6;
- words[2] = ((unsigned int)getbeul(buf, 11) & 0x3fffffff) >> 6;
- words[3] = ((unsigned int)getbeul(buf, 15) & 0x3fffffff) >> 6;
- words[4] = ((unsigned int)getbeul(buf, 19) & 0x3fffffff) >> 6;
- words[5] = ((unsigned int)getbeul(buf, 23) & 0x3fffffff) >> 6;
- words[6] = ((unsigned int)getbeul(buf, 27) & 0x3fffffff) >> 6;
- words[7] = ((unsigned int)getbeul(buf, 31) & 0x3fffffff) >> 6;
- words[8] = ((unsigned int)getbeul(buf, 35) & 0x3fffffff) >> 6;
- words[9] = ((unsigned int)getbeul(buf, 39) & 0x3fffffff) >> 6;
- gpsd_report(LOG_PROG, "SiRF: 50BPS 0x08\n");
-
- words[0] &= 0xff0000;
- if (words[0] != 0x8b0000 && words[0] != 0x740000)
- return ERROR_SET;
- if (words[0] == 0x740000)
- for (i = 1; i < 10; i++)
- words[i] ^= 0xffffff;
+ preamble = words[0] >> 16;
+ if (preamble == 0x8b) {
+ preamble ^= 0xff;
+ words[0] ^= 0x3fffC0;
+ }
+
+ for (i = 1; i < 10; i++) {
+ int invert;
+ words[i] = (unsigned int)getbeul(buf, 4 * i + 3);
+ /* D30* says invert */
+ invert = (words[i] & 0x40000000) ? 1 : 0;
+ /* inverted data, invert it back */
+ if (invert) {
+ words[i] ^= 0x3fffffC0;
+ }
+ parity = isgps_parity( words[i] ) ;
+ if ( parity != (words[i] & 0x3F) ) {
+ gpsd_report(LOG_PROG,
+ "SiRF: 50BPS parity fail words[%d] 0x%x != 0x%x\n", i,
+ parity, ( words[i] & 0x1));
+ return 0;
+ }
+ words[i] = (words[i] & 0x3fffffff) >> 6;
+ }
+ gpsd_report(LOG_PROG, "SiRF: 50BPS 0x08: %2d %2d "
+ "%06x %06x %06x %06x %06x %06x %06x %06x %06x %06x\n",
+ chan, svid,
+ words[0], words[1], words[2], words[3], words[4],
+ words[5], words[6], words[7], words[8], words[9]);
+ // Look for the preamble in the first byte OR its complement
+ if (preamble != 0x74) {
+ gpsd_report(LOG_WARN, "SiRF: 50BPS bad premable: 0x%x header 0x%x\n"
+ , preamble, words[0]);
+ return 0;
+ }
+
gpsd_interpret_subframe(session, words);
#ifdef ALLOW_RECONFIGURE
@@ -448,76 +506,122 @@ static gps_mask_t sirf_msg_navdata(struct gps_device_t *session, unsigned char *
#define SIRF_CHANNELS 12 /* max channels allowed in SiRF format */
-static gps_mask_t sirf_msg_svinfo(struct gps_device_t *session, unsigned char *buf, size_t len)
+static gps_mask_t sirf_msg_svinfo(struct gps_device_t *session,
+ unsigned char *buf, size_t len)
{
- int st, i, j, cn;
+ int st, i, j, cn;
+ gps_mask_t mask = 0;
if (len != 188)
return 0;
gpsd_zero_satellites(&session->gpsdata);
- /*@ ignore @*//*@ splint is confused @*/
+ /*@ ignore @*//*@ splint is confused @ */
session->gpsdata.skyview_time
- = gpstime_to_unix(getbesw(buf, 1), getbeul(buf, 3)*1e-2) - session->context->leap_seconds;
+ =
+ gpstime_to_unix(getbesw(buf, 1),
+ getbeul(buf,
+ 3) * 1e-2) - session->context->leap_seconds;
/*@ end @*/
for (i = st = 0; i < SIRF_CHANNELS; i++) {
int off = 8 + 15 * i;
bool good;
- session->gpsdata.PRN[st] = (int)getub(buf, off);
- session->gpsdata.azimuth[st] = (int)(((unsigned)getub(buf, off+1)*3)/2.0);
- session->gpsdata.elevation[st] = (int)((unsigned)getub(buf, off+2)/2.0);
+ session->gpsdata.PRN[st] = (int)getub(buf, off);
+ session->gpsdata.azimuth[st] =
+ (int)(((unsigned)getub(buf, off + 1) * 3) / 2.0);
+ session->gpsdata.elevation[st] =
+ (int)((unsigned)getub(buf, off + 2) / 2.0);
cn = 0;
for (j = 0; j < 10; j++)
- cn += (int)getub(buf, off+5+j);
+ cn += (int)getub(buf, off + 5 + j);
- session->gpsdata.ss[st] = (float)(cn/10.0);
- good = session->gpsdata.PRN[st]!=0 &&
- session->gpsdata.azimuth[st]!=0 &&
- session->gpsdata.elevation[st]!=0;
+ session->gpsdata.ss[st] = (float)(cn / 10.0);
+ good = session->gpsdata.PRN[st] != 0 &&
+ session->gpsdata.azimuth[st] != 0 &&
+ session->gpsdata.elevation[st] != 0;
#ifdef __UNUSED__
- gpsd_report(LOG_PROG,
- "SiRF: PRN=%2d El=%3.2f Az=%3.2f ss=%3d stat=%04x %c\n",
+ gpsd_report(LOG_PROG,
+ "SiRF: PRN=%2d El=%3.2f Az=%3.2f ss=%3d stat=%04x %c\n",
getub(buf, off),
- getub(buf, off+2)/2.0,
- (getub(buf, off+1)*3)/2.0,
- cn/10,
- getbeuw(buf, off+3),
- good ? '*' : ' ');
+ getub(buf, off + 2) / 2.0,
+ (getub(buf, off + 1) * 3) / 2.0,
+ cn / 10, getbeuw(buf, off + 3), good ? '*' : ' ');
#endif /* UNUSED */
- if (good!=0)
+ if (good != 0)
st += 1;
}
session->gpsdata.satellites_visible = st;
#ifdef NTPSHM_ENABLE
if (st <= 3) {
- gpsd_report(LOG_PROG,
- "SiRF: NTPD not enough satellites seen: %d\n", st);
- } else {
- if ( 0 == (session->driver.sirf.time_seen & TIME_SEEN_GPS_1)) {
+ gpsd_report(LOG_PROG,
+ "SiRF: NTPD not enough satellites seen: %d\n", st);
+ } else {
+ /* SiRF says if 3 sats in view the time is good */
+ if (0 == (session->driver.sirf.time_seen & TIME_SEEN_GPS_1)) {
gpsd_report(LOG_RAW, "SiRF: NTPD just seen GPS_1\n");
}
- gpsd_report(LOG_PROG,
- "SiRF: NTPD valid time MID 0x04, seen=0x%02x, time:%.2lf, leap:%d\n",
- session->driver.sirf.time_seen,
- session->gpsdata.skyview_time,
- session->context->leap_seconds);
+ gpsd_report(LOG_PROG,
+ "SiRF: NTPD valid time MID 0x04, seen=0x%02x, time:%.2lf, leap:%d\n",
+ session->driver.sirf.time_seen,
+ session->gpsdata.skyview_time,
+ session->context->leap_seconds);
session->driver.sirf.time_seen |= TIME_SEEN_GPS_1;
-#if __UNUSED__
- /* this time stamp, at 4800bps, is so close to 1 sec old as to
- * be confusing to ntpshm_put(), so ignore */
- if (session->context->enable_ntpshm) {
- // fudge valid at 4800bps
- (void)ntpshm_put(session,session->gpsdata.skyview_time, 1.040);
- }
-#endif
+ mask |= TIME_IS;
+ /*
+ * This time stamp, at 4800bps, is so close to 1 sec old as to
+ * be confusing to ntpd, but ntpshm_put() will ignore it if a better
+ * time already seen
+ */
}
#endif /* NTPSHM_ENABLE */
gpsd_report(LOG_DATA, "SiRF: MTD 0x04: visible=%d mask={SATELLITE}\n",
- session->gpsdata.satellites_visible);
- return SATELLITE_SET;
+ session->gpsdata.satellites_visible);
+ return SATELLITE_IS | mask;
+}
+
+#ifdef NTPSHM_ENABLE
+static double sirf_ntp_offset(struct gps_device_t *session)
+/* return NTP time-offset fudge factor for this device */
+{
+ /* we need to have seen UTC time with a valid leap-year offset */
+ if ((session->driver.sirf.time_seen & TIME_SEEN_UTC_2) != 0)
+ return NAN;
+
+ /* the PPS time message */
+ if (strcmp(session->gpsdata.tag, "MID52") == 0)
+ return 0.3;
+
+ /* uBlox EMND message */
+ if (strcmp(session->gpsdata.tag, "MID98") == 0)
+ return 0.570;
+
+#ifdef __UNUSED__
+ /* geodetic-data message */
+ if (strcmp(session->gpsdata.tag, "MID41") == 0)
+ return 0.570;
+#endif /* __UNUSED__ */
+
+ /* the Navigation Solution message */
+ if (strcmp(session->gpsdata.tag, "MID2") == 0)
+ switch (session->gpsdata.dev.baudrate) {
+ default:
+ return 0.704; /* WAG */
+ case 4800:
+ return 0.704; /* fudge valid at 4800bps */
+ case 9600:
+ return 0.688;
+ case 19200:
+ return 0.484;
+ case 38400:
+ return 0.845; /* 0.388; ?? */
+ }
+
+ return NAN;
}
+#endif /* NTPSHM_ENABLE */
-static gps_mask_t sirf_msg_navsol(struct gps_device_t *session, unsigned char *buf, size_t len)
+static gps_mask_t sirf_msg_navsol(struct gps_device_t *session,
+ unsigned char *buf, size_t len)
{
int i;
unsigned short navtype;
@@ -527,13 +631,14 @@ static gps_mask_t sirf_msg_navsol(struct gps_device_t *session, unsigned char *b
return 0;
session->gpsdata.satellites_used = (int)getub(buf, 28);
- memset(session->gpsdata.used,0,sizeof(session->gpsdata.used));
+ memset(session->gpsdata.used, 0, sizeof(session->gpsdata.used));
for (i = 0; i < SIRF_CHANNELS; i++)
- session->gpsdata.used[i] = (int)getub(buf, 29+i);
+ session->gpsdata.used[i] = (int)getub(buf, 29 + i);
/* position/velocity is bytes 1-18 */
ecef_to_wgs84fix(&session->newdata, &session->gpsdata.separation,
- getbesl(buf, 1)*1.0, getbesl(buf, 5)*1.0, getbesl(buf, 9)*1.0,
- getbesw(buf, 13)/8.0, getbesw(buf, 15)/8.0, getbesw(buf, 17)/8.0);
+ getbesl(buf, 1) * 1.0, getbesl(buf, 5) * 1.0,
+ getbesl(buf, 9) * 1.0, getbesw(buf, 13) / 8.0,
+ getbesw(buf, 15) / 8.0, getbesw(buf, 17) / 8.0);
/* fix status is byte 19 */
navtype = (unsigned short)getub(buf, 19);
session->gpsdata.status = STATUS_NO_FIX;
@@ -547,71 +652,45 @@ static gps_mask_t sirf_msg_navsol(struct gps_device_t *session, unsigned char *b
else if (session->gpsdata.status != 0)
session->newdata.mode = MODE_2D;
if (session->newdata.mode == MODE_3D)
- mask |= ALTITUDE_SET | CLIMB_SET;
- gpsd_report(LOG_PROG,
- "SiRF: MND 0x02: Navtype = 0x%0x, Status = %d, mode = %d\n",
- navtype,session->gpsdata.status,session->newdata.mode);
+ mask |= ALTITUDE_IS | CLIMB_IS;
+ gpsd_report(LOG_PROG,
+ "SiRF: MND 0x02: Navtype = 0x%0x, Status = %d, mode = %d\n",
+ navtype, session->gpsdata.status, session->newdata.mode);
/* byte 20 is HDOP, see below */
/* byte 21 is "mode 2", not clear how to interpret that */
- /*@ ignore @*//*@ splint is confused @*/
+ /*@ ignore @*//*@ splint is confused @ */
session->newdata.time =
- gpstime_to_unix(getbesw(buf, 22), getbeul(buf, 24)*1e-2) -
+ gpstime_to_unix(getbesw(buf, 22), getbeul(buf, 24) * 1e-2) -
session->context->leap_seconds;
/*@ end @*/
#ifdef NTPSHM_ENABLE
if (session->newdata.mode <= MODE_NO_FIX) {
- gpsd_report(LOG_PROG, "SiRF: NTPD no fix, mode: %d\n",
- session->newdata.mode);
+ gpsd_report(LOG_PROG, "SiRF: NTPD no fix, mode: %d\n",
+ session->newdata.mode);
} else {
if (0 == (session->driver.sirf.time_seen & TIME_SEEN_GPS_2)) {
gpsd_report(LOG_PROG, "SiRF: NTPD SEEN_GPS_2\n");
}
- gpsd_report(LOG_PROG,
- "SiRF: NTPD valid time MID 0x02, seen=0x%02x, time;%.2lf, leap:%d\n",
- session->driver.sirf.time_seen,
- session->newdata.time,
- session->context->leap_seconds);
+ gpsd_report(LOG_PROG,
+ "SiRF: NTPD valid time MID 0x02, seen=0x%02x, time;%.2lf, leap:%d\n",
+ session->driver.sirf.time_seen,
+ session->newdata.time, session->context->leap_seconds);
session->driver.sirf.time_seen |= TIME_SEEN_GPS_2;
- if (session->context->enable_ntpshm) {
- float fudge;
- // fudge valid at 4800bps
- switch( session->gpsdata.dev.baudrate ) {
- default:
- fudge = 0.704; /* WAG */
- break;
- case 4800:
- fudge = 0.704;
- break;
- case 9600:
- fudge = 0.688;
- break;
- case 19200:
- fudge = 0.484;
- break;
- case 38400:
- fudge = 0.845; /* 0.388; ?? */
- break;
- }
- (void)ntpshm_put(session, session->newdata.time, fudge);
- }
}
#endif /* NTPSHM_ENABLE */
/* fix quality data */
clear_dop(&session->gpsdata.dop);
- session->gpsdata.dop.hdop = (double)getub(buf, 20)/5.0;
- mask |= TIME_SET | LATLON_SET | ALTITUDE_SET | TRACK_SET | SPEED_SET | STATUS_SET | MODE_SET | DOP_SET | USED_SET;
- gpsd_report(LOG_DATA,
+ session->gpsdata.dop.hdop = (double)getub(buf, 20) / 5.0;
+ mask |=
+ TIME_IS | LATLON_IS | ALTITUDE_IS | TRACK_IS | SPEED_IS | STATUS_IS |
+ MODE_IS | DOP_IS | USED_IS;
+ gpsd_report(LOG_DATA,
"SiRF: MND 0x02: time=%.2f lat=%.2f lon=%.2f alt=%.2f track=%.2f speed=%.2f mode=%d status=%d hdop=%.2f used=%d mask=%s\n",
- session->newdata.time,
- session->newdata.latitude,
- session->newdata.longitude,
- session->newdata.altitude,
- session->newdata.track,
- session->newdata.speed,
- session->newdata.mode,
- session->gpsdata.status,
- session->gpsdata.dop.hdop,
- session->gpsdata.satellites_used,
+ session->newdata.time, session->newdata.latitude,
+ session->newdata.longitude, session->newdata.altitude,
+ session->newdata.track, session->newdata.speed,
+ session->newdata.mode, session->gpsdata.status,
+ session->gpsdata.dop.hdop, session->gpsdata.satellites_used,
gpsd_maskdump(mask));
return mask;
}
@@ -641,7 +720,8 @@ static gps_mask_t sirf_msg_navsol(struct gps_device_t *session, unsigned char *b
Code left in place in case we need to reverse this decision.
***************************************************************************/
-static gps_mask_t sirf_msg_geodetic(struct gps_device_t *session, unsigned char *buf, size_t len)
+static gps_mask_t sirf_msg_geodetic(struct gps_device_t *session,
+ unsigned char *buf, size_t len)
{
unsigned short navtype;
gps_mask_t mask = 0;
@@ -651,7 +731,7 @@ static gps_mask_t sirf_msg_geodetic(struct gps_device_t *session, unsigned char
return 0;
session->gpsdata.sentence_length = 91;
- (void)strlcpy(session->gpsdata.tag, "GND",MAXTAGLEN+1);
+ (void)strlcpy(session->gpsdata.tag, "GND", MAXTAGLEN + 1);
navtype = (unsigned short)getbeuw(buf, 3);
session->gpsdata.status = STATUS_NO_FIX;
@@ -665,29 +745,30 @@ static gps_mask_t sirf_msg_geodetic(struct gps_device_t *session, unsigned char
session->newdata.mode = MODE_3D;
else if (session->gpsdata.status)
session->newdata.mode = MODE_2D;
- gpsd_report(LOG_PROG,
- "SiRF: GND 0x29: Navtype = 0x%0x, Status = %d, mode = %d\n",
- navtype, session->gpsdata.status, session->newdata.mode);
- mask |= STATUS_SET | MODE_SET;
-
- session->newdata.latitude = getbesl(buf, 23)*1e-7;
- session->newdata.longitude = getbesl(buf, 27)*1e-7;
- if (session->newdata.latitude!=0 && session->newdata.latitude!=0)
- mask |= LATLON_SET;
-
- if ((eph = getbesl(buf, 50)*1e-2) > 0) {
- session->newdata.epx = session->newdata.epy = eph/sqrt(2);
- mask |= HERR_SET;
+ gpsd_report(LOG_PROG,
+ "SiRF: GND 0x29: Navtype = 0x%0x, Status = %d, mode = %d\n",
+ navtype, session->gpsdata.status, session->newdata.mode);
+ mask |= STATUS_IS | MODE_IS;
+
+ session->newdata.latitude = getbesl(buf, 23) * 1e-7;
+ session->newdata.longitude = getbesl(buf, 27) * 1e-7;
+ if (session->newdata.latitude != 0 && session->newdata.latitude != 0)
+ mask |= LATLON_IS;
+
+ if ((eph = getbesl(buf, 50) * 1e-2) > 0) {
+ session->newdata.epx = session->newdata.epy = eph / sqrt(2);
+ mask |= HERR_IS;
}
- if ((session->newdata.epv = getbesl(buf, 54)*1e-2) > 0)
- mask |= VERR_SET;
- if ((session->newdata.eps = getbesw(buf, 62)*1e-2) > 0)
- mask |= SPEEDERR_SET;
+ if ((session->newdata.epv = getbesl(buf, 54) * 1e-2) > 0)
+ mask |= VERR_IS;
+ if ((session->newdata.eps = getbesw(buf, 62) * 1e-2) > 0)
+ mask |= SPEEDERR_IS;
/* HDOP should be available at byte 89, but in 231 it's zero. */
//session->gpsdata.dop.hdop = (unsigned int)getub(buf, 89) * 0.2;
- if ((session->newdata.mode > MODE_NO_FIX) && (session->driver.sirf.driverstate & SIRF_GE_232)) {
+ if ((session->newdata.mode > MODE_NO_FIX)
+ && (session->driver.sirf.driverstate & SIRF_GE_232)) {
struct tm unpacked_date;
double subseconds;
/*
@@ -722,51 +803,48 @@ static gps_mask_t sirf_msg_geodetic(struct gps_device_t *session, unsigned char
* Documentation of this field was corrected in the 1.6 version
* of the protocol manual.
*/
- unpacked_date.tm_year = (int)getbeuw(buf, 11)-1900;
- unpacked_date.tm_mon = (int)getub(buf, 13)-1;
+ unpacked_date.tm_year = (int)getbeuw(buf, 11) - 1900;
+ unpacked_date.tm_mon = (int)getub(buf, 13) - 1;
unpacked_date.tm_mday = (int)getub(buf, 14);
unpacked_date.tm_hour = (int)getub(buf, 15);
unpacked_date.tm_min = (int)getub(buf, 16);
unpacked_date.tm_sec = 0;
- subseconds = getbeuw(buf, 17)*1e-3;
+ subseconds = getbeuw(buf, 17) * 1e-3;
/*@ -compdef -unrecog */
- session->newdata.time =
- (double)timegm(&unpacked_date)+subseconds;
+ session->newdata.time = (double)timegm(&unpacked_date) + subseconds;
/*@ +compdef +unrecog */
- gpsd_report(LOG_PROG, "SiRF: GND 0x29 UTC: %lf\n",
- session->newdata.time);
+ gpsd_report(LOG_PROG, "SiRF: GND 0x29 UTC: %lf\n",
+ session->newdata.time);
#ifdef NTPSHM_ENABLE
- if (session->newdata.mode <= MODE_NO_FIX
- gpsd_report(LOG_PROG, "SiRF: NTPD no fix, mode: $d\n",
- session->newdata.mode);
- } else if ( 0 == unpacked_date.tm_year ) {
- gpsd_report(LOG_PROG, "SiRF: NTPD no year\n",
- session->newdata.mode);
+ if (session->newdata.mode <= MODE_NO_FIX) {
+ gpsd_report(LOG_PROG, "SiRF: NTPD no fix, mode: $d\n",
+ session->newdata.mode);
+ } else if (0 == unpacked_date.tm_year) {
+ gpsd_report(LOG_PROG, "SiRF: NTPD no year\n",
+ session->newdata.mode);
} else {
if (0 == (session->driver.sirf.time_seen & TIME_SEEN_UTC_1)) {
gpsd_report(LOG_RAW, "SiRF: NTPD just SEEN_UTC 1\n");
}
- gpsd_report(LOG_PROG,
- "SiRF: NTPD valid time MID 0x29, seen=0x%02x\n",
- session->driver.sirf.time_seen);
+ gpsd_report(LOG_PROG,
+ "SiRF: NTPD valid time MID 0x29, seen=0x%02x\n",
+ session->driver.sirf.time_seen);
session->driver.sirf.time_seen |= TIME_SEEN_UTC_1;
- if (session->context->enable_ntpshm) {
- (void)ntpshm_put(session, session->newdata.time, 0.570);
- }
}
+
#endif /* NTPSHM_ENABLE */
/* skip 4 bytes of satellite map */
- session->newdata.altitude = getbesl(buf, 35)*1e-2;
+ session->newdata.altitude = getbesl(buf, 35) * 1e-2;
/* skip 1 byte of map datum */
- session->newdata.speed = getbeuw(buf, 40)*1e-2;
- session->newdata.track = getbeuw(buf, 42)*1e-2;
+ session->newdata.speed = getbeuw(buf, 40) * 1e-2;
+ session->newdata.track = getbeuw(buf, 42) * 1e-2;
/* skip 2 bytes of magnetic variation */
- session->newdata.climb = getbesw(buf, 46)*1e-2;
- mask |= TIME_SET | SPEED_SET | TRACK_SET;
+ session->newdata.climb = getbesw(buf, 46) * 1e-2;
+ mask |= TIME_IS | SPEED_IS | TRACK_IS;
if (session->newdata.mode == MODE_3D)
- mask |= ALTITUDE_SET | CLIMB_SET;
+ mask |= ALTITUDE_IS | CLIMB_IS;
}
- gpsd_report(LOG_DATA,
+ gpsd_report(LOG_DATA,
"SiRF: GND 0x29: time=%.2f lat=%.2f lon=%.2f alt=%.2f track=%.2f speed=%.2f mode=%d status=%d mask=%s\n",
session->newdata.time,
session->newdata.latitude,
@@ -775,14 +853,14 @@ static gps_mask_t sirf_msg_geodetic(struct gps_device_t *session, unsigned char
session->newdata.track,
session->newdata.speed,
session->newdata.mode,
- session->gpsdata.status,
- gpsd_maskdump(mask));
+ session->gpsdata.status, gpsd_maskdump(mask));
return mask;
}
#endif /* __UNUSED__ */
#ifdef ALLOW_RECONFIGURE
-static gps_mask_t sirf_msg_sysparam(struct gps_device_t *session, unsigned char *buf, size_t len)
+static gps_mask_t sirf_msg_sysparam(struct gps_device_t *session,
+ unsigned char *buf, size_t len)
{
if (len != 65)
@@ -803,7 +881,8 @@ static gps_mask_t sirf_msg_sysparam(struct gps_device_t *session, unsigned char
}
#endif /* ALLOW_RECONFIGURE */
-static gps_mask_t sirf_msg_ublox(struct gps_device_t *session, unsigned char *buf, size_t len UNUSED)
+static gps_mask_t sirf_msg_ublox(struct gps_device_t *session,
+ unsigned char *buf, size_t len UNUSED)
{
gps_mask_t mask;
unsigned short navtype;
@@ -812,12 +891,15 @@ static gps_mask_t sirf_msg_ublox(struct gps_device_t *session, unsigned char *bu
return 0;
/* this packet is only sent by uBlox firmware from version 1.32 */
- mask = LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET |
- STATUS_SET | MODE_SET | DOP_SET;
+ mask = LATLON_IS | ALTITUDE_IS | SPEED_IS | TRACK_IS | CLIMB_IS |
+ STATUS_IS | MODE_IS | DOP_IS;
session->newdata.latitude = getbesl(buf, 1) * RAD_2_DEG * 1e-8;
session->newdata.longitude = getbesl(buf, 5) * RAD_2_DEG * 1e-8;
- session->gpsdata.separation = wgs84_separation(session->newdata.latitude, session->newdata.longitude);
- session->newdata.altitude = getbesl(buf, 9) * 1e-3 - session->gpsdata.separation;
+ session->gpsdata.separation =
+ wgs84_separation(session->newdata.latitude,
+ session->newdata.longitude);
+ session->newdata.altitude =
+ getbesl(buf, 9) * 1e-3 - session->gpsdata.separation;
session->newdata.speed = getbesl(buf, 13) * 1e-3;
session->newdata.climb = getbesl(buf, 17) * 1e-3;
session->newdata.track = getbesl(buf, 21) * RAD_2_DEG * 1e-8;
@@ -833,35 +915,32 @@ static gps_mask_t sirf_msg_ublox(struct gps_device_t *session, unsigned char *bu
session->newdata.mode = MODE_3D;
else if (session->gpsdata.status)
session->newdata.mode = MODE_2D;
- gpsd_report(LOG_PROG, "SiRF: EMND 0x62: Navtype = 0x%0x, Status = %d, mode = %d\n",
- navtype, session->gpsdata.status, session->newdata.mode);
+ gpsd_report(LOG_PROG,
+ "SiRF: EMND 0x62: Navtype = 0x%0x, Status = %d, mode = %d\n",
+ navtype, session->gpsdata.status, session->newdata.mode);
- if (navtype & 0x40) { /* UTC corrected timestamp? */
+ if (navtype & 0x40) { /* UTC corrected timestamp? */
struct tm unpacked_date;
double subseconds;
- mask |= TIME_SET;
+ mask |= TIME_IS;
unpacked_date.tm_year = (int)getbeuw(buf, 26) - 1900;
unpacked_date.tm_mon = (int)getub(buf, 28) - 1;
unpacked_date.tm_mday = (int)getub(buf, 29);
unpacked_date.tm_hour = (int)getub(buf, 30);
unpacked_date.tm_min = (int)getub(buf, 31);
unpacked_date.tm_sec = 0;
- subseconds = ((unsigned short)getbeuw(buf, 32))*1e-3;
+ subseconds = ((unsigned short)getbeuw(buf, 32)) * 1e-3;
/*@ -compdef */
- session->newdata.time =
- (double)mkgmtime(&unpacked_date)+subseconds;
+ session->newdata.time = (double)mkgmtime(&unpacked_date) + subseconds;
/*@ +compdef */
#ifdef NTPSHM_ENABLE
if (0 == (session->driver.sirf.time_seen & TIME_SEEN_UTC_2)) {
gpsd_report(LOG_RAW, "SiRF: NTPD just SEEN_UTC_2\n");
}
- gpsd_report(LOG_PROG,
- "SiRF: NTPD valid time MID 0x62, seen=0x%02x\n",
- session->driver.sirf.time_seen);
+ gpsd_report(LOG_PROG,
+ "SiRF: NTPD valid time MID 0x62, seen=0x%02x\n",
+ session->driver.sirf.time_seen);
session->driver.sirf.time_seen |= TIME_SEEN_UTC_2;
- if (session->context->enable_ntpshm) {
- (void)ntpshm_put(session, session->newdata.time, 0.570);
- }
#endif /* NTPSHM_ENABLE */
session->context->valid |= LEAP_SECOND_VALID;
}
@@ -873,33 +952,29 @@ static gps_mask_t sirf_msg_ublox(struct gps_device_t *session, unsigned char *bu
session->gpsdata.dop.vdop = (int)getub(buf, 37) / 5.0;
session->gpsdata.dop.tdop = (int)getub(buf, 38) / 5.0;
session->driver.sirf.driverstate |= UBLOX;
- gpsd_report(LOG_DATA, "SiRF: EMD 0x62: time=%.2f lat=%.2f lon=%.2f alt=%.f speed=%.2f track=%.2f climb=%.2f mode=%d status=%d gdop=%.2f pdop=%.2f hdop=%.2f vdop=%.2f tdop=%.2f mask=%s\n",
- session->newdata.time,
- session->newdata.latitude,
- session->newdata.longitude,
- session->newdata.altitude,
- session->newdata.speed,
- session->newdata.track,
- session->newdata.climb,
- session->newdata.mode,
- session->gpsdata.status,
- session->gpsdata.dop.gdop,
- session->gpsdata.dop.pdop,
- session->gpsdata.dop.hdop,
- session->gpsdata.dop.vdop,
- session->gpsdata.dop.tdop,
+ gpsd_report(LOG_DATA,
+ "SiRF: EMD 0x62: time=%.2f lat=%.2f lon=%.2f alt=%.f speed=%.2f track=%.2f climb=%.2f mode=%d status=%d gdop=%.2f pdop=%.2f hdop=%.2f vdop=%.2f tdop=%.2f mask=%s\n",
+ session->newdata.time, session->newdata.latitude,
+ session->newdata.longitude, session->newdata.altitude,
+ session->newdata.speed, session->newdata.track,
+ session->newdata.climb, session->newdata.mode,
+ session->gpsdata.status, session->gpsdata.dop.gdop,
+ session->gpsdata.dop.pdop, session->gpsdata.dop.hdop,
+ session->gpsdata.dop.vdop, session->gpsdata.dop.tdop,
gpsd_maskdump(mask));
return mask;
}
-static gps_mask_t sirf_msg_ppstime(struct gps_device_t *session, unsigned char *buf, size_t len)
+static gps_mask_t sirf_msg_ppstime(struct gps_device_t *session,
+ unsigned char *buf, size_t len)
{
gps_mask_t mask = 0;
if (len != 19)
return 0;
- gpsd_report(LOG_PROG, "SiRF: PPS 0x34: Status = 0x%02x\n", getub(buf, 14));
+ gpsd_report(LOG_PROG, "SiRF: PPS 0x34: Status = 0x%02x\n",
+ getub(buf, 14));
if (((int)getub(buf, 14) & 0x07) == 0x07) { /* valid UTC time? */
struct tm unpacked_date;
unpacked_date.tm_hour = (int)getub(buf, 1);
@@ -909,37 +984,34 @@ static gps_mask_t sirf_msg_ppstime(struct gps_device_t *session, unsigned char *
unpacked_date.tm_mon = (int)getub(buf, 5) - 1;
unpacked_date.tm_year = (int)getbeuw(buf, 6) - 1900;
/*@ -compdef */
- session->newdata.time =
- (double)mkgmtime(&unpacked_date);
+ session->newdata.time = (double)mkgmtime(&unpacked_date);
/*@ +compdef */
session->context->leap_seconds = (int)getbeuw(buf, 8);
- if ( LEAP_SECONDS > session->context->leap_seconds ) {
+ if (LEAP_SECONDS > session->context->leap_seconds) {
/* something wrong */
gpsd_report(LOG_ERROR, "SiRF: Invalid leap_seconds: %d\n",
- session->context->leap_seconds);
+ session->context->leap_seconds);
session->context->leap_seconds = LEAP_SECONDS;
session->context->valid &= ~LEAP_SECOND_VALID;
} else {
session->context->valid |= LEAP_SECOND_VALID;
}
#ifdef NTPSHM_ENABLE
- if ( 0 == (session->driver.sirf.time_seen & TIME_SEEN_UTC_2)) {
+ if (0 == (session->driver.sirf.time_seen & TIME_SEEN_UTC_2)) {
gpsd_report(LOG_RAW, "SiRF: NTPD just SEEN_UTC_2\n");
}
- gpsd_report(LOG_PROG,
- "SiRF: NTPD valid time MID 0x34, seen=0x%02x\n",
- session->driver.sirf.time_seen);
+ gpsd_report(LOG_PROG,
+ "SiRF: NTPD valid time MID 0x34, seen=0x%02x\n",
+ session->driver.sirf.time_seen);
session->driver.sirf.time_seen |= TIME_SEEN_UTC_2;
- if (session->context->enable_ntpshm) {
- (void)ntpshm_put(session, session->newdata.time, 0.3);
- }
#endif /* NTPSHM_ENABLE */
- mask |= TIME_SET;
+ mask |= TIME_IS;
}
return mask;
}
-gps_mask_t sirf_parse(struct gps_device_t *session, unsigned char *buf, size_t len)
+gps_mask_t sirf_parse(struct gps_device_t * session, unsigned char *buf,
+ size_t len)
{
if (len == 0)
@@ -948,40 +1020,41 @@ gps_mask_t sirf_parse(struct gps_device_t *session, unsigned char *buf, size_t l
buf += 4;
len -= 8;
gpsd_report(LOG_RAW, "SiRF: Raw packet type 0x%02x length %zd: %s\n",
- buf[0], len, gpsd_hexdump_wrapper(buf, len, LOG_RAW));
+ buf[0], len, gpsd_hexdump_wrapper(buf, len, LOG_RAW));
(void)snprintf(session->gpsdata.tag, sizeof(session->gpsdata.tag),
- "MID%d",(int)buf[0]);
+ "MID%d", (int)buf[0]);
/* could change if the set of messages we enable does */
session->cycle_end_reliable = true;
- switch (buf[0])
- {
- case 0x02: /* Measure Navigation Data Out MID 2 */
- if ((session->driver.sirf.driverstate & UBLOX)==0)
- return sirf_msg_navsol(session, buf, len) | (CLEAR_SET | REPORT_SET);
+ switch (buf[0]) {
+ case 0x02: /* Measure Navigation Data Out MID 2 */
+ if ((session->driver.sirf.driverstate & UBLOX) == 0)
+ return sirf_msg_navsol(session, buf,
+ len) | (CLEAR_IS | REPORT_IS);
else {
- gpsd_report(LOG_PROG, "SiRF: MND 0x02 skipped, uBlox flag is on.\n");
+ gpsd_report(LOG_PROG,
+ "SiRF: MND 0x02 skipped, uBlox flag is on.\n");
return 0;
}
- case 0x04: /* Measured tracker data out MID 4 */
+ case 0x04: /* Measured tracker data out MID 4 */
return sirf_msg_svinfo(session, buf, len);
- case 0x05: /* Raw Tracker Data Out MID 5 */
+ case 0x05: /* Raw Tracker Data Out MID 5 */
gpsd_report(LOG_PROG, "SiRF: unused Raw Tracker Data 0x05\n");
return 0;
#ifdef ALLOW_RECONFIGURE
- case 0x06: /* Software Version String MID 6 */
+ case 0x06: /* Software Version String MID 6 */
return sirf_msg_swversion(session, buf, len);
#endif /* ALLOW_RECONFIGURE */
- case 0x07: /* Clock Status Data MID 7 */
+ case 0x07: /* Clock Status Data MID 7 */
gpsd_report(LOG_PROG, "SiRF: unused CLK 0x07\n");
return 0;
- case 0x08: /* subframe data MID 8 */
- /* extract leap-second from this */
+ case 0x08: /* subframe data MID 8 */
+ /* extract leap-second from this */
/*
* Chris Kuethe says:
* "Message 8 is generated as the data is received. It is not
@@ -994,88 +1067,90 @@ gps_mask_t sirf_parse(struct gps_device_t *session, unsigned char *buf, size_t l
*/
return sirf_msg_navdata(session, buf, len);
- case 0x09: /* CPU Throughput MID 9 */
+ case 0x09: /* CPU Throughput MID 9 */
gpsd_report(LOG_PROG,
"SiRF: THR 0x09: SegStatMax=%.3f, SegStatLat=%3.f, AveTrkTime=%.3f, Last MS=%u\n",
- (float)getbeuw(buf, 1)/186, (float)getbeuw(buf, 3)/186,
- (float)getbeuw(buf, 5)/186, getbeuw(buf, 7));
+ (float)getbeuw(buf, 1) / 186, (float)getbeuw(buf,
+ 3) / 186,
+ (float)getbeuw(buf, 5) / 186, getbeuw(buf, 7));
return 0;
- case 0x0a: /* Error ID Data MID 10 */
+ case 0x0a: /* Error ID Data MID 10 */
return sirf_msg_errors(buf, len);
- case 0x0b: /* Command Acknowledgement MID 11 */
- gpsd_report(LOG_PROG, "SiRF: ACK 0x0b: %02x\n",getub(buf, 1));
+ case 0x0b: /* Command Acknowledgement MID 11 */
+ gpsd_report(LOG_PROG, "SiRF: ACK 0x0b: %02x\n", getub(buf, 1));
return 0;
- case 0x0c: /* Command NAcknowledgement MID 12 */
- gpsd_report(LOG_PROG, "SiRF: NAK 0x0c: %02x\n",getub(buf, 1));
+ case 0x0c: /* Command NAcknowledgement MID 12 */
+ gpsd_report(LOG_PROG, "SiRF: NAK 0x0c: %02x\n", getub(buf, 1));
return 0;
- case 0x0d: /* Visible List MID 13 */
+ case 0x0d: /* Visible List MID 13 */
gpsd_report(LOG_PROG, "SiRF: unused VIS 0x0d\n");
return 0;
- case 0x0e: /* Almanac Data MID 14 */
+ case 0x0e: /* Almanac Data MID 14 */
gpsd_report(LOG_PROG, "SiRF: unused ALM 0x0e: %s\n",
- gpsd_hexdump_wrapper(buf, len, LOG_PROG));
+ gpsd_hexdump_wrapper(buf, len, LOG_PROG));
return 0;
- case 0x0f: /* Ephemeris Data MID 15 */
+ case 0x0f: /* Ephemeris Data MID 15 */
gpsd_report(LOG_PROG, "SiRF: unused EPH 0x0f: %s\n",
- gpsd_hexdump_wrapper(buf, len, LOG_PROG));
+ gpsd_hexdump_wrapper(buf, len, LOG_PROG));
return 0;
- case 0x11: /* Differential Corrections MID 17 */
+ case 0x11: /* Differential Corrections MID 17 */
gpsd_report(LOG_PROG, "SiRF: unused DIFF 0x11: %s\n",
- gpsd_hexdump_wrapper(buf, len, LOG_PROG));
+ gpsd_hexdump_wrapper(buf, len, LOG_PROG));
return 0;
- case 0x12: /* OK To Send MID 18 */
- gpsd_report(LOG_PROG, "SiRF: OTS 0x12: send indicator = %d\n",getub(buf, 1));
+ case 0x12: /* OK To Send MID 18 */
+ gpsd_report(LOG_PROG, "SiRF: OTS 0x12: send indicator = %d\n",
+ getub(buf, 1));
return 0;
#ifdef ALLOW_RECONFIGURE
- case 0x13: /* Navigation Parameters MID 19 */
+ case 0x13: /* Navigation Parameters MID 19 */
return sirf_msg_sysparam(session, buf, len);
#endif /* ALLOW_RECONFIGURE */
- case 0x1b: /* DGPS status (undocumented) MID 27 */
+ case 0x1b: /* DGPS status (undocumented) MID 27 */
gpsd_report(LOG_PROG, "SiRF: unused DGPSF 0x1b %s\n",
- gpsd_hexdump_wrapper(buf, len, LOG_PROG));
+ gpsd_hexdump_wrapper(buf, len, LOG_PROG));
return 0;
- case 0x1c: /* Navigation Library Measurement Data MID 28 */
+ case 0x1c: /* Navigation Library Measurement Data MID 28 */
gpsd_report(LOG_PROG, "SiRF: NLMD 0x1c: %s\n",
- gpsd_hexdump_wrapper(buf, len, LOG_PROG));
+ gpsd_hexdump_wrapper(buf, len, LOG_PROG));
return sirf_msg_nlmd(session, buf, len);
- case 0x1d: /* Navigation Library DGPS Data MID 29 */
+ case 0x1d: /* Navigation Library DGPS Data MID 29 */
gpsd_report(LOG_PROG, "SiRF: unused NLDG 0x1d: %s\n",
- gpsd_hexdump_wrapper(buf, len, LOG_PROG));
+ gpsd_hexdump_wrapper(buf, len, LOG_PROG));
return 0;
- case 0x1e: /* Navigation Library SV State Data MID 30 */
+ case 0x1e: /* Navigation Library SV State Data MID 30 */
gpsd_report(LOG_PROG, "SiRF: unused NLSV 0x1e: %s\n",
- gpsd_hexdump_wrapper(buf, len, LOG_PROG));
+ gpsd_hexdump_wrapper(buf, len, LOG_PROG));
return 0;
- case 0x1f: /* Navigation Library Initialization Data MID 31 */
+ case 0x1f: /* Navigation Library Initialization Data MID 31 */
gpsd_report(LOG_PROG, "SiRF: unused NLID 0x1f: %s\n",
- gpsd_hexdump_wrapper(buf, len, LOG_PROG));
+ gpsd_hexdump_wrapper(buf, len, LOG_PROG));
return 0;
- case 0x29: /* Geodetic Navigation Information MID 41 */
+ case 0x29: /* Geodetic Navigation Information MID 41 */
gpsd_report(LOG_PROG, "SiRF: unused GND 0x29: %s\n",
- gpsd_hexdump_wrapper(buf, len, LOG_PROG));
+ gpsd_hexdump_wrapper(buf, len, LOG_PROG));
return 0;
- case 0x32: /* SBAS corrections MID 50 */
+ case 0x32: /* SBAS corrections MID 50 */
gpsd_report(LOG_PROG, "SiRF: unused SBAS 0x32: %s\n",
- gpsd_hexdump_wrapper(buf, len, LOG_PROG));
+ gpsd_hexdump_wrapper(buf, len, LOG_PROG));
return 0;
- case 0x34: /* PPS Time MID 52 */
+ case 0x34: /* PPS Time MID 52 */
/*
* Carl Carter from SiRF writes: "We do not output on the
* second (unless you are using MID 52). We make
@@ -1099,25 +1174,25 @@ gps_mask_t sirf_parse(struct gps_device_t *session, unsigned char *buf, size_t l
*/
return sirf_msg_ppstime(session, buf, len);
- case 0x62: /* uBlox Extended Measured Navigation Data MID 98 */
+ case 0x62: /* uBlox Extended Measured Navigation Data MID 98 */
gpsd_report(LOG_PROG, "SiRF: uBlox EMND 0x62: %s.\n",
- gpsd_hexdump_wrapper(buf, len, LOG_PROG));
- return sirf_msg_ublox(session, buf, len) | (CLEAR_SET | REPORT_SET);
+ gpsd_hexdump_wrapper(buf, len, LOG_PROG));
+ return sirf_msg_ublox(session, buf, len) | (CLEAR_IS | REPORT_IS);
- case 0x80: /* Initialize Data Source MID 128 */
+ case 0x80: /* Initialize Data Source MID 128 */
gpsd_report(LOG_PROG, "SiRF: unused INIT 0x80: %s\n",
- gpsd_hexdump_wrapper(buf, len, LOG_PROG));
+ gpsd_hexdump_wrapper(buf, len, LOG_PROG));
return 0;
- case 0xe1: /* Development statistics messages MID 225 */
+ case 0xe1: /* Development statistics messages MID 225 */
/* FALLTHROUGH */
- case 0xff: /* Debug messages MID 255 */
+ case 0xff: /* Debug messages MID 255 */
(void)sirf_msg_debug(buf, len);
return 0;
default:
gpsd_report(LOG_WARN, "SiRF: Unknown packet id %d length %zd: %s\n",
- buf[0], len, gpsd_hexdump_wrapper(buf, len, LOG_WARN));
+ buf[0], len, gpsd_hexdump_wrapper(buf, len, LOG_WARN));
return 0;
}
}
@@ -1147,123 +1222,141 @@ static void sirfbin_event_hook(struct gps_device_t *session, event_t event)
if (session->packet.type == NMEA_PACKET) {
gpsd_report(LOG_PROG, "SiRF: Switching chip mode to binary.\n");
(void)nmea_send(session,
- "$PSRF100,0,%d,8,1,0", session->gpsdata.dev.baudrate);
+ "$PSRF100,0,%d,8,1,0",
+ session->gpsdata.dev.baudrate);
}
- /* do this every time*/
+ /* do this every time */
{
/*@ +charint @*/
/* Poll Navigation Parameters MID 152
* query for MID 19 */
- static unsigned char navparams[] = {0xa0, 0xa2, 0x00, 0x02,
- 0x98, /* MID 152 */
- 0x00,
- 0x00, 0x00, 0xb0, 0xb3};
+ static unsigned char navparams[] = {
+ 0xa0, 0xa2, 0x00, 0x02,
+ 0x98, /* MID 152 */
+ 0x00,
+ 0x00, 0x00, 0xb0, 0xb3
+ };
/* DGPS Source MID 133 */
- static unsigned char dgpscontrol[] = {0xa0, 0xa2, 0x00, 0x07,
- 0x85, /* MID 133 */
- 0x01, /* use SBAS */
- 0x00, 0x00,
- 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xb0, 0xb3};
+ static unsigned char dgpscontrol[] = {
+ 0xa0, 0xa2, 0x00, 0x07,
+ 0x85, /* MID 133 */
+ 0x01, /* use SBAS */
+ 0x00, 0x00,
+ 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xb0, 0xb3
+ };
/* Set SBAS Parameters MID 170 */
- static unsigned char sbasparams[] = {0xa0, 0xa2, 0x00, 0x06,
- 0xaa, /* MID 170 */
- 0x00, /* SBAS PRN */
- 0x01, /* SBAS Mode */
- 0x00, /* Auto PRN */
- 0x00, 0x00,
- 0x00, 0x00, 0xb0, 0xb3};
+ static unsigned char sbasparams[] = {
+ 0xa0, 0xa2, 0x00, 0x06,
+ 0xaa, /* MID 170 */
+ 0x00, /* SBAS PRN */
+ 0x01, /* SBAS Mode */
+ 0x00, /* Auto PRN */
+ 0x00, 0x00,
+ 0x00, 0x00, 0xb0, 0xb3
+ };
/* Poll Software Version MID 132 */
- static unsigned char versionprobe[] = {0xa0, 0xa2, 0x00, 0x02,
- 0x84, /* MID 132 */
- 0x00, /* unused */
- 0x00, 0x00, 0xb0, 0xb3};
+ static unsigned char versionprobe[] = {
+ 0xa0, 0xa2, 0x00, 0x02,
+ 0x84, /* MID 132 */
+ 0x00, /* unused */
+ 0x00, 0x00, 0xb0, 0xb3
+ };
/* Set Message Rate MID 166 */
- static unsigned char requestecef[] = {0xa0, 0xa2, 0x00, 0x08,
- 0xa6, /* MID 166 */
- 0x00, /* enable 1 */
- 0x02, /* MID 2 */
- 0x01, /* once per Sec */
- 0x00, 0x00, /* unused */
- 0x00, 0x00, /* unused */
- 0x00, 0x00, 0xb0, 0xb3};
+ static unsigned char requestecef[] = {
+ 0xa0, 0xa2, 0x00, 0x08,
+ 0xa6, /* MID 166 */
+ 0x00, /* enable 1 */
+ 0x02, /* MID 2 */
+ 0x01, /* once per Sec */
+ 0x00, 0x00, /* unused */
+ 0x00, 0x00, /* unused */
+ 0x00, 0x00, 0xb0, 0xb3
+ };
/* Set Message Rate MID 166 */
- static unsigned char requesttracker[] = {0xa0, 0xa2, 0x00, 0x08,
- 0xa6, /* MID 166 */
- 0x00, /* enable 1 */
- 0x04, /* MID 4 */
- 0x03, /* every 3 sec */
- 0x00, 0x00, /* unused */
- 0x00, 0x00, /* unused */
- 0x00, 0x00, 0xb0, 0xb3};
+ static unsigned char requesttracker[] = {
+ 0xa0, 0xa2, 0x00, 0x08,
+ 0xa6, /* MID 166 */
+ 0x00, /* enable 1 */
+ 0x04, /* MID 4 */
+ 0x03, /* every 3 sec */
+ 0x00, 0x00, /* unused */
+ 0x00, 0x00, /* unused */
+ 0x00, 0x00, 0xb0, 0xb3
+ };
/* unset MID 29 0x1d */
/* we do not decode it, so don't send it */
- static unsigned char unsetmid29[] = {0xa0, 0xa2,
- 0x00, 0x08, /* len */
- 0xa6, /* MID 166 */
- 0x00, /* enable 1 */
- 0x1d, /* MID 29 */
- 0x00, /* never */
- 0x00, 0x00, /* unused */
- 0x00, 0x00, /* unused */
- 0x00, 0x00, 0xb0, 0xb3};
+ static unsigned char unsetmid29[] = {
+ 0xa0, 0xa2, 0x00, 0x08,
+ 0xa6, /* MID 166 */
+ 0x00, /* enable 1 */
+ 0x1d, /* MID 29 */
+ 0x00, /* never */
+ 0x00, 0x00, /* unused */
+ 0x00, 0x00, /* unused */
+ 0x00, 0x00, 0xb0, 0xb3
+ };
/* unset MID 30 0x1e */
/* we do not decode it, so don't send it */
- static unsigned char unsetmid30[] = {0xa0, 0xa2,
- 0x00, 0x08, /* len */
- 0xa6, /* MID 166 */
- 0x00, /* enable 1 */
- 0x1e, /* MID 30 */
- 0x00, /* never */
- 0x00, 0x00, /* unused */
- 0x00, 0x00, /* unused */
- 0x00, 0x00, 0xb0, 0xb3};
+ static unsigned char unsetmid30[] = {
+ 0xa0, 0xa2, 0x00, 0x08,
+ 0xa6, /* MID 166 */
+ 0x00, /* enable 1 */
+ 0x1e, /* MID 30 */
+ 0x00, /* never */
+ 0x00, 0x00, /* unused */
+ 0x00, 0x00, /* unused */
+ 0x00, 0x00, 0xb0, 0xb3
+ };
/*@ -charint @*/
gpsd_report(LOG_PROG, "SiRF: baudrate: %d\n",
- session->gpsdata.dev.baudrate);
+ session->gpsdata.dev.baudrate);
(void)usleep(3330); /* guessed settling time */
gpsd_report(LOG_PROG, "SiRF: unset MID 30...\n");
(void)sirf_write(session->gpsdata.gps_fd, unsetmid30);
(void)usleep(3330); /* guessed settling time */
- gpsd_report(LOG_PROG, "SiRF: Requesting periodic ecef reports...\n");
+ gpsd_report(LOG_PROG,
+ "SiRF: Requesting periodic ecef reports...\n");
(void)sirf_write(session->gpsdata.gps_fd, requestecef);
- gpsd_report(LOG_PROG,
- "SiRF: Requesting periodic tracker reports...\n");
+ gpsd_report(LOG_PROG,
+ "SiRF: Requesting periodic tracker reports...\n");
(void)sirf_write(session->gpsdata.gps_fd, requesttracker);
- gpsd_report(LOG_PROG, "SiRF: Setting DGPS control to use SBAS...\n");
+ gpsd_report(LOG_PROG,
+ "SiRF: Setting DGPS control to use SBAS...\n");
(void)sirf_write(session->gpsdata.gps_fd, dgpscontrol);
- gpsd_report(LOG_PROG,
- "SiRF: Setting SBAS to auto/integrity mode...\n");
+ gpsd_report(LOG_PROG,
+ "SiRF: Setting SBAS to auto/integrity mode...\n");
(void)sirf_write(session->gpsdata.gps_fd, sbasparams);
- gpsd_report(LOG_PROG,
- "SiRF: unset MID 29...\n");
+ gpsd_report(LOG_PROG, "SiRF: unset MID 29...\n");
(void)sirf_write(session->gpsdata.gps_fd, unsetmid29);
gpsd_report(LOG_PROG, "SiRF: Probing for firmware version...\n");
(void)sirf_write(session->gpsdata.gps_fd, versionprobe);
- gpsd_report(LOG_PROG, "SiRF: Requesting navigation parameters...\n");
+ gpsd_report(LOG_PROG,
+ "SiRF: Requesting navigation parameters...\n");
(void)sirf_write(session->gpsdata.gps_fd, navparams);
}
}
if (event == event_deactivate) {
/*@ +charint @*/
- static unsigned char moderevert[] = {0xa0, 0xa2, 0x00, 0x0e,
- 0x88,
- 0x00, 0x00, /* pad bytes */
- 0x00, /* degraded mode */
- 0x00, 0x00, /* pad bytes */
- 0x00, 0x00, /* altitude source */
- 0x00, /* altitude hold mode */
- 0x00, /* use last computed alt */
- 0x00, /* reserved */
- 0x00, /* degraded mode timeout */
- 0x00, /* dead reckoning timeout */
- 0x00, /* track smoothing */
- 0x00, 0x00, 0xb0, 0xb3};
+ static unsigned char moderevert[] = { 0xa0, 0xa2, 0x00, 0x0e,
+ 0x88,
+ 0x00, 0x00, /* pad bytes */
+ 0x00, /* degraded mode */
+ 0x00, 0x00, /* pad bytes */
+ 0x00, 0x00, /* altitude source */
+ 0x00, /* altitude hold mode */
+ 0x00, /* use last computed alt */
+ 0x00, /* reserved */
+ 0x00, /* degraded mode timeout */
+ 0x00, /* dead reckoning timeout */
+ 0x00, /* track smoothing */
+ 0x00, 0x00, 0xb0, 0xb3
+ };
/*@ -charint -shiftimplementation @*/
putbyte(moderevert, 7, session->driver.sirf.degraded_mode);
putbeword(moderevert, 10, session->driver.sirf.altitude_source_input);
@@ -1279,7 +1372,7 @@ static void sirfbin_event_hook(struct gps_device_t *session, event_t event)
}
#ifdef ALLOW_RECONFIGURE
-static bool sirfbin_speed(struct gps_device_t *session,
+static bool sirfbin_speed(struct gps_device_t *session,
speed_t speed, char parity, int stopbits)
{
return sirf_speed(session->gpsdata.gps_fd, speed, parity, stopbits);
@@ -1287,6 +1380,7 @@ static bool sirfbin_speed(struct gps_device_t *session,
#endif /* ALLOW_RECONFIGURE */
/* this is everything we export */
+/* *INDENT-OFF* */
const struct gps_type_t sirf_binary =
{
.type_name = "SiRF binary", /* full name of type */
@@ -1307,5 +1401,9 @@ const struct gps_type_t sirf_binary =
#ifdef ALLOW_CONTROLSEND
.control_send = sirf_control_send,/* how to send a control string */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = sirf_ntp_offset,
+#endif /* NTP_SHM_ENABLE */
};
+/* *INDENT-ON* */
#endif /* defined(SIRF_ENABLE) && defined(BINARY_ENABLE) */
diff --git a/driver_superstar2.c b/driver_superstar2.c
index bae92eeb..9cc9623b 100644
--- a/driver_superstar2.c
+++ b/driver_superstar2.c
@@ -24,34 +24,34 @@
* These routines are specific to this driver
*/
-static gps_mask_t superstar2_parse_input(struct gps_device_t *);
-static gps_mask_t superstar2_dispatch(struct gps_device_t *,
- unsigned char *, size_t );
-static gps_mask_t superstar2_msg_ack(struct gps_device_t *,
- unsigned char *, size_t );
-static gps_mask_t superstar2_msg_navsol_lla(struct gps_device_t *,
- unsigned char *, size_t );
+static gps_mask_t superstar2_parse_input(struct gps_device_t *);
+static gps_mask_t superstar2_dispatch(struct gps_device_t *,
+ unsigned char *, size_t);
+static gps_mask_t superstar2_msg_ack(struct gps_device_t *,
+ unsigned char *, size_t);
+static gps_mask_t superstar2_msg_navsol_lla(struct gps_device_t *,
+ unsigned char *, size_t);
#ifdef __UNUSED__
-static gps_mask_t superstar2_msg_navsol_ecef(struct gps_device_t *,
- unsigned char *, size_t );
+static gps_mask_t superstar2_msg_navsol_ecef(struct gps_device_t *,
+ unsigned char *, size_t);
#endif /* __UNUSED__ */
-static gps_mask_t superstar2_msg_timing(struct gps_device_t *,
- unsigned char *, size_t );
-static gps_mask_t superstar2_msg_svinfo(struct gps_device_t *,
- unsigned char *, size_t );
-static gps_mask_t superstar2_msg_iono_utc(struct gps_device_t *,
- unsigned char *, size_t );
-static gps_mask_t superstar2_msg_ephemeris(struct gps_device_t *,
- unsigned char *, size_t );
+static gps_mask_t superstar2_msg_timing(struct gps_device_t *,
+ unsigned char *, size_t);
+static gps_mask_t superstar2_msg_svinfo(struct gps_device_t *,
+ unsigned char *, size_t);
+static gps_mask_t superstar2_msg_iono_utc(struct gps_device_t *,
+ unsigned char *, size_t);
+static gps_mask_t superstar2_msg_ephemeris(struct gps_device_t *,
+ unsigned char *, size_t);
/*
* These methods may be called elsewhere in gpsd
*/
-static ssize_t superstar2_control_send(struct gps_device_t *, char *, size_t);
-static void superstar2_event_hook(struct gps_device_t *, event_t);
-static bool superstar2_set_speed(struct gps_device_t *, speed_t, char, int);
-static void superstar2_set_mode(struct gps_device_t *, int);
-static ssize_t superstar2_write(struct gps_device_t *, char *, size_t);
+static ssize_t superstar2_control_send(struct gps_device_t *, char *, size_t);
+static void superstar2_event_hook(struct gps_device_t *, event_t);
+static bool superstar2_set_speed(struct gps_device_t *, speed_t, char, int);
+static void superstar2_set_mode(struct gps_device_t *, int);
+static ssize_t superstar2_write(struct gps_device_t *, char *, size_t);
/*
@@ -59,7 +59,7 @@ static ssize_t superstar2_write(struct gps_device_t *, char *, size_t);
*/
static gps_mask_t
superstar2_msg_ack(struct gps_device_t *session UNUSED,
- unsigned char *buf, size_t data_len)
+ unsigned char *buf, size_t data_len)
{
if (data_len == 11)
gpsd_report(LOG_PROG,
@@ -91,7 +91,7 @@ superstar2_msg_navsol_lla(struct gps_device_t *session,
/*@ +charint @*/
flags = (unsigned char)getub(buf, 72);
- if ((flags & 0x0f) != 0x03) /* mode 3 is navigation */
+ if ((flags & 0x0f) != 0x03) /* mode 3 is navigation */
return mask;
/*@ -charint @*/
@@ -104,52 +104,51 @@ superstar2_msg_navsol_lla(struct gps_device_t *session,
tm.tm_mday = (int)getub(buf, 14);
tm.tm_mon = (int)getub(buf, 15) - 1;
tm.tm_year = (int)getleuw(buf, 16) - 1900;
- session->newdata.time =
- timegm(&tm) + (d - tm.tm_sec);
- mask |= TIME_SET;
+ session->newdata.time = timegm(&tm) + (d - tm.tm_sec);
+ mask |= TIME_IS;
/* extract the local tangential plane (ENU) solution */
- session->newdata.latitude = getled(buf,18) * RAD_2_DEG;
- session->newdata.longitude = getled(buf,26) * RAD_2_DEG;
- session->newdata.altitude = getlef(buf,34);
- session->newdata.speed = getlef(buf,38);
- session->newdata.track = getlef(buf,42) * RAD_2_DEG;
- session->newdata.climb = getlef(buf,54);
- mask |= LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET ;
-
- session->gpsdata.satellites_used = (int)getub(buf,71) & 0x0f;
+ session->newdata.latitude = getled(buf, 18) * RAD_2_DEG;
+ session->newdata.longitude = getled(buf, 26) * RAD_2_DEG;
+ session->newdata.altitude = getlef(buf, 34);
+ session->newdata.speed = getlef(buf, 38);
+ session->newdata.track = getlef(buf, 42) * RAD_2_DEG;
+ session->newdata.climb = getlef(buf, 54);
+ mask |= LATLON_IS | ALTITUDE_IS | SPEED_IS | TRACK_IS | CLIMB_IS;
+
+ session->gpsdata.satellites_used = (int)getub(buf, 71) & 0x0f;
clear_dop(&session->gpsdata.dop);
- /*@i3@*/session->gpsdata.dop.hdop = getleuw(buf,66) * 0.1;
- /*@i3@*/session->gpsdata.dop.vdop = getleuw(buf,68) * 0.1;
+ /*@i3@*/ session->gpsdata.dop.hdop = getleuw(buf, 66) * 0.1;
+ /*@i3@*/ session->gpsdata.dop.vdop = getleuw(buf, 68) * 0.1;
/* other DOP if available */
- mask |= DOP_SET | USED_SET;
+ mask |= DOP_IS | USED_IS;
- flags = (unsigned char)getub(buf,70);
+ flags = (unsigned char)getub(buf, 70);
switch (flags & 0x1f) {
- case 2:
- session->newdata.mode = MODE_3D;
- session->gpsdata.status = STATUS_FIX;
- break;
- case 4:
- session->newdata.mode = MODE_3D;
- session->gpsdata.status = STATUS_DGPS_FIX;
- break;
- case 5:
- session->newdata.mode = MODE_2D;
- session->gpsdata.status = STATUS_DGPS_FIX;
- break;
- case 3:
- case 6:
- session->newdata.mode = MODE_2D;
- session->gpsdata.status = STATUS_FIX;
- break;
- default:
- session->gpsdata.status = STATUS_NO_FIX;
- session->newdata.mode = MODE_NO_FIX;
+ case 2:
+ session->newdata.mode = MODE_3D;
+ session->gpsdata.status = STATUS_FIX;
+ break;
+ case 4:
+ session->newdata.mode = MODE_3D;
+ session->gpsdata.status = STATUS_DGPS_FIX;
+ break;
+ case 5:
+ session->newdata.mode = MODE_2D;
+ session->gpsdata.status = STATUS_DGPS_FIX;
+ break;
+ case 3:
+ case 6:
+ session->newdata.mode = MODE_2D;
+ session->gpsdata.status = STATUS_FIX;
+ break;
+ default:
+ session->gpsdata.status = STATUS_NO_FIX;
+ session->newdata.mode = MODE_NO_FIX;
}
- mask |= MODE_SET | STATUS_SET ;
- gpsd_report(LOG_DATA,
+ mask |= MODE_IS | STATUS_IS;
+ gpsd_report(LOG_DATA,
"NAVSOL_LLA: time=%.2f lat=%.2f lon=%.2f alt=%.2f track=%.2f speed=%.2f climb=%.2f mode=%d status=%d hdop=%.2f hdop=%.2f used=%d mask=%s\n",
session->newdata.time,
session->newdata.latitude,
@@ -162,8 +161,7 @@ superstar2_msg_navsol_lla(struct gps_device_t *session,
session->gpsdata.status,
session->gpsdata.dop.hdop,
session->gpsdata.dop.vdop,
- session->gpsdata.satellites_used,
- gpsd_maskdump(mask));
+ session->gpsdata.satellites_used, gpsd_maskdump(mask));
return mask;
}
@@ -202,49 +200,49 @@ superstar2_msg_navsol_ecef(struct gps_device_t *session,
tm = gpstime_to_unix((int)session->driver.superstar2.gps_week, tow) -
session->context->leap_seconds;
session->newdata.time = tm;
- mask |= TIME_SET;
+ mask |= TIME_IS;
/* extract the earth-centered, earth-fixed (ECEF) solution */
/*@ -evalorder @*/
ecef_to_wgs84fix(&session->newdata, &session->separation,
- getled(buf, 14), getled(buf, 22), getled(buf, 30),
- getlef(buf, 38), getlef(buf, 42), getlef(buf, 46));
+ getled(buf, 14), getled(buf, 22), getled(buf, 30),
+ getlef(buf, 38), getlef(buf, 42), getlef(buf, 46));
/*@ +evalorder @*/
- mask |= LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET ;
+ mask |= LATLON_IS | ALTITUDE_IS | SPEED_IS | TRACK_IS | CLIMB_IS;
session->gpsdata.satellites_used = (int)getub(buf, 79) & 0x0f;
clear_dop(&session->gpsdata.dop);
session->gpsdata.dop.hdop = getleuw(buf, 74) * 0.1;
session->gpsdata.dop.vdop = getleuw(buf, 76) * 0.1;
/* other DOP if available */
- mask |= DOP_SET | USED_SET;
+ mask |= DOP_IS | USED_IS;
- flags = getub(buf,70);
+ flags = getub(buf, 70);
switch (flags & 0x1f) {
- case 2:
- session->newdata.mode = MODE_3D;
- session->gpsdata.status = STATUS_FIX;
- break;
- case 4:
- session->newdata.mode = MODE_3D;
- session->gpsdata.status = STATUS_DGPS_FIX;
- break;
- case 5:
- session->newdata.mode = MODE_2D;
- session->gpsdata.status = STATUS_DGPS_FIX;
- break;
- case 3:
- case 6:
- session->newdata.mode = MODE_2D;
- session->gpsdata.status = STATUS_FIX;
- break;
- default:
- session->gpsdata.status = STATUS_NO_FIX;
- session->newdata.mode = MODE_NO_FIX;
+ case 2:
+ session->newdata.mode = MODE_3D;
+ session->gpsdata.status = STATUS_FIX;
+ break;
+ case 4:
+ session->newdata.mode = MODE_3D;
+ session->gpsdata.status = STATUS_DGPS_FIX;
+ break;
+ case 5:
+ session->newdata.mode = MODE_2D;
+ session->gpsdata.status = STATUS_DGPS_FIX;
+ break;
+ case 3:
+ case 6:
+ session->newdata.mode = MODE_2D;
+ session->gpsdata.status = STATUS_FIX;
+ break;
+ default:
+ session->gpsdata.status = STATUS_NO_FIX;
+ session->newdata.mode = MODE_NO_FIX;
}
- mask |= MODE_SET | STATUS_SET;
- gpsd_report(LOG_DATA,
+ mask |= MODE_IS | STATUS_IS;
+ gpsd_report(LOG_DATA,
"NAVSOL_LLA: time=%.2f lat=%.2f lon=%.2f alt=%.2f track=%.2f speed=%.2f climb=%.2f mode=%d status=%d hdop=%.2f vdop=%.2f used=%d mask=%s\n",
session->newdata.time,
session->newdata.latitude,
@@ -257,8 +255,7 @@ superstar2_msg_navsol_ecef(struct gps_device_t *session,
session->gpsdata.status,
session->gpsdata.dop.hdop,
session->gpsdata.dop.vdop,
- session->gpsdata.satellites_used,
- gpsd_maskdump(mask));
+ session->gpsdata.satellites_used, gpsd_maskdump(mask));
return mask;
}
#endif /* __UNUSED__ */
@@ -279,36 +276,36 @@ superstar2_msg_svinfo(struct gps_device_t *session,
nchan = 12;
gpsd_zero_satellites(&session->gpsdata);
- nsv = 0; /* number of actually used satellites */
+ nsv = 0; /* number of actually used satellites */
for (i = st = 0; i < nchan; i++) {
/* get info for one channel/satellite */
- int off = i*5 + 5;
+ int off = i * 5 + 5;
unsigned int porn;
if ((porn = (unsigned int)getub(buf, off) & 0x1f) == 0)
- porn = (unsigned int)(getub(buf, off+3) >> 1) + 87;
+ porn = (unsigned int)(getub(buf, off + 3) >> 1) + 87;
- session->gpsdata.PRN[i] = (int)porn;
- session->gpsdata.ss[i] = (float)getub(buf, off+4);
- session->gpsdata.elevation[i] = (int)getsb(buf, off+1);
- session->gpsdata.azimuth[i] = (unsigned short)getub(buf, off+2) +
- ((unsigned short)(getub(buf, off+3) & 0x1) << 1);
+ session->gpsdata.PRN[i] = (int)porn;
+ session->gpsdata.ss[i] = (float)getub(buf, off + 4);
+ session->gpsdata.elevation[i] = (int)getsb(buf, off + 1);
+ session->gpsdata.azimuth[i] = (unsigned short)getub(buf, off + 2) +
+ ((unsigned short)(getub(buf, off + 3) & 0x1) << 1);
/*@ +charint @*/
if ((getub(buf, off) & 0x60) == 0x60)
session->gpsdata.used[nsv++] = session->gpsdata.PRN[i];
/*@ -charint @*/
- if(session->gpsdata.PRN[i])
+ if (session->gpsdata.PRN[i])
st++;
}
session->gpsdata.skyview_time = NAN;
session->gpsdata.satellites_used = nsv;
session->gpsdata.satellites_visible = st;
- gpsd_report(LOG_DATA,
- "SVINFO: visible=%d used=%d mask={SATELLITE|USED}\n",
- session->gpsdata.satellites_visible,
+ gpsd_report(LOG_DATA,
+ "SVINFO: visible=%d used=%d mask={SATELLITE|USED}\n",
+ session->gpsdata.satellites_visible,
session->gpsdata.satellites_used);
- return SATELLITE_SET | USED_SET;
+ return SATELLITE_IS | USED_IS;
}
static gps_mask_t
@@ -320,30 +317,31 @@ superstar2_msg_version(struct gps_device_t *session,
/*@ +charint @*/
/* byte 98 is device type, value = 3 means superstar2 */
- if ((data_len != 101) || ((getub(buf,98) & 0x0f) != 3))
+ if ((data_len != 101) || ((getub(buf, 98) & 0x0f) != 3))
return 0;
/*@ -charint @*/
- (void)snprintf(main_sw, 15, "%s", (char *)buf+4);
- (void)snprintf(hw_part, 15, "%s", (char *)buf+18);
- (void)snprintf(boot_sw, 15, "%s", (char *)buf+36);
- (void)snprintf(ser_num, 14, "%s", (char *)buf+73);
+ (void)snprintf(main_sw, 15, "%s", (char *)buf + 4);
+ (void)snprintf(hw_part, 15, "%s", (char *)buf + 18);
+ (void)snprintf(boot_sw, 15, "%s", (char *)buf + 36);
+ (void)snprintf(ser_num, 14, "%s", (char *)buf + 73);
gpsd_report(LOG_PROG,
- "superstar2 #45 - "
- "hw part %s boot sw %s main sw %s ser num %s\n",
- hw_part, boot_sw, main_sw, ser_num);
+ "superstar2 #45 - "
+ "hw part %s boot sw %s main sw %s ser num %s\n",
+ hw_part, boot_sw, main_sw, ser_num);
(void)strlcpy(session->subtype, main_sw, sizeof(session->subtype));
- gpsd_report(LOG_DATA, "VERSION: subtype='%s' mask={DEVEICEID}\n",
- session->subtype);
- return DEVICEID_SET;
+ gpsd_report(LOG_DATA, "VERSION: subtype='%s' mask={DEVEICEID}\n",
+ session->subtype);
+ return DEVICEID_IS;
}
/**
* GPS Leap Seconds
*/
static gps_mask_t
-superstar2_msg_timing(struct gps_device_t *session, unsigned char *buf, size_t data_len)
+superstar2_msg_timing(struct gps_device_t *session, unsigned char *buf,
+ size_t data_len)
{
gps_mask_t mask;
union long_double l_d;
@@ -370,10 +368,10 @@ superstar2_msg_timing(struct gps_device_t *session, unsigned char *buf, size_t d
d = getled(buf, 43);
tm.tm_sec = (int)d;
session->newdata.time = timegm(&tm);
- session->context->leap_seconds = (int)getsb(buf,20);
- mask = TIME_SET;
+ session->context->leap_seconds = (int)getsb(buf, 20);
+ mask = TIME_IS;
}
- gpsd_report(LOG_DATA, "TIMING: time=%.2f mask={TIME}\n",
+ gpsd_report(LOG_DATA, "TIMING: time=%.2f mask={TIME}\n",
session->newdata.time);
return mask;
}
@@ -382,7 +380,8 @@ superstar2_msg_timing(struct gps_device_t *session, unsigned char *buf, size_t d
* Raw Measurements
*/
static gps_mask_t
-superstar2_msg_measurement(struct gps_device_t *session, unsigned char *buf, size_t data_len UNUSED)
+superstar2_msg_measurement(struct gps_device_t *session, unsigned char *buf,
+ size_t data_len UNUSED)
{
gps_mask_t mask = 0;
#ifdef RAW_ENABLE
@@ -393,28 +392,30 @@ superstar2_msg_measurement(struct gps_device_t *session, unsigned char *buf, siz
gpsd_report(LOG_PROG, "superstar2 #23 - measurement block\n");
- n = (int)getub(buf, 6); /* number of measurements */
- t = getled(buf, 7); /* measurement time */
- for(i = 0; i < n; i++) {
+ n = (int)getub(buf, 6); /* number of measurements */
+ t = getled(buf, 7); /* measurement time */
+ for (i = 0; i < n; i++) {
session->gpsdata.raw.mtime[i] = t;
- session->gpsdata.PRN[i] = (int)getub(buf, 11*i + 15) & 0x1f;
- session->gpsdata.ss[i] = (double)getub(buf, 11*i * 15 +1 )/4.0;
- session->gpsdata.raw.codephase[i] = (double)getleul(buf, 11*i * 15 + 2);
- ul = (unsigned long)getleul(buf, 11*i * 15 + 6);
+ session->gpsdata.PRN[i] = (int)getub(buf, 11 * i + 15) & 0x1f;
+ session->gpsdata.ss[i] = (double)getub(buf, 11 * i * 15 + 1) / 4.0;
+ session->gpsdata.raw.codephase[i] =
+ (double)getleul(buf, 11 * i * 15 + 2);
+ ul = (unsigned long)getleul(buf, 11 * i * 15 + 6);
session->gpsdata.raw.satstat[i] = (unsigned int)(ul & 0x03L);
session->gpsdata.raw.carrierphase[i] = (double)((ul >> 2) & 0x03ffL);
session->gpsdata.raw.pseudorange[i] = (double)(ul >> 12);
}
- mask |= RAW_SET;
+ mask |= RAW_IS;
#endif /* RAW_ENABLE */
return mask;
}
/* request for ionospheric and utc time data #75 */
/*@ +charint @*/
-static char iono_utc_msg[] = {0x01, 0x4b, 0xb4, 0x00, 0x00, 0x01};
+static unsigned char iono_utc_msg[] = { 0x01, 0x4b, 0xb4, 0x00, 0x00, 0x01 };
+
/*@ -charint @*/
@@ -422,7 +423,8 @@ static char iono_utc_msg[] = {0x01, 0x4b, 0xb4, 0x00, 0x00, 0x01};
* Ionospheric/UTC parameters
*/
static gps_mask_t
-superstar2_msg_iono_utc(struct gps_device_t *session, unsigned char *buf, size_t data_len UNUSED)
+superstar2_msg_iono_utc(struct gps_device_t *session, unsigned char *buf,
+ size_t data_len UNUSED)
{
unsigned int i, u;
@@ -430,8 +432,7 @@ superstar2_msg_iono_utc(struct gps_device_t *session, unsigned char *buf, size_t
u = (unsigned int)getub(buf, 21);
gpsd_report(LOG_PROG,
"superstar2 #75 - ionospheric & utc data: iono %s utc %s\n",
- i ? "ok":"bad",
- u ? "ok":"bad");
+ i ? "ok" : "bad", u ? "ok" : "bad");
session->driver.superstar2.last_iono = time(NULL);
return 0;
@@ -442,43 +443,44 @@ superstar2_msg_iono_utc(struct gps_device_t *session, unsigned char *buf, size_t
* Ephemeris
*/
static gps_mask_t
-superstar2_msg_ephemeris(struct gps_device_t *session, unsigned char *buf, size_t data_len UNUSED)
+superstar2_msg_ephemeris(struct gps_device_t *session, unsigned char *buf,
+ size_t data_len UNUSED)
{
unsigned int prn;
prn = (unsigned int)(getub(buf, 4) & 0x1f);
- gpsd_report(LOG_PROG,
- "superstar2 #22 - ephemeris data - prn %u\n", prn);
+ gpsd_report(LOG_PROG, "superstar2 #22 - ephemeris data - prn %u\n", prn);
/* ephemeris data updates fairly slowly, but when it does, poll UTC */
if ((time(NULL) - session->driver.superstar2.last_iono) > 60)
- (void)superstar2_write(session, iono_utc_msg, sizeof(iono_utc_msg));
+ (void)superstar2_write(session, (char *)iono_utc_msg,
+ sizeof(iono_utc_msg));
- return ONLINE_SET;
+ return ONLINE_IS;
}
static ssize_t
superstar2_write(struct gps_device_t *session, char *msg, size_t msglen)
{
- unsigned short c = 0;
- ssize_t i;
+ unsigned short c = 0;
+ ssize_t i;
- for (i = 0; i < (ssize_t)(msglen - 2); i++)
+ for (i = 0; i < (ssize_t) (msglen - 2); i++)
c += (unsigned short)msg[i];
- c += 0x100;
- // c = htons(c); // XXX is this needed on big-endian machines?
- (void)memcpy(msg + (int)msg[3] + 4, &c, 2);
- gpsd_report(LOG_IO, "writing superstar2 control type %d len %zu:%s\n",
- (int)msg[1]&0x7f, msglen,
- gpsd_hexdump_wrapper(msg, msglen, LOG_IO));
- return (i = gpsd_write(session, msg, msglen));
+ c += 0x100;
+ // c = htons(c); // XXX is this needed on big-endian machines?
+ (void)memcpy(msg + (int)msg[3] + 4, &c, 2);
+ gpsd_report(LOG_IO, "writing superstar2 control type %d len %zu:%s\n",
+ (int)msg[1] & 0x7f, msglen,
+ gpsd_hexdump_wrapper(msg, msglen, LOG_IO));
+ return (i = gpsd_write(session, msg, msglen));
}
/**
* Parse the data from the device
*/
gps_mask_t
-superstar2_dispatch(struct gps_device_t *session, unsigned char *buf,
+superstar2_dispatch(struct gps_device_t * session, unsigned char *buf,
size_t len)
{
int type;
@@ -488,27 +490,27 @@ superstar2_dispatch(struct gps_device_t *session, unsigned char *buf,
type = (int)buf[SUPERSTAR2_TYPE_OFFSET];
(void)snprintf(session->gpsdata.tag,
- sizeof(session->gpsdata.tag), "SS2-%d", type);
+ sizeof(session->gpsdata.tag), "SS2-%d", type);
session->cycle_end_reliable = true;
- switch (type)
- {
- case SUPERSTAR2_ACK: /* Message Acknowledgement */
+ switch (type) {
+ case SUPERSTAR2_ACK: /* Message Acknowledgement */
return superstar2_msg_ack(session, buf, len);
- case SUPERSTAR2_SVINFO: /* Satellite Visibility Data */
+ case SUPERSTAR2_SVINFO: /* Satellite Visibility Data */
return superstar2_msg_svinfo(session, buf, len);
- case SUPERSTAR2_NAVSOL_LLA: /* Navigation Data */
- return superstar2_msg_navsol_lla(session, buf, len) | (CLEAR_SET | REPORT_SET);
+ case SUPERSTAR2_NAVSOL_LLA: /* Navigation Data */
+ return superstar2_msg_navsol_lla(session, buf,
+ len) | (CLEAR_IS | REPORT_IS);
#ifdef __UNUSED__
- case SUPERSTAR2_NAVSOL_ECEF: /* Navigation Data */
+ case SUPERSTAR2_NAVSOL_ECEF: /* Navigation Data */
return superstar2_msg_navsol_ecef(session, buf, len);
#endif /* __UNUSED__ */
- case SUPERSTAR2_VERSION: /* Hardware/Software Version */
+ case SUPERSTAR2_VERSION: /* Hardware/Software Version */
return superstar2_msg_version(session, buf, len);
- case SUPERSTAR2_TIMING: /* Timing Parameters */
+ case SUPERSTAR2_TIMING: /* Timing Parameters */
return superstar2_msg_timing(session, buf, len);
- case SUPERSTAR2_MEASUREMENT: /* Timing Parameters */
+ case SUPERSTAR2_MEASUREMENT: /* Timing Parameters */
return superstar2_msg_measurement(session, buf, len);
case SUPERSTAR2_IONO_UTC:
return superstar2_msg_iono_utc(session, buf, len);
@@ -518,8 +520,8 @@ superstar2_dispatch(struct gps_device_t *session, unsigned char *buf,
default:
/* XXX This gets noisy in a hurry. */
gpsd_report(LOG_WARN,
- "unknown superstar2 packet id 0x%02x length %zd: %s\n",
- type, len, gpsd_hexdump_wrapper(buf, len, LOG_WARN));
+ "unknown superstar2 packet id 0x%02x length %zd: %s\n",
+ type, len, gpsd_hexdump_wrapper(buf, len, LOG_WARN));
return 0;
}
}
@@ -532,45 +534,58 @@ superstar2_dispatch(struct gps_device_t *session, unsigned char *buf,
/*@ +charint @*/
/* canned config messages */
/* Initiate Link ID# 63 */
-static char link_msg[] = {0x01, 0x3f, 0xc0, 0x08,
- 0x55, 0x47, 0x50, 0x53, 0x2d, 0x30, 0x30, 0x30,
- 0x00, 0x00};
+static unsigned char link_msg[] = { 0x01, 0x3f, 0xc0, 0x08,
+ 0x55, 0x47, 0x50, 0x53, 0x2d, 0x30, 0x30, 0x30,
+ 0x00, 0x00
+};
/* Request Hardware/Software Identification ID# 45 */
-static char version_msg[] = {0x01, 0x2d, 0xd2, 0x00, 0x00, 0x01};
+static unsigned char version_msg[] = { 0x01, 0x2d, 0xd2, 0x00, 0x00, 0x01 };
+
/*@ -charint @*/
static void superstar2_event_hook(struct gps_device_t *session, event_t event)
{
- if (event == event_wakeup)
- {
- (void)superstar2_write(session, link_msg, sizeof(link_msg));
+ if (event == event_wakeup) {
+ (void)superstar2_write(session, (char *)link_msg, sizeof(link_msg));
(void)usleep(320000);
- (void)superstar2_write(session, version_msg, sizeof(version_msg));
+ (void)superstar2_write(session, (char *)version_msg,
+ sizeof(version_msg));
return;
}
/* query firmware version */
if (event == event_identified)
- (void)superstar2_write(session, version_msg, sizeof(version_msg));
+ (void)superstar2_write(session, (char *)version_msg,
+ sizeof(version_msg));
- /* FIXME: check to see if this really needs to be resent on reactivation */
+ /* FIXME: check to see if this really needs to be resent on reactivation */
if (event == event_identified || event == event_reactivate) {
/*@ +charint @*/
- char svinfo_msg[] = {0x01, 0xa1, 0x5e, 0x00, 0x00, 0x01};
- char timing_msg[] = {0x01, 0xf1, 0x0e, 0x00, 0x00, 0x01};
- char navsol_lla_msg[] = {0x01, 0x94, 0x6b, 0x00, 0x00, 0x01};
- char ephemeris_msg[] = {0x01, 0x96, 0x69, 0x00, 0x00, 0x01};
- char measurement_msg[] = {0x01, 0x97, 0x68, 0x01, 0x00, 0x01, 0x01};
+ unsigned char svinfo_msg[] = { 0x01, 0xa1, 0x5e, 0x00, 0x00, 0x01 };
+ unsigned char timing_msg[] = { 0x01, 0xf1, 0x0e, 0x00, 0x00, 0x01 };
+ unsigned char navsol_lla_msg[] =
+ { 0x01, 0x94, 0x6b, 0x00, 0x00, 0x01 };
+ unsigned char ephemeris_msg[] =
+ { 0x01, 0x96, 0x69, 0x00, 0x00, 0x01 };
+ unsigned char measurement_msg[] =
+ { 0x01, 0x97, 0x68, 0x01, 0x00, 0x01, 0x01 };
/*@ -charint @*/
- (void)superstar2_write(session, timing_msg, sizeof(timing_msg));
- (void)superstar2_write(session, measurement_msg, sizeof(measurement_msg));
- (void)superstar2_write(session, svinfo_msg, sizeof(svinfo_msg));
- (void)superstar2_write(session, navsol_lla_msg, sizeof(navsol_lla_msg));
- (void)superstar2_write(session, version_msg, sizeof(version_msg));
- (void)superstar2_write(session, ephemeris_msg, sizeof(ephemeris_msg));
- (void)superstar2_write(session, iono_utc_msg, sizeof(iono_utc_msg));
+ (void)superstar2_write(session, (char *)timing_msg,
+ sizeof(timing_msg));
+ (void)superstar2_write(session, (char *)measurement_msg,
+ sizeof(measurement_msg));
+ (void)superstar2_write(session, (char *)svinfo_msg,
+ sizeof(svinfo_msg));
+ (void)superstar2_write(session, (char *)navsol_lla_msg,
+ sizeof(navsol_lla_msg));
+ (void)superstar2_write(session, (char *)version_msg,
+ sizeof(version_msg));
+ (void)superstar2_write(session, (char *)ephemeris_msg,
+ sizeof(ephemeris_msg));
+ (void)superstar2_write(session, (char *)iono_utc_msg,
+ sizeof(iono_utc_msg));
session->driver.superstar2.last_iono = time(NULL);
}
}
@@ -602,15 +617,16 @@ static gps_mask_t superstar2_parse_input(struct gps_device_t *session)
#ifdef ALLOW_CONTROLSEND
static ssize_t
-superstar2_control_send(struct gps_device_t *session, char *msg, size_t msglen)
+superstar2_control_send(struct gps_device_t *session, char *msg,
+ size_t msglen)
{
/*@ +charint -mayaliasunique @*/
session->msgbuf[0] = 0x1; /* SOH */
session->msgbuf[1] = msg[0];
session->msgbuf[2] = msg[0] ^ 0xff;
- session->msgbuf[3] = (char)(msglen+1);
- (void)memcpy(session->msgbuf+4, msg+1, msglen-1);
- session->msgbuflen = (size_t)(msglen+5);
+ session->msgbuf[3] = (char)(msglen + 1);
+ (void)memcpy(session->msgbuf + 4, msg + 1, msglen - 1);
+ session->msgbuflen = (size_t) (msglen + 5);
/*@ -charint +mayaliasunique @*/
return superstar2_write(session, session->msgbuf, session->msgbuflen);
}
@@ -620,17 +636,19 @@ superstar2_control_send(struct gps_device_t *session, char *msg, size_t msglen)
static bool superstar2_set_speed(struct gps_device_t *session,
speed_t speed, char parity, int stopbits)
{
- /* parity and stopbit switching aren't available on this chip */
- if (parity!=session->gpsdata.dev.parity || stopbits!=(int)session->gpsdata.dev.stopbits) {
+ /* parity and stopbit switching aren't available on this chip */
+ if (parity != session->gpsdata.dev.parity
+ || stopbits != (int)session->gpsdata.dev.stopbits) {
return false;
} else {
/*@ +charint @*/
- char speed_msg[] = {0x01, 0x48, 0xB7, 0x01, 0x00, 0x00, 0x00};
+ unsigned char speed_msg[] =
+ { 0x01, 0x48, 0xB7, 0x01, 0x00, 0x00, 0x00 };
/* high bit 0 in the mode word means set NMEA mode */
- speed_msg[4] = (char)(speed / 300);
+ speed_msg[4] = (unsigned char)(speed / 300);
/*@ -charint @*/
- return (superstar2_write(session, speed_msg, 7) == 7);
+ return (superstar2_write(session, (char *)speed_msg, 7) == 7);
}
}
#endif /* ALLOW_RECONFIGURE */
@@ -639,17 +657,19 @@ static void superstar2_set_mode(struct gps_device_t *session, int mode)
{
if (mode == MODE_NMEA) {
/*@ +charint @*/
- char mode_msg[] = {0x01, 0x48, 0xB7, 0x01, 0x00, 0x00, 0x00};
+ unsigned char mode_msg[] =
+ { 0x01, 0x48, 0xB7, 0x01, 0x00, 0x00, 0x00 };
/* high bit 0 in the mode word means set NMEA mode */
- mode_msg[4] = (char)(session->gpsdata.dev.baudrate / 300);
- (void)superstar2_write(session, mode_msg, 7);
+ mode_msg[4] = (unsigned char)(session->gpsdata.dev.baudrate / 300);
+ (void)superstar2_write(session, (char *)mode_msg, 7);
/*@ -charint @*/
} else {
session->back_to_nmea = false;
}
}
+/* *INDENT-OFF* */
const struct gps_type_t superstar2_binary = {
/* Full name of type */
.type_name = "SuperStarII binary",
@@ -683,5 +703,9 @@ const struct gps_type_t superstar2_binary = {
/* Control string sender - should provide checksum and trailer */
.control_send = superstar2_control_send,
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL, /* no method for NTP fudge factor */
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* defined(SUPERSTAR2_ENABLE) && defined(BINARY_ENABLE) */
diff --git a/driver_tsip.c b/driver_tsip.c
index 2fa59619..3422ad4c 100644
--- a/driver_tsip.c
+++ b/driver_tsip.c
@@ -24,7 +24,7 @@
#include "gpsd.h"
#include "bits.h"
-#define USE_SUPERPACKET 1 /* use Super Packet mode? */
+#define USE_SUPERPACKET 1 /* use Super Packet mode? */
#define SEMI_2_DEG (180.0 / 2147483647) /* 2^-31 semicircle to deg */
@@ -32,18 +32,19 @@
#define TSIP_CHANNELS 12
static int tsip_write(struct gps_device_t *session,
- unsigned int id, /*@null@*/unsigned char *buf, size_t len)
+ unsigned int id, /*@null@*/ unsigned char *buf,
+ size_t len)
{
char *ep, *cp;
gpsd_report(LOG_IO, "Sent TSIP packet id 0x%02x: %s\n", id,
- gpsd_hexdump_wrapper(buf, len, LOG_IO));
+ gpsd_hexdump_wrapper(buf, len, LOG_IO));
/*@ +charint @*/
session->msgbuf[0] = '\x10';
session->msgbuf[1] = (char)id;
ep = session->msgbuf + 2;
- /*@ -nullderef @*/
+ /*@ -nullderef @*/
for (cp = (char *)buf; len-- > 0; cp++) {
if (*cp == '\x10')
*ep++ = '\x10';
@@ -52,10 +53,10 @@ static int tsip_write(struct gps_device_t *session,
/*@ +nullderef @*/
*ep++ = '\x10';
*ep++ = '\x03';
- session->msgbuflen = (size_t)(ep - session->msgbuf);
+ session->msgbuflen = (size_t) (ep - session->msgbuf);
/*@ -charint @*/
- if (gpsd_write(session,session->msgbuf,session->msgbuflen) !=
- (ssize_t)session->msgbuflen)
+ if (gpsd_write(session, session->msgbuf, session->msgbuflen) !=
+ (ssize_t) session->msgbuflen)
return -1;
return 0;
@@ -102,7 +103,7 @@ static bool tsip_detect(struct gps_device_t *session)
if (select(myfd + 1, &fdset, NULL, NULL, &to) != 1)
break;
if (generic_get(session) >= 0) {
- if(session->packet.type == TSIP_PACKET) {
+ if (session->packet.type == TSIP_PACKET) {
gpsd_report(LOG_RAW, "tsip_detect found\n");
ret = true;
break;
@@ -123,12 +124,12 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
int i, j, len, count;
gps_mask_t mask = 0;
unsigned int id;
- uint8_t u1,u2,u3,u4,u5;
- int16_t s1,s2,s3,s4;
- int32_t sl1,sl2,sl3;
- uint32_t ul1,ul2;
- float f1,f2,f3,f4,f5;
- double d1,d2,d3,d4,d5;
+ uint8_t u1, u2, u3, u4, u5;
+ int16_t s1, s2, s3, s4;
+ int32_t sl1, sl2, sl3;
+ uint32_t ul1, ul2;
+ float f1, f2, f3, f4, f5;
+ double d1, d2, d3, d4, d5;
union int_float i_f;
union long_double l_d;
time_t now;
@@ -136,7 +137,8 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
char buf2[BUFSIZ];
if (session->packet.type != TSIP_PACKET) {
- gpsd_report(LOG_INF, "tsip_analyze packet type %d\n",session->packet.type);
+ gpsd_report(LOG_INF, "tsip_analyze packet type %d\n",
+ session->packet.type);
return 0;
}
@@ -153,267 +155,272 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
if (session->packet.outbuffer[++i] == 0x03)
break;
- (void)snprintf(buf2+strlen(buf2),
- sizeof(buf2)-strlen(buf2),
- "%02x", buf[len++] = session->packet.outbuffer[i]);
+ (void)snprintf(buf2 + strlen(buf2),
+ sizeof(buf2) - strlen(buf2),
+ "%02x", buf[len++] = session->packet.outbuffer[i]);
}
/*@ -charint @*/
(void)snprintf(session->gpsdata.tag, sizeof(session->gpsdata.tag),
"ID%02x", id = (unsigned)session->packet.outbuffer[1]);
- gpsd_report(LOG_IO, "TSIP packet id 0x%02x length %d: %s\n",id,len,buf2);
+ gpsd_report(LOG_IO, "TSIP packet id 0x%02x length %d: %s\n", id, len,
+ buf2);
(void)time(&now);
session->cycle_end_reliable = true;
switch (id) {
- case 0x13: /* Packet Received */
- u1 = getub(buf,0);
- u2 = getub(buf,1);
- gpsd_report(LOG_WARN, "Received packet of type %02x cannot be parsed\n",u1);
+ case 0x13: /* Packet Received */
+ u1 = getub(buf, 0);
+ u2 = getub(buf, 1);
+ gpsd_report(LOG_WARN,
+ "Received packet of type %02x cannot be parsed\n", u1);
#if USE_SUPERPACKET
- if ((int)u1 == 0x8e && (int)u2 == 0x23) { /* no Compact Super Packet */
+ if ((int)u1 == 0x8e && (int)u2 == 0x23) { /* no Compact Super Packet */
gpsd_report(LOG_WARN, "No Compact Super Packet, use LFwEI\n");
/* Request LFwEI Super Packet */
- putbyte(buf,0,0x20);
- putbyte(buf,1,0x01); /* enabled */
+ putbyte(buf, 0, 0x20);
+ putbyte(buf, 1, 0x01); /* enabled */
(void)tsip_write(session, 0x8e, buf, 2);
}
#endif /* USE_SUPERPACKET */
break;
- case 0x41: /* GPS Time */
+ case 0x41: /* GPS Time */
if (len != 10)
break;
- session->driver.tsip.last_41 = now; /* keep timestamp for request */
- f1 = getbef(buf,0); /* gpstime */
- s1 = getbesw(buf,4); /* week */
- f2 = getbef(buf,6); /* leap seconds */
+ session->driver.tsip.last_41 = now; /* keep timestamp for request */
+ f1 = getbef(buf, 0); /* gpstime */
+ s1 = getbesw(buf, 4); /* week */
+ f2 = getbef(buf, 6); /* leap seconds */
if (f1 >= 0.0 && f2 > 10.0) {
session->driver.tsip.gps_week = s1;
session->context->leap_seconds = (int)round(f2);
session->context->valid |= LEAP_SECOND_VALID;
-
-#ifdef NTPSHM_ENABLE
- d1 = gpstime_to_unix((int)s1, f1) - f2;
- if (session->context->enable_ntpshm)
- (void)ntpshm_put(session,d1,0.075);
-#endif
+ session->newdata.time = gpstime_to_unix((int)s1, f1) - f2;
+ mask |= TIME_IS;
}
- gpsd_report(LOG_INF, "GPS Time %f %d %f\n",f1,s1,f2);
+ gpsd_report(LOG_INF, "GPS Time %f %d %f\n", f1, s1, f2);
break;
- case 0x42: /* Single-Precision Position Fix, XYZ ECEF */
+ case 0x42: /* Single-Precision Position Fix, XYZ ECEF */
if (len != 16)
break;
- f1 = getbef(buf,0); /* X */
- f2 = getbef(buf,4); /* Y */
- f3 = getbef(buf,8); /* Z */
- f4 = getbef(buf,12); /* time-of-fix */
- gpsd_report(LOG_INF, "GPS Position XYZ %f %f %f %f\n",f1,f2,f3,f4);
+ f1 = getbef(buf, 0); /* X */
+ f2 = getbef(buf, 4); /* Y */
+ f3 = getbef(buf, 8); /* Z */
+ f4 = getbef(buf, 12); /* time-of-fix */
+ gpsd_report(LOG_INF, "GPS Position XYZ %f %f %f %f\n", f1, f2, f3,
+ f4);
break;
- case 0x43: /* Velocity Fix, XYZ ECEF */
+ case 0x43: /* Velocity Fix, XYZ ECEF */
if (len != 20)
break;
- f1 = getbef(buf,0); /* X velocity */
- f2 = getbef(buf,4); /* Y velocity */
- f3 = getbef(buf,8); /* Z velocity */
- f4 = getbef(buf,12); /* bias rate */
- f5 = getbef(buf,16); /* time-of-fix */
- gpsd_report(LOG_INF, "GPS Velocity XYZ %f %f %f %f %f\n",f1,f2,f3,f4,f5);
+ f1 = getbef(buf, 0); /* X velocity */
+ f2 = getbef(buf, 4); /* Y velocity */
+ f3 = getbef(buf, 8); /* Z velocity */
+ f4 = getbef(buf, 12); /* bias rate */
+ f5 = getbef(buf, 16); /* time-of-fix */
+ gpsd_report(LOG_INF, "GPS Velocity XYZ %f %f %f %f %f\n", f1, f2, f3,
+ f4, f5);
break;
- case 0x45: /* Software Version Information */
+ case 0x45: /* Software Version Information */
if (len != 10)
break;
/*@ -formattype @*/
(void)snprintf(session->subtype, sizeof(session->subtype),
"%d.%d %02d%02d%02d %d.%d %02d%02d%02d",
- getub(buf,0),getub(buf,1),getub(buf,4),getub(buf,2),getub(buf,3),
- getub(buf,5),getub(buf,6),getub(buf,9),getub(buf,7),getub(buf,8));
+ getub(buf, 0), getub(buf, 1), getub(buf, 4), getub(buf,
+ 2),
+ getub(buf, 3), getub(buf, 5), getub(buf, 6), getub(buf,
+ 9),
+ getub(buf, 7), getub(buf, 8));
/*@ +formattype @*/
gpsd_report(LOG_INF, "Software version: %s\n", session->subtype);
- mask |= DEVICEID_SET;
+ mask |= DEVICEID_IS;
break;
- case 0x46: /* Health of Receiver */
+ case 0x46: /* Health of Receiver */
if (len != 2)
break;
session->driver.tsip.last_46 = now;
- u1 = getub(buf,0); /* Status code */
- u2 = getub(buf,1); /* Antenna/Battery */
- if (u1 != (uint8_t)0) {
+ u1 = getub(buf, 0); /* Status code */
+ u2 = getub(buf, 1); /* Antenna/Battery */
+ if (u1 != (uint8_t) 0) {
session->gpsdata.status = STATUS_NO_FIX;
- mask |= STATUS_SET;
- }
- else {
+ mask |= STATUS_IS;
+ } else {
if (session->gpsdata.status < STATUS_FIX) {
session->gpsdata.status = STATUS_FIX;
- mask |= STATUS_SET;
+ mask |= STATUS_IS;
}
}
- gpsd_report(LOG_PROG, "Receiver health %02x %02x\n",u1,u2);
+ gpsd_report(LOG_PROG, "Receiver health %02x %02x\n", u1, u2);
break;
- case 0x47: /* Signal Levels for all Satellites */
- count = (int)getub(buf,0); /* satellite count */
- if (len != (5*count + 1))
+ case 0x47: /* Signal Levels for all Satellites */
+ count = (int)getub(buf, 0); /* satellite count */
+ if (len != (5 * count + 1))
break;
buf2[0] = '\0';
for (i = 0; i < count; i++) {
- u1 = getub(buf,5*i + 1);
- if ((f1 = getbef(buf,5*i + 2)) < 0)
+ u1 = getub(buf, 5 * i + 1);
+ if ((f1 = getbef(buf, 5 * i + 2)) < 0)
f1 = 0.0;
for (j = 0; j < TSIP_CHANNELS; j++)
if (session->gpsdata.PRN[j] == (int)u1) {
session->gpsdata.ss[j] = f1;
break;
}
- (void)snprintf(buf2+strlen(buf2), sizeof(buf2)-strlen(buf2),
- " %d=%.1f",(int)u1,f1);
+ (void)snprintf(buf2 + strlen(buf2), sizeof(buf2) - strlen(buf2),
+ " %d=%.1f", (int)u1, f1);
}
- gpsd_report(LOG_PROG, "Signal Levels (%d):%s\n",count,buf2);
- mask |= SATELLITE_SET;
+ gpsd_report(LOG_PROG, "Signal Levels (%d):%s\n", count, buf2);
+ mask |= SATELLITE_IS;
break;
- case 0x48: /* GPS System Message */
+ case 0x48: /* GPS System Message */
buf[len] = '\0';
- gpsd_report(LOG_PROG, "GPS System Message: %s\n",buf);
+ gpsd_report(LOG_PROG, "GPS System Message: %s\n", buf);
break;
- case 0x49: /* Almanac Health Page */
+ case 0x49: /* Almanac Health Page */
break;
- case 0x4a: /* Single-Precision Position LLA */
+ case 0x4a: /* Single-Precision Position LLA */
if (len != 20)
break;
- session->newdata.latitude = getbef(buf,0) * RAD_2_DEG;
- session->newdata.longitude = getbef(buf,4) * RAD_2_DEG;
- session->newdata.altitude = getbef(buf,8);
- f1 = getbef(buf,12); /* clock bias */
- f2 = getbef(buf,16); /* time-of-fix */
+ session->newdata.latitude = getbef(buf, 0) * RAD_2_DEG;
+ session->newdata.longitude = getbef(buf, 4) * RAD_2_DEG;
+ session->newdata.altitude = getbef(buf, 8);
+ f1 = getbef(buf, 12); /* clock bias */
+ f2 = getbef(buf, 16); /* time-of-fix */
if (session->driver.tsip.gps_week) {
session->newdata.time =
- gpstime_to_unix((int)session->driver.tsip.gps_week, f2) - session->context->leap_seconds;
- mask |= TIME_SET;
+ gpstime_to_unix((int)session->driver.tsip.gps_week,
+ f2) - session->context->leap_seconds;
+ mask |= TIME_IS;
}
- mask |= LATLON_SET | ALTITUDE_SET | CLEAR_SET | REPORT_SET;
+ mask |= LATLON_IS | ALTITUDE_IS | CLEAR_IS | REPORT_IS;
gpsd_report(LOG_DATA, "SPPLLA 0x4a "
"time=%.2f lat=%.2f lon=%.2f alt=%.2f mask=%s\n",
session->newdata.time,
session->newdata.latitude,
session->newdata.longitude,
- session->newdata.altitude,
- gpsd_maskdump(mask));
+ session->newdata.altitude, gpsd_maskdump(mask));
break;
- case 0x4b: /* Machine/Code ID and Additional Status */
+ case 0x4b: /* Machine/Code ID and Additional Status */
if (len != 3)
break;
- u1 = getub(buf,0); /* Machine ID */
- u2 = getub(buf,1); /* Status 1 */
- u3 = getub(buf,2); /* Status 2 */
- gpsd_report(LOG_INF, "Machine ID %02x %02x %02x\n",u1,u2,u3);
+ u1 = getub(buf, 0); /* Machine ID */
+ u2 = getub(buf, 1); /* Status 1 */
+ u3 = getub(buf, 2); /* Status 2 */
+ gpsd_report(LOG_INF, "Machine ID %02x %02x %02x\n", u1, u2, u3);
#if USE_SUPERPACKET
- if ((u3 & 0x01) != (uint8_t)0 && !session->driver.tsip.superpkt) {
+ if ((u3 & 0x01) != (uint8_t) 0 && !session->driver.tsip.superpkt) {
gpsd_report(LOG_PROG, "Switching to Super Packet mode\n");
/* set new I/O Options for Super Packet output */
- putbyte(buf,0,0x2c); /* Position: SP, MSL */
- putbyte(buf,1,0x00); /* Velocity: none (via SP) */
- putbyte(buf,2,0x00); /* Time: GPS */
- putbyte(buf,3,0x08); /* Aux: dBHz */
+ putbyte(buf, 0, 0x2c); /* Position: SP, MSL */
+ putbyte(buf, 1, 0x00); /* Velocity: none (via SP) */
+ putbyte(buf, 2, 0x00); /* Time: GPS */
+ putbyte(buf, 3, 0x08); /* Aux: dBHz */
(void)tsip_write(session, 0x35, buf, 4);
session->driver.tsip.superpkt = true;
}
#endif /* USE_SUPERPACKET */
break;
- case 0x4c: /* Operating Parameters Report */
+ case 0x4c: /* Operating Parameters Report */
break;
- case 0x54: /* One Satellite Bias */
+ case 0x54: /* One Satellite Bias */
break;
- case 0x55: /* IO Options */
+ case 0x55: /* IO Options */
if (len != 4)
break;
- u1 = getub(buf,0); /* Position */
- u2 = getub(buf,1); /* Velocity */
- u3 = getub(buf,2); /* Timing */
- u4 = getub(buf,3); /* Aux */
- gpsd_report(LOG_INF, "IO Options %02x %02x %02x %02x\n",u1,u2,u3,u4);
+ u1 = getub(buf, 0); /* Position */
+ u2 = getub(buf, 1); /* Velocity */
+ u3 = getub(buf, 2); /* Timing */
+ u4 = getub(buf, 3); /* Aux */
+ gpsd_report(LOG_INF, "IO Options %02x %02x %02x %02x\n", u1, u2, u3,
+ u4);
#if USE_SUPERPACKET
- if ((u1 & 0x20) != (uint8_t)0) { /* Output Super Packets? */
+ if ((u1 & 0x20) != (uint8_t) 0) { /* Output Super Packets? */
/* No LFwEI Super Packet */
- putbyte(buf,0,0x20);
- putbyte(buf,1,0x00); /* disabled */
+ putbyte(buf, 0, 0x20);
+ putbyte(buf, 1, 0x00); /* disabled */
(void)tsip_write(session, 0x8e, buf, 2);
/* Request Compact Super Packet */
- putbyte(buf,0,0x23);
- putbyte(buf,1,0x01); /* enabled */
+ putbyte(buf, 0, 0x23);
+ putbyte(buf, 1, 0x01); /* enabled */
(void)tsip_write(session, 0x8e, buf, 2);
session->driver.tsip.req_compact = now;
}
#endif /* USE_SUPERPACKET */
break;
- case 0x56: /* Velocity Fix, East-North-Up (ENU) */
+ case 0x56: /* Velocity Fix, East-North-Up (ENU) */
if (len != 20)
break;
- f1 = getbef(buf,0); /* East velocity */
- f2 = getbef(buf,4); /* North velocity */
- f3 = getbef(buf,8); /* Up velocity */
- f4 = getbef(buf,12); /* clock bias rate */
- f5 = getbef(buf,16); /* time-of-fix */
+ f1 = getbef(buf, 0); /* East velocity */
+ f2 = getbef(buf, 4); /* North velocity */
+ f3 = getbef(buf, 8); /* Up velocity */
+ f4 = getbef(buf, 12); /* clock bias rate */
+ f5 = getbef(buf, 16); /* time-of-fix */
session->newdata.climb = f3;
/*@ -evalorder @*/
- session->newdata.speed = sqrt(pow(f2,2) + pow(f1,2));
+ session->newdata.speed = sqrt(pow(f2, 2) + pow(f1, 2));
/*@ +evalorder @*/
- if ((session->newdata.track = atan2(f1,f2) * RAD_2_DEG) < 0)
+ if ((session->newdata.track = atan2(f1, f2) * RAD_2_DEG) < 0)
session->newdata.track += 360.0;
- gpsd_report(LOG_INF, "GPS Velocity ENU %f %f %f %f %f\n",f1,f2,f3,f4,f5);
- mask |= SPEED_SET | TRACK_SET | CLIMB_SET;
+ gpsd_report(LOG_INF, "GPS Velocity ENU %f %f %f %f %f\n", f1, f2, f3,
+ f4, f5);
+ mask |= SPEED_IS | TRACK_IS | CLIMB_IS;
gpsd_report(LOG_DATA, "VFENU 0x56 "
"time=%.2f speed=%.2f track=%.2f climb=%.2f mask=%s\n",
session->newdata.time,
session->newdata.speed,
session->newdata.track,
- session->newdata.climb,
- gpsd_maskdump(mask));
+ session->newdata.climb, gpsd_maskdump(mask));
break;
- case 0x57: /* Information About Last Computed Fix */
+ case 0x57: /* Information About Last Computed Fix */
if (len != 8)
break;
- u1 = getub(buf,0); /* Source of information */
- u2 = getub(buf,1); /* Mfg. diagnostic */
- f1 = getbef(buf,2); /* gps_time */
- s1 = getbesw(buf,6); /* tsip.gps_week */
+ u1 = getub(buf, 0); /* Source of information */
+ u2 = getub(buf, 1); /* Mfg. diagnostic */
+ f1 = getbef(buf, 2); /* gps_time */
+ s1 = getbesw(buf, 6); /* tsip.gps_week */
/*@ +charint @*/
- if (getub(buf,0) == 0x01) /* good current fix? */
+ if (getub(buf, 0) == 0x01) /* good current fix? */
session->driver.tsip.gps_week = s1;
/*@ -charint @*/
- gpsd_report(LOG_INF, "Fix info %02x %02x %d %f\n",u1,u2,s1,f1);
+ gpsd_report(LOG_INF, "Fix info %02x %02x %d %f\n", u1, u2, s1, f1);
break;
- case 0x58: /* Satellite System Data/Acknowledge from Receiver */
+ case 0x58: /* Satellite System Data/Acknowledge from Receiver */
break;
- case 0x59: /* Status of Satellite Disable or Ignore Health */
+ case 0x59: /* Status of Satellite Disable or Ignore Health */
break;
- case 0x5a: /* Raw Measurement Data */
+ case 0x5a: /* Raw Measurement Data */
if (len != 29)
break;
- f1 = getbef(buf,5); /* Signal Level */
- f2 = getbef(buf,9); /* Code phase */
- f3 = getbef(buf,13); /* Doppler */
- d1 = getbed(buf,17); /* Time of Measurement */
- gpsd_report(LOG_PROG, "Raw Measurement Data %d %f %f %f %f\n",getub(buf,0),f1,f2,f3,d1);
+ f1 = getbef(buf, 5); /* Signal Level */
+ f2 = getbef(buf, 9); /* Code phase */
+ f3 = getbef(buf, 13); /* Doppler */
+ d1 = getbed(buf, 17); /* Time of Measurement */
+ gpsd_report(LOG_PROG, "Raw Measurement Data %d %f %f %f %f\n",
+ getub(buf, 0), f1, f2, f3, d1);
break;
- case 0x5b: /* Satellite Ephemeris Status */
+ case 0x5b: /* Satellite Ephemeris Status */
break;
- case 0x5c: /* Satellite Tracking Status */
+ case 0x5c: /* Satellite Tracking Status */
if (len != 24)
break;
- session->driver.tsip.last_5c = now; /* keep timestamp for request */
- u1 = getub(buf,0); /* PRN */
- u2 = getub(buf,1); /* chan */
- u3 = getub(buf,2); /* Acquisition flag */
- u4 = getub(buf,3); /* Ephemeris flag */
- f1 = getbef(buf,4); /* Signal level */
- f2 = getbef(buf,8); /* time of Last measurement */
- d1 = getbef(buf,12) * RAD_2_DEG; /* Elevation */
- d2 = getbef(buf,16) * RAD_2_DEG; /* Azimuth */
- i = (int)(u2 >> 3); /* channel number */
- gpsd_report(LOG_INF, "Satellite Tracking Status: Ch %2d PRN %3d Res %d Acq %d Eph %2d SNR %4.1f LMT %.04f El %4.1f Az %5.1f\n",i,u1,u2&7,u3,u4,f1,f2,d1,d2);
+ u1 = getub(buf, 0); /* PRN */
+ u2 = getub(buf, 1); /* chan */
+ u3 = getub(buf, 2); /* Acquisition flag */
+ u4 = getub(buf, 3); /* Ephemeris flag */
+ f1 = getbef(buf, 4); /* Signal level */
+ f2 = getbef(buf, 8); /* time of Last measurement */
+ d1 = getbef(buf, 12) * RAD_2_DEG; /* Elevation */
+ d2 = getbef(buf, 16) * RAD_2_DEG; /* Azimuth */
+ i = (int)(u2 >> 3); /* channel number */
+ gpsd_report(LOG_INF,
+ "Satellite Tracking Status: Ch %2d PRN %3d Res %d Acq %d Eph %2d SNR %4.1f LMT %.04f El %4.1f Az %5.1f\n",
+ i, u1, u2 & 7, u3, u4, f1, f2, d1, d2);
if (i < TSIP_CHANNELS) {
if (d1 >= 0.0) {
session->gpsdata.PRN[i] = (int)u1;
@@ -427,20 +434,20 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
}
if (++i == session->gpsdata.satellites_visible) {
session->gpsdata.skyview_time = NAN;
- mask |= SATELLITE_SET; /* last of the series */
+ mask |= SATELLITE_IS; /* last of the series */
}
if (i > session->gpsdata.satellites_visible)
session->gpsdata.satellites_visible = i;
}
break;
- case 0x5e: /* Additional Fix Status Report */
+ case 0x5e: /* Additional Fix Status Report */
break;
- case 0x6d: /* All-In-View Satellite Selection */
- u1 = getub(buf,0); /* nsvs/dimension */
+ case 0x6d: /* All-In-View Satellite Selection */
+ u1 = getub(buf, 0); /* nsvs/dimension */
count = (int)((u1 >> 4) & 0x0f);
if (len != (17 + count))
break;
- session->driver.tsip.last_6d = now; /* keep timestamp for request */
+ session->driver.tsip.last_6d = now; /* keep timestamp for request */
#ifdef __UNUSED__
/*
* This looks right, but it sets a spurious mode value when
@@ -450,8 +457,7 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
* that convey actual fix information, like 0x20, othewise we
* get results like triggering ther error modeler spuriously.
*/
- switch (u1 & 7) /* dimension */
- {
+ switch (u1 & 7) { /* dimension */
case 3:
//session->gpsdata.status = STATUS_FIX;
session->newdata.mode = MODE_2D;
@@ -465,23 +471,26 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
session->newdata.mode = MODE_NO_FIX;
break;
}
- mask |= MODE_SET;
+ mask |= MODE_IS;
#endif /* __UNUSED__ */
session->gpsdata.satellites_used = count;
- session->gpsdata.dop.pdop = getbef(buf,1);
- session->gpsdata.dop.hdop = getbef(buf,5);
- session->gpsdata.dop.vdop = getbef(buf,9);
- session->gpsdata.dop.tdop = getbef(buf,13);
+ session->gpsdata.dop.pdop = getbef(buf, 1);
+ session->gpsdata.dop.hdop = getbef(buf, 5);
+ session->gpsdata.dop.vdop = getbef(buf, 9);
+ session->gpsdata.dop.tdop = getbef(buf, 13);
/*@ -evalorder @*/
- session->gpsdata.dop.gdop = sqrt(pow(session->gpsdata.dop.pdop,2)+pow(session->gpsdata.dop.tdop,2));
+ session->gpsdata.dop.gdop =
+ sqrt(pow(session->gpsdata.dop.pdop, 2) +
+ pow(session->gpsdata.dop.tdop, 2));
/*@ +evalorder @*/
- memset(session->gpsdata.used,0,sizeof(session->gpsdata.used));
+ memset(session->gpsdata.used, 0, sizeof(session->gpsdata.used));
buf2[0] = '\0';
/*@ +charint @*/
for (i = 0; i < count; i++)
- (void)snprintf(buf2+strlen(buf2), sizeof(buf2)-strlen(buf2),
- " %d",session->gpsdata.used[i] = (int)getub(buf,17 + i));
+ (void)snprintf(buf2 + strlen(buf2), sizeof(buf2) - strlen(buf2),
+ " %d", session->gpsdata.used[i] =
+ (int)getub(buf, 17 + i));
/*@ -charint @*/
gpsd_report(LOG_DATA, "AIVSS: 0x6d "
"status=%d used=%d "
@@ -493,139 +502,143 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
session->gpsdata.dop.hdop,
session->gpsdata.dop.vdop,
session->gpsdata.dop.tdop,
- session->gpsdata.dop.gdop,
- gpsd_maskdump(mask));
- mask |= DOP_SET | STATUS_SET | USED_SET;
+ session->gpsdata.dop.gdop, gpsd_maskdump(mask));
+ mask |= DOP_IS | STATUS_IS | USED_IS;
break;
- case 0x6e: /* Synchronized Measurements */
+ case 0x6e: /* Synchronized Measurements */
break;
- case 0x6f: /* Synchronized Measurements Report */
+ case 0x6f: /* Synchronized Measurements Report */
/*@ +charint @*/
- if (len < 20 || getub(buf,0) != 1 || getub(buf,1) != 2)
+ if (len < 20 || getub(buf, 0) != 1 || getub(buf, 1) != 2)
break;
/*@ -charint @*/
- s1 = getbesw(buf,2); /* number of bytes */
- u1 = getub(buf,20); /* number of SVs */
+ s1 = getbesw(buf, 2); /* number of bytes */
+ u1 = getub(buf, 20); /* number of SVs */
break;
- case 0x70: /* Filter Report */
+ case 0x70: /* Filter Report */
break;
- case 0x7a: /* NMEA settings */
+ case 0x7a: /* NMEA settings */
break;
- case 0x82: /* Differential Position Fix Mode */
+ case 0x82: /* Differential Position Fix Mode */
if (len != 1)
break;
- u1 = getub(buf,0); /* fix mode */
+ u1 = getub(buf, 0); /* fix mode */
/*@ +charint @*/
- if (session->gpsdata.status == STATUS_FIX && (u1 & 0x01)!=0) {
+ if (session->gpsdata.status == STATUS_FIX && (u1 & 0x01) != 0) {
session->gpsdata.status = STATUS_DGPS_FIX;
- mask |= STATUS_SET;
+ mask |= STATUS_IS;
}
/*@ -charint @*/
gpsd_report(LOG_DATA, "DPFM 0x82 status=%d mask=%s\n",
session->gpsdata.status, gpsd_maskdump(mask));
break;
- case 0x83: /* Double-Precision XYZ Position Fix and Bias Information */
+ case 0x83: /* Double-Precision XYZ Position Fix and Bias Information */
if (len != 36)
break;
- d1 = getbed(buf,0); /* X */
- d2 = getbed(buf,8); /* Y */
- d3 = getbed(buf,16); /* Z */
- d4 = getbed(buf,24); /* clock bias */
- f1 = getbef(buf,32); /* time-of-fix */
- gpsd_report(LOG_INF, "GPS Position XYZ %f %f %f %f %f\n",d1,d2,d3,d4,f1);
+ d1 = getbed(buf, 0); /* X */
+ d2 = getbed(buf, 8); /* Y */
+ d3 = getbed(buf, 16); /* Z */
+ d4 = getbed(buf, 24); /* clock bias */
+ f1 = getbef(buf, 32); /* time-of-fix */
+ gpsd_report(LOG_INF, "GPS Position XYZ %f %f %f %f %f\n", d1, d2, d3,
+ d4, f1);
break;
- case 0x84: /* Double-Precision LLA Position Fix and Bias Information */
+ case 0x84: /* Double-Precision LLA Position Fix and Bias Information */
if (len != 36)
break;
- session->newdata.latitude = getbed(buf,0) * RAD_2_DEG;
- session->newdata.longitude = getbed(buf,8) * RAD_2_DEG;
- session->newdata.altitude = getbed(buf,16);
- d1 = getbed(buf,24); /* clock bias */
- f1 = getbef(buf,32); /* time-of-fix */
+ session->newdata.latitude = getbed(buf, 0) * RAD_2_DEG;
+ session->newdata.longitude = getbed(buf, 8) * RAD_2_DEG;
+ session->newdata.altitude = getbed(buf, 16);
+ d1 = getbed(buf, 24); /* clock bias */
+ f1 = getbef(buf, 32); /* time-of-fix */
if (session->driver.tsip.gps_week) {
session->newdata.time =
- gpstime_to_unix((int)session->driver.tsip.gps_week, f1) - session->context->leap_seconds;
- mask |= TIME_SET;
+ gpstime_to_unix((int)session->driver.tsip.gps_week,
+ f1) - session->context->leap_seconds;
+ mask |= TIME_IS;
}
gpsd_report(LOG_INF, "GPS DP LLA %f %f %f %f\n",
session->newdata.time,
session->newdata.latitude,
- session->newdata.longitude,
- session->newdata.altitude);
- mask |= LATLON_SET | ALTITUDE_SET | CLEAR_SET | REPORT_SET;
+ session->newdata.longitude, session->newdata.altitude);
+ mask |= LATLON_IS | ALTITUDE_IS | CLEAR_IS | REPORT_IS;
gpsd_report(LOG_DATA, "DPPLLA 0x84 "
"time=%.2f lat=%.2f lon=%.2f alt=%.2f mask=%s\n",
session->newdata.time,
session->newdata.latitude,
session->newdata.longitude,
- session->newdata.altitude,
- gpsd_maskdump(mask));
+ session->newdata.altitude, gpsd_maskdump(mask));
break;
- case 0x8f: /* Super Packet. Well... */
+ case 0x8f: /* Super Packet. Well... */
/*@ +charint @*/
- u1 = (uint8_t)getub(buf,0);
- (void)snprintf(session->gpsdata.tag+strlen(session->gpsdata.tag),
- sizeof(session->gpsdata.tag)-strlen(session->gpsdata.tag),
- "%02x", (uint)u1);
+ u1 = (uint8_t) getub(buf, 0);
+ (void)snprintf(session->gpsdata.tag + strlen(session->gpsdata.tag),
+ sizeof(session->gpsdata.tag) -
+ strlen(session->gpsdata.tag), "%02x", (uint) u1);
/*@ -charint @*/
- switch (u1) /* sub-packet ID */
- {
- case 0x15: /* Current Datum Values */
+ switch (u1) { /* sub-packet ID */
+ case 0x15: /* Current Datum Values */
if (len != 43)
break;
- s1 = getbesw(buf,1); /* Datum Index */
- d1 = getbed(buf,3); /* DX */
- d2 = getbed(buf,11); /* DY */
- d3 = getbed(buf,19); /* DZ */
- d4 = getbed(buf,27); /* A-axis */
- d5 = getbed(buf,35); /* Eccentricity Squared */
- gpsd_report(LOG_INF, "Current Datum %d %f %f %f %f %f\n",s1,d1,d2,d3,d4,d5);
+ s1 = getbesw(buf, 1); /* Datum Index */
+ d1 = getbed(buf, 3); /* DX */
+ d2 = getbed(buf, 11); /* DY */
+ d3 = getbed(buf, 19); /* DZ */
+ d4 = getbed(buf, 27); /* A-axis */
+ d5 = getbed(buf, 35); /* Eccentricity Squared */
+ gpsd_report(LOG_INF, "Current Datum %d %f %f %f %f %f\n", s1, d1,
+ d2, d3, d4, d5);
break;
- case 0x20: /* Last Fix with Extra Information (binary fixed point) */
+ case 0x20: /* Last Fix with Extra Information (binary fixed point) */
/* XXX CSK sez "why does my Lassen iQ output oversize packets?" */
if ((len != 56) && (len != 64))
break;
- s1 = getbesw(buf,2); /* east velocity */
- s2 = getbesw(buf,4); /* north velocity */
- s3 = getbesw(buf,6); /* up velocity */
- ul1 = getbeul(buf,8); /* time */
- sl1 = getbesl(buf,12); /* latitude */
- ul2 = getbeul(buf,16); /* longitude */
- sl2 = getbesl(buf,20); /* altitude */
- u1 = getub(buf,24); /* velocity scaling */
- u2 = getub(buf,27); /* fix flags */
- u3 = getub(buf,28); /* num svs */
- u4 = getub(buf,29); /* utc offset */
- s4 = getbesw(buf,30); /* tsip.gps_week */
- /* PRN/IODE data follows */
- gpsd_report(LOG_RAW, "LFwEI %d %d %d %u %d %u %u %x %x %u %u %d\n",s1,s2,s3,ul1,sl1,ul2,sl2,u1,u2,u3,u4,s4);
-
- if ((u1 & 0x01) != (uint8_t)0) /* check velocity scaling */
+ s1 = getbesw(buf, 2); /* east velocity */
+ s2 = getbesw(buf, 4); /* north velocity */
+ s3 = getbesw(buf, 6); /* up velocity */
+ ul1 = getbeul(buf, 8); /* time */
+ sl1 = getbesl(buf, 12); /* latitude */
+ ul2 = getbeul(buf, 16); /* longitude */
+ sl2 = getbesl(buf, 20); /* altitude */
+ u1 = getub(buf, 24); /* velocity scaling */
+ u2 = getub(buf, 27); /* fix flags */
+ u3 = getub(buf, 28); /* num svs */
+ u4 = getub(buf, 29); /* utc offset */
+ s4 = getbesw(buf, 30); /* tsip.gps_week */
+ /* PRN/IODE data follows */
+ gpsd_report(LOG_RAW,
+ "LFwEI %d %d %d %u %d %u %u %x %x %u %u %d\n", s1, s2,
+ s3, ul1, sl1, ul2, sl2, u1, u2, u3, u4, s4);
+
+ if ((u1 & 0x01) != (uint8_t) 0) /* check velocity scaling */
d5 = 0.02;
else
d5 = 0.005;
- d1 = s1 * d5; /* east velocity m/s */
- d2 = s2 * d5; /* north velocity m/s */
- session->newdata.climb = s3 * d5; /* up velocity m/s */
+ d1 = s1 * d5; /* east velocity m/s */
+ d2 = s2 * d5; /* north velocity m/s */
+ session->newdata.climb = s3 * d5; /* up velocity m/s */
/*@ -evalorder @*/
- session->newdata.speed = sqrt(pow(d2,2) + pow(d1,2));
+ session->newdata.speed = sqrt(pow(d2, 2) + pow(d1, 2));
/*@ +evalorder @*/
- if ((session->newdata.track = atan2(d1,d2) * RAD_2_DEG) < 0)
+ if ((session->newdata.track = atan2(d1, d2) * RAD_2_DEG) < 0)
session->newdata.track += 360.0;
- session->newdata.latitude = sl1 * SEMI_2_DEG;
- /*@i1@*/session->newdata.longitude = ul2 * SEMI_2_DEG;
+ session->newdata.latitude = sl1 * SEMI_2_DEG;
+ /*@i1@*/ session->newdata.longitude = ul2 * SEMI_2_DEG;
if (session->newdata.longitude > 180.0)
session->newdata.longitude -= 360.0;
- session->gpsdata.separation = wgs84_separation(session->newdata.latitude, session->newdata.longitude);
- session->newdata.altitude = sl2 * 1e-3 - session->gpsdata.separation;;
+ session->gpsdata.separation =
+ wgs84_separation(session->newdata.latitude,
+ session->newdata.longitude);
+ session->newdata.altitude =
+ sl2 * 1e-3 - session->gpsdata.separation;;
session->gpsdata.status = STATUS_NO_FIX;
session->newdata.mode = MODE_NO_FIX;
- if ((u2 & 0x01) == (uint8_t)0) { /* Fix Available */
+ if ((u2 & 0x01) == (uint8_t) 0) { /* Fix Available */
session->gpsdata.status = STATUS_FIX;
- if ((u2 & 0x02) != (uint8_t)0) /* DGPS Corrected */
+ if ((u2 & 0x02) != (uint8_t) 0) /* DGPS Corrected */
session->gpsdata.status = STATUS_DGPS_FIX;
- if ((u2 & 0x04) != (uint8_t)0) /* Fix Dimension */
+ if ((u2 & 0x04) != (uint8_t) 0) /* Fix Dimension */
session->newdata.mode = MODE_2D;
else
session->newdata.mode = MODE_3D;
@@ -636,200 +649,198 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
session->context->valid |= LEAP_SECOND_VALID;
}
session->driver.tsip.gps_week = s4;
- /*@ ignore @*//*@ splint is confused @*/
+ /*@ ignore @*//*@ splint is confused @ */
session->newdata.time =
- gpstime_to_unix((int)s4, ul1 * 1e-3) - session->context->leap_seconds;
+ gpstime_to_unix((int)s4,
+ ul1 * 1e-3) - session->context->leap_seconds;
/*@ end @*/
- mask |= TIME_SET | LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET | STATUS_SET | MODE_SET | CLEAR_SET | REPORT_SET;
+ mask |=
+ TIME_IS | LATLON_IS | ALTITUDE_IS | SPEED_IS | TRACK_IS |
+ CLIMB_IS | STATUS_IS | MODE_IS | CLEAR_IS | REPORT_IS;
gpsd_report(LOG_DATA,
- "SP-LFEI 0x20: time=%.2f lat=%.2f lon=%.2f alt=%.2f "
- "speed=%.2f track=%.2f climb=%.2f "
- "mode=%d status=%d mask=%s\n",
- session->newdata.time,
- session->newdata.latitude,
- session->newdata.longitude,
- session->newdata.altitude,
- session->newdata.speed,
- session->newdata.track,
- session->newdata.climb,
- session->newdata.mode,
- session->gpsdata.status,
- gpsd_maskdump(mask));
+ "SP-LFEI 0x20: time=%.2f lat=%.2f lon=%.2f alt=%.2f "
+ "speed=%.2f track=%.2f climb=%.2f "
+ "mode=%d status=%d mask=%s\n", session->newdata.time,
+ session->newdata.latitude, session->newdata.longitude,
+ session->newdata.altitude, session->newdata.speed,
+ session->newdata.track, session->newdata.climb,
+ session->newdata.mode, session->gpsdata.status,
+ gpsd_maskdump(mask));
break;
- case 0x23: /* Compact Super Packet */
+ case 0x23: /* Compact Super Packet */
session->driver.tsip.req_compact = 0;
/* XXX CSK sez "i don't trust this to not be oversized either." */
if (len < 29)
break;
- ul1 = getbeul(buf,1); /* time */
- s1 = getbesw(buf,5); /* tsip.gps_week */
- u1 = getub(buf,7); /* utc offset */
- u2 = getub(buf,8); /* fix flags */
- sl1 = getbesl(buf,9); /* latitude */
- ul2 = getbeul(buf,13); /* longitude */
- sl3 = getbesl(buf,17); /* altitude */
- s2 = getbesw(buf,21); /* east velocity */
- s3 = getbesw(buf,23); /* north velocity */
- s4 = getbesw(buf,25); /* up velocity */
- gpsd_report(LOG_INF, "CSP %u %d %u %u %d %u %d %d %d %d\n",ul1,s1,u1,u2,sl1,ul2,sl3,s2,s3,s4);
+ ul1 = getbeul(buf, 1); /* time */
+ s1 = getbesw(buf, 5); /* tsip.gps_week */
+ u1 = getub(buf, 7); /* utc offset */
+ u2 = getub(buf, 8); /* fix flags */
+ sl1 = getbesl(buf, 9); /* latitude */
+ ul2 = getbeul(buf, 13); /* longitude */
+ sl3 = getbesl(buf, 17); /* altitude */
+ s2 = getbesw(buf, 21); /* east velocity */
+ s3 = getbesw(buf, 23); /* north velocity */
+ s4 = getbesw(buf, 25); /* up velocity */
+ gpsd_report(LOG_INF, "CSP %u %d %u %u %d %u %d %d %d %d\n", ul1,
+ s1, u1, u2, sl1, ul2, sl3, s2, s3, s4);
session->driver.tsip.gps_week = s1;
if ((int)u1 > 10) {
session->context->leap_seconds = (int)u1;
session->context->valid |= LEAP_SECOND_VALID;
}
- /*@ ignore @*//*@ splint is confused @*/
+ /*@ ignore @*//*@ splint is confused @ */
session->newdata.time =
- gpstime_to_unix((int)s1, ul1 * 1e-3) - session->context->leap_seconds;
+ gpstime_to_unix((int)s1,
+ ul1 * 1e-3) - session->context->leap_seconds;
/*@ end @*/
session->gpsdata.status = STATUS_NO_FIX;
session->newdata.mode = MODE_NO_FIX;
- if ((u2 & 0x01) == (uint8_t)0) { /* Fix Available */
+ if ((u2 & 0x01) == (uint8_t) 0) { /* Fix Available */
session->gpsdata.status = STATUS_FIX;
- if ((u2 & 0x02) != (uint8_t)0) /* DGPS Corrected */
+ if ((u2 & 0x02) != (uint8_t) 0) /* DGPS Corrected */
session->gpsdata.status = STATUS_DGPS_FIX;
- if ((u2 & 0x04) != (uint8_t)0) /* Fix Dimension */
+ if ((u2 & 0x04) != (uint8_t) 0) /* Fix Dimension */
session->newdata.mode = MODE_2D;
else
session->newdata.mode = MODE_3D;
}
- session->newdata.latitude = sl1 * SEMI_2_DEG;
- /*@i1@*/session->newdata.longitude = ul2 * SEMI_2_DEG;
+ session->newdata.latitude = sl1 * SEMI_2_DEG;
+ /*@i1@*/ session->newdata.longitude = ul2 * SEMI_2_DEG;
if (session->newdata.longitude > 180.0)
session->newdata.longitude -= 360.0;
- session->gpsdata.separation = wgs84_separation(session->newdata.latitude, session->newdata.longitude);
- session->newdata.altitude = sl3 * 1e-3 - session->gpsdata.separation;;
- if ((u2 & 0x20) != (uint8_t)0) /* check velocity scaling */
+ session->gpsdata.separation =
+ wgs84_separation(session->newdata.latitude,
+ session->newdata.longitude);
+ session->newdata.altitude =
+ sl3 * 1e-3 - session->gpsdata.separation;;
+ if ((u2 & 0x20) != (uint8_t) 0) /* check velocity scaling */
d5 = 0.02;
else
d5 = 0.005;
- d1 = s2 * d5; /* east velocity m/s */
- d2 = s3 * d5; /* north velocity m/s */
- session->newdata.climb = s4 * d5; /* up velocity m/s */
+ d1 = s2 * d5; /* east velocity m/s */
+ d2 = s3 * d5; /* north velocity m/s */
+ session->newdata.climb = s4 * d5; /* up velocity m/s */
/*@ -evalorder @*/
- session->newdata.speed = sqrt(pow(d2,2) + pow(d1,2)) * MPS_TO_KNOTS;
+ session->newdata.speed =
+ sqrt(pow(d2, 2) + pow(d1, 2)) * MPS_TO_KNOTS;
/*@ +evalorder @*/
- if ((session->newdata.track = atan2(d1,d2) * RAD_2_DEG) < 0)
+ if ((session->newdata.track = atan2(d1, d2) * RAD_2_DEG) < 0)
session->newdata.track += 360.0;
- mask |= TIME_SET | LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET | STATUS_SET | MODE_SET | CLEAR_SET | REPORT_SET;
+ mask |=
+ TIME_IS | LATLON_IS | ALTITUDE_IS | SPEED_IS | TRACK_IS |
+ CLIMB_IS | STATUS_IS | MODE_IS | CLEAR_IS | REPORT_IS;
gpsd_report(LOG_DATA,
- "SP-CSP 0x23: time=%.2f lat=%.2f lon=%.2f alt=%.2f "
- "speed=%.2f track=%.2f climb=%.2f "
- "mode=%d status=%d mask=%s\n",
- session->newdata.time,
- session->newdata.latitude,
- session->newdata.longitude,
- session->newdata.altitude,
- session->newdata.speed,
- session->newdata.track,
- session->newdata.climb,
- session->newdata.mode,
- session->gpsdata.status,
- gpsd_maskdump(mask));
+ "SP-CSP 0x23: time=%.2f lat=%.2f lon=%.2f alt=%.2f "
+ "speed=%.2f track=%.2f climb=%.2f "
+ "mode=%d status=%d mask=%s\n", session->newdata.time,
+ session->newdata.latitude, session->newdata.longitude,
+ session->newdata.altitude, session->newdata.speed,
+ session->newdata.track, session->newdata.climb,
+ session->newdata.mode, session->gpsdata.status,
+ gpsd_maskdump(mask));
break;
case 0xab: /* Thunderbolt Timing Superpacket */
- if (len != 17) {
- gpsd_report(4, "pkt 0xab len=%d\n", len);
- break;
- }
- session->driver.tsip.last_41 = now; /* keep timestamp for request */
- ul1 = getbeul(buf,1); /* gpstime */
- s1 = (short)getbeuw(buf,5); /* week */
- s2 = getbesw(buf,7); /* leap seconds */
-
- session->driver.tsip.gps_week = s1;
- if ((int)u1 > 10) {
- session->context->leap_seconds = (int)s2;
- session->context->valid |= LEAP_SECOND_VALID;
+ if (len != 17) {
+ gpsd_report(4, "pkt 0xab len=%d\n", len);
+ break;
+ }
+ session->driver.tsip.last_41 = now; /* keep timestamp for request */
+ ul1 = getbeul(buf, 1); /* gpstime */
+ s1 = (short)getbeuw(buf, 5); /* week */
+ s2 = getbesw(buf, 7); /* leap seconds */
- session->newdata.time =
- gpstime_to_unix((int)s1, (double)ul1) - (double)s2;
-#ifdef NTPSHM_ENABLE
- if (session->context->enable_ntpshm)
- (void)ntpshm_put(session,session->newdata.time,0.075);
-#endif
- mask |= TIME_SET;
- gpsd_report(LOG_DATA, "SP-TTS 0xab time=%.2f mask={TIME}\n",
- session->newdata.time);
- }
+ session->driver.tsip.gps_week = s1;
+ if ((int)u1 > 10) {
+ session->context->leap_seconds = (int)s2;
+ session->context->valid |= LEAP_SECOND_VALID;
- gpsd_report(4, "GPS Time %u %d %d\n", ul1, s1, s2);
- break;
+ session->newdata.time =
+ gpstime_to_unix((int)s1, (double)ul1) - (double)s2;
+ mask |= TIME_IS;
+ gpsd_report(LOG_DATA, "SP-TTS 0xab time=%.2f mask={TIME}\n",
+ session->newdata.time);
+ }
+
+ gpsd_report(4, "GPS Time %u %d %d\n", ul1, s1, s2);
+ break;
case 0xac: /* Thunderbolt Position Superpacket */
- if (len != 68) {
- gpsd_report(4, "pkt 0xac len=%d\n", len);
+ if (len != 68) {
+ gpsd_report(4, "pkt 0xac len=%d\n", len);
- break;
- }
- session->newdata.latitude = getbed(buf,36) * RAD_2_DEG;
- session->newdata.longitude = getbed(buf,44) * RAD_2_DEG;
- session->newdata.altitude = getbed(buf,52);
- f1 = getbef(buf,16); /* clock bias */
-
- u1 = getub(buf, 12); /* GPS Decoding Status */
- u2 = getub(buf, 1); /* Reciever Mode */
- if (u1 != (uint8_t)0) {
- session->gpsdata.status = STATUS_NO_FIX;
- mask |= STATUS_SET;
- }
- else {
- if (session->gpsdata.status < STATUS_FIX) {
- session->gpsdata.status = STATUS_FIX;
- mask |= STATUS_SET;
+ break;
+ }
+ session->newdata.latitude = getbed(buf, 36) * RAD_2_DEG;
+ session->newdata.longitude = getbed(buf, 44) * RAD_2_DEG;
+ session->newdata.altitude = getbed(buf, 52);
+ f1 = getbef(buf, 16); /* clock bias */
+
+ u1 = getub(buf, 12); /* GPS Decoding Status */
+ u2 = getub(buf, 1); /* Reciever Mode */
+ if (u1 != (uint8_t) 0) {
+ session->gpsdata.status = STATUS_NO_FIX;
+ mask |= STATUS_IS;
+ } else {
+ if (session->gpsdata.status < STATUS_FIX) {
+ session->gpsdata.status = STATUS_FIX;
+ mask |= STATUS_IS;
+ }
}
- }
- /* Decode Fix modes */
- switch (u2 & 7) {
- case 6: /* Clock Hold 2D */
- case 3: /* 2D Position Fix */
- //session->gpsdata.status = STATUS_FIX;
- session->newdata.mode = MODE_2D;
- break;
- case 7: /* Thunderbolt overdetermined clock */
- case 4: /* 3D position Fix */
- //session->gpsdata.status = STATUS_FIX;
- session->newdata.mode = MODE_3D;
- break;
- default:
- //session->gpsdata.status = STATUS_NO_FIX;
- session->newdata.mode = MODE_NO_FIX;
- break;
- }
+ /* Decode Fix modes */
+ switch (u2 & 7) {
+ case 6: /* Clock Hold 2D */
+ case 3: /* 2D Position Fix */
+ //session->gpsdata.status = STATUS_FIX;
+ session->newdata.mode = MODE_2D;
+ break;
+ case 7: /* Thunderbolt overdetermined clock */
+ case 4: /* 3D position Fix */
+ //session->gpsdata.status = STATUS_FIX;
+ session->newdata.mode = MODE_3D;
+ break;
+ default:
+ //session->gpsdata.status = STATUS_NO_FIX;
+ session->newdata.mode = MODE_NO_FIX;
+ break;
+ }
- mask |= LATLON_SET | ALTITUDE_SET | MODE_SET | CLEAR_SET | REPORT_SET;
- gpsd_report(LOG_DATA, "SP-TPS 0xac "
- "time=%.2f lat=%.2f lon=%.2f alt=%.2f mask=%s\n",
- session->newdata.time,
- session->newdata.latitude,
- session->newdata.longitude,
- session->newdata.altitude,
- gpsd_maskdump(mask));
- break;
+ mask |= LATLON_IS | ALTITUDE_IS | MODE_IS | CLEAR_IS | REPORT_IS;
+ gpsd_report(LOG_DATA, "SP-TPS 0xac "
+ "time=%.2f lat=%.2f lon=%.2f alt=%.2f mask=%s\n",
+ session->newdata.time,
+ session->newdata.latitude,
+ session->newdata.longitude,
+ session->newdata.altitude, gpsd_maskdump(mask));
+ break;
default:
- gpsd_report(LOG_WARN,"Unhandled TSIP superpacket type 0x%02x\n",u1);
+ gpsd_report(LOG_WARN, "Unhandled TSIP superpacket type 0x%02x\n",
+ u1);
}
break;
- case 0xbb: /* Navigation Configuration */
+ case 0xbb: /* Navigation Configuration */
if (len != 40)
break;
- u1 = getub(buf,0); /* Subcode */
- u2 = getub(buf,1); /* Operating Dimension */
- u3 = getub(buf,2); /* DGPS Mode */
- u4 = getub(buf,3); /* Dynamics Code */
- f1 = getbef(buf,5); /* Elevation Mask */
- f2 = getbef(buf,9); /* AMU Mask */
- f3 = getbef(buf,13); /* DOP Mask */
- f4 = getbef(buf,17); /* DOP Switch */
- u5 = getub(buf,21); /* DGPS Age Limit */
- gpsd_report(LOG_INF, "Navigation Configuration %u %u %u %u %f %f %f %f %u\n",u1,u2,u3,u4,f1,f2,f3,f4,u5);
+ u1 = getub(buf, 0); /* Subcode */
+ u2 = getub(buf, 1); /* Operating Dimension */
+ u3 = getub(buf, 2); /* DGPS Mode */
+ u4 = getub(buf, 3); /* Dynamics Code */
+ f1 = getbef(buf, 5); /* Elevation Mask */
+ f2 = getbef(buf, 9); /* AMU Mask */
+ f3 = getbef(buf, 13); /* DOP Mask */
+ f4 = getbef(buf, 17); /* DOP Switch */
+ u5 = getub(buf, 21); /* DGPS Age Limit */
+ gpsd_report(LOG_INF,
+ "Navigation Configuration %u %u %u %u %f %f %f %f %u\n",
+ u1, u2, u3, u4, f1, f2, f3, f4, u5);
break;
default:
- gpsd_report(LOG_WARN,"Unhandled TSIP packet type 0x%02x\n",id);
+ gpsd_report(LOG_WARN, "Unhandled TSIP packet type 0x%02x\n", id);
break;
}
@@ -856,7 +867,7 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
if ((now - session->driver.tsip.last_5c) >= 5) {
/* Request Current Satellite Tracking Status */
- putbyte(buf,0,0x00); /* All satellites */
+ putbyte(buf, 0, 0x00); /* All satellites */
(void)tsip_write(session, 0x3c, buf, 1);
session->driver.tsip.last_5c = now;
}
@@ -866,7 +877,6 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
(void)tsip_write(session, 0x26, buf, 0);
session->driver.tsip.last_46 = now;
}
-
#if USE_SUPERPACKET
if ((session->driver.tsip.req_compact > 0) &&
((now - session->driver.tsip.req_compact) > 5)) {
@@ -875,8 +885,8 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
gpsd_report(LOG_WARN, "No Compact Super Packet, use LFwEI\n");
/* Request LFwEI Super Packet */
- putbyte(buf,0,0x20);
- putbyte(buf,1,0x01); /* enabled */
+ putbyte(buf, 0, 0x20);
+ putbyte(buf, 1, 0x01); /* enabled */
(void)tsip_write(session, 0x8e, buf, 2);
}
#endif /* USE_SUPERPACKET */
@@ -895,20 +905,22 @@ static gps_mask_t tsip_parse_input(struct gps_device_t *session)
#ifdef EVERMORE_ENABLE
} else if (session->packet.type == EVERMORE_PACKET) {
(void)gpsd_switch_driver(session, "EverMore binary");
- st = evermore_parse(session, session->packet.outbuffer, session->packet.outbuflen);
+ st = evermore_parse(session, session->packet.outbuffer,
+ session->packet.outbuflen);
session->gpsdata.dev.driver_mode = MODE_BINARY;
return st;
#endif /* EVERMORE_ENABLE */
#ifdef SIRF_ENABLE
- /*
- * mrd reported that once every couple of weeks his SiRF was flipping
- * into Trimble binary mode and not recovering. Damn Trimble for not
- * checksumming their packets, it make palse positives hard to reject.
- * This should enable the SiRF to recover.
- */
+ /*
+ * mrd reported that once every couple of weeks his SiRF was flipping
+ * into Trimble binary mode and not recovering. Damn Trimble for not
+ * checksumming their packets, it makes false positives hard to reject.
+ * This should enable the SiRF to recover.
+ */
} else if (session->packet.type == SIRF_PACKET) {
(void)gpsd_switch_driver(session, "SiRF binary");
- st = sirf_parse(session, session->packet.outbuffer, session->packet.outbuflen);
+ st = sirf_parse(session, session->packet.outbuffer,
+ session->packet.outbuflen);
session->gpsdata.dev.driver_mode = MODE_BINARY;
return st;
#endif /* SIRF_ENABLE */
@@ -918,11 +930,12 @@ static gps_mask_t tsip_parse_input(struct gps_device_t *session)
#ifdef ALLOW_CONTROLSEND
static ssize_t tsip_control_send(struct gps_device_t *session,
- char *buf, size_t buflen)
+ char *buf, size_t buflen)
/* not used by the daemon, it's for gpsctl and friends */
{
- return (ssize_t)tsip_write(session,
- (unsigned int)buf[0], (unsigned char *)buf+1, buflen-1);
+ return (ssize_t) tsip_write(session,
+ (unsigned int)buf[0],
+ (unsigned char *)buf + 1, buflen - 1);
}
#endif /* ALLOW_CONTROLSEND */
@@ -933,10 +946,10 @@ static void tsip_event_hook(struct gps_device_t *session, event_t event)
unsigned char buf[100];
/* I/O Options */
- putbyte(buf,0,0x1e); /* Position: DP, MSL, LLA */
- putbyte(buf,1,0x02); /* Velocity: ENU */
- putbyte(buf,2,0x00); /* Time: GPS */
- putbyte(buf,3,0x08); /* Aux: dBHz */
+ putbyte(buf, 0, 0x1e); /* Position: DP, MSL, LLA */
+ putbyte(buf, 1, 0x02); /* Velocity: ENU */
+ putbyte(buf, 2, 0x00); /* Time: GPS */
+ putbyte(buf, 3, 0x08); /* Aux: dBHz */
(void)tsip_write(session, 0x35, buf, 4);
}
if (event == event_configure) {
@@ -953,7 +966,8 @@ static void tsip_event_hook(struct gps_device_t *session, event_t event)
* heuristic to decide if the parity change is required.
*/
session->driver.tsip.parity = session->gpsdata.dev.parity;
- session->driver.tsip.stopbits = (uint)session->gpsdata.dev.stopbits;
+ session->driver.tsip.stopbits =
+ (uint) session->gpsdata.dev.stopbits;
// gpsd_set_speed(session, session->gpsdata.dev.baudrate, 'O', 1);
break;
@@ -974,23 +988,23 @@ static void tsip_event_hook(struct gps_device_t *session, event_t event)
putbelong(buf, 5, i_f.i);
/* - PDOP mask */
i_f.f = 8.0;
- putbelong(buf ,9, i_f.i);
+ putbelong(buf, 9, i_f.i);
/* - PDOP switch */
i_f.f = 6.0;
putbelong(buf, 13, i_f.i);
/*@ +shiftimplementation @*/
(void)tsip_write(session, 0x2c, buf, 17);
/* Set Position Fix Mode (auto 2D/3D) */
- putbyte(buf,0,0x00);
+ putbyte(buf, 0, 0x00);
(void)tsip_write(session, 0x22, buf, 1);
/* Request GPS Systems Message */
(void)tsip_write(session, 0x28, NULL, 0);
/* Request Current Datum Values */
(void)tsip_write(session, 0x37, NULL, 0);
- putbyte(buf,0,0x15);
+ putbyte(buf, 0, 0x15);
(void)tsip_write(session, 0x8e, buf, 1);
/* Request Navigation Configuration */
- putbyte(buf,0,0x03);
+ putbyte(buf, 0, 0x03);
(void)tsip_write(session, 0xbb, buf, 1);
break;
}
@@ -998,16 +1012,15 @@ static void tsip_event_hook(struct gps_device_t *session, event_t event)
if (event == event_deactivate) {
/* restore saved parity and stopbits when leaving TSIP mode */
gpsd_set_speed(session,
- session->gpsdata.dev.baudrate,
- session->driver.tsip.parity,
- session->driver.tsip.stopbits);
+ session->gpsdata.dev.baudrate,
+ session->driver.tsip.parity,
+ session->driver.tsip.stopbits);
}
}
#ifdef ALLOW_RECONFIGURE
static bool tsip_speed_switch(struct gps_device_t *session,
- speed_t speed,
- char parity, int stopbits)
+ speed_t speed, char parity, int stopbits)
{
unsigned char buf[100];
@@ -1027,19 +1040,19 @@ static bool tsip_speed_switch(struct gps_device_t *session,
break;
}
- putbyte(buf,0,0xff); /* current port */
- putbyte(buf,1,(round(log((double)speed/300)/M_LN2))+2); /* input dev.baudrate */
- putbyte(buf,2,getub(buf,1)); /* output baudrate */
- putbyte(buf,3,3); /* character width (8 bits) */
- putbyte(buf,4,parity); /* parity (normally odd) */
- putbyte(buf,5,stopbits-1); /* stop bits (normally 1 stopbit) */
- putbyte(buf,6,0); /* flow control (none) */
- putbyte(buf,7,0x02); /* input protocol (TSIP) */
- putbyte(buf,8,0x02); /* output protocol (TSIP) */
- putbyte(buf,9,0); /* reserved */
+ putbyte(buf, 0, 0xff); /* current port */
+ putbyte(buf, 1, (round(log((double)speed / 300) / M_LN2)) + 2); /* input dev.baudrate */
+ putbyte(buf, 2, getub(buf, 1)); /* output baudrate */
+ putbyte(buf, 3, 3); /* character width (8 bits) */
+ putbyte(buf, 4, parity); /* parity (normally odd) */
+ putbyte(buf, 5, stopbits - 1); /* stop bits (normally 1 stopbit) */
+ putbyte(buf, 6, 0); /* flow control (none) */
+ putbyte(buf, 7, 0x02); /* input protocol (TSIP) */
+ putbyte(buf, 8, 0x02); /* output protocol (TSIP) */
+ putbyte(buf, 9, 0); /* reserved */
(void)tsip_write(session, 0xbc, buf, 10);
- return true; /* it would be nice to error-check this */
+ return true; /* it would be nice to error-check this */
}
static void tsip_mode(struct gps_device_t *session, int mode)
@@ -1049,13 +1062,13 @@ static void tsip_mode(struct gps_device_t *session, int mode)
if (mode == MODE_NMEA) {
/* First turn on the NMEA messages we want */
- putbyte(buf,0,0x00); /* subcode 0 */
- putbyte(buf,1,0x01); /* 1-second fix interval */
- putbyte(buf,2,0x00); /* Reserved */
- putbyte(buf,3,0x00); /* Reserved */
- putbyte(buf,4,0x01); /* 0=RMC, 1-7=Reserved */
- putbyte(buf,5,0x19); /* 0=GGA, 1=GGL, 2=VTG, 3=GSV, */
- /* 4=GSA, 5=ZDA, 6-7=Reserved */
+ putbyte(buf, 0, 0x00); /* subcode 0 */
+ putbyte(buf, 1, 0x01); /* 1-second fix interval */
+ putbyte(buf, 2, 0x00); /* Reserved */
+ putbyte(buf, 3, 0x00); /* Reserved */
+ putbyte(buf, 4, 0x01); /* 0=RMC, 1-7=Reserved */
+ putbyte(buf, 5, 0x19); /* 0=GGA, 1=GGL, 2=VTG, 3=GSV, */
+ /* 4=GSA, 5=ZDA, 6-7=Reserved */
(void)tsip_write(session, 0x7A, buf, 6);
@@ -1063,16 +1076,16 @@ static void tsip_mode(struct gps_device_t *session, int mode)
memset(buf, 0, sizeof(buf));
- putbyte(buf,0,0xff); /* current port */
- putbyte(buf,1,0x06); /* 4800 bps input */
- putbyte(buf,2,0x06); /* 4800 bps output */
- putbyte(buf,3,0x03); /* 8 data bits */
- putbyte(buf,4,0x00); /* No parity */
- putbyte(buf,5,0x00); /* 1 stop bit */
- putbyte(buf,6,0x00); /* No flow control */
- putbyte(buf,7,0x02); /* Input protocol TSIP */
- putbyte(buf,8,0x04); /* Output protocol NMEA */
- putbyte(buf,9,0x00); /* Reserved */
+ putbyte(buf, 0, 0xff); /* current port */
+ putbyte(buf, 1, 0x06); /* 4800 bps input */
+ putbyte(buf, 2, 0x06); /* 4800 bps output */
+ putbyte(buf, 3, 0x03); /* 8 data bits */
+ putbyte(buf, 4, 0x00); /* No parity */
+ putbyte(buf, 5, 0x00); /* 1 stop bit */
+ putbyte(buf, 6, 0x00); /* No flow control */
+ putbyte(buf, 7, 0x02); /* Input protocol TSIP */
+ putbyte(buf, 8, 0x04); /* Output protocol NMEA */
+ putbyte(buf, 9, 0x00); /* Reserved */
(void)tsip_write(session, 0xBC, buf, 10);
@@ -1089,7 +1102,16 @@ static void tsip_mode(struct gps_device_t *session, int mode)
}
#endif /* ALLOW_RECONFIGURE */
+#ifdef NTPSHM_ENABLE
+static double tsip_ntp_offset(struct gps_device_t *session)
+{
+ /* FIXME: is a constant offset right here? */
+ return 0.075;
+}
+#endif /* NTPSHM_ENABLE */
+
/* this is everything we export */
+/* *INDENT-OFF* */
const struct gps_type_t tsip_binary =
{
.type_name = "Trimble TSIP", /* full name of type */
@@ -1110,6 +1132,10 @@ const struct gps_type_t tsip_binary =
#ifdef ALLOW_CONTROLSEND
.control_send = tsip_control_send,/* how to send commands */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = tsip_ntp_offset,
+#endif /* NTPSHM_ENABLE */
};
+/* *INDENT-ON* */
#endif /* TSIP_ENABLE */
diff --git a/driver_ubx.c b/driver_ubx.c
index 9295cd1c..ffd7f61c 100644
--- a/driver_ubx.c
+++ b/driver_ubx.c
@@ -37,22 +37,25 @@
* see also the FV25 and UBX documents on reference.html
*/
-
- bool ubx_write(struct gps_device_t *session, unsigned int msg_class, unsigned int msg_id, unsigned char *msg, unsigned short data_len);
- gps_mask_t ubx_parse(struct gps_device_t *session, unsigned char *buf, size_t len);
- void ubx_catch_model(struct gps_device_t *session, unsigned char *buf, size_t len);
-static gps_mask_t ubx_msg_nav_sol(struct gps_device_t *session, unsigned char *buf, size_t data_len);
-static gps_mask_t ubx_msg_nav_dop(struct gps_device_t *session, unsigned char *buf, size_t data_len);
-static gps_mask_t ubx_msg_nav_timegps(struct gps_device_t *session, unsigned char *buf, size_t data_len);
-static gps_mask_t ubx_msg_nav_svinfo(struct gps_device_t *session, unsigned char *buf, size_t data_len);
-static void ubx_msg_sbas(struct gps_device_t *session, unsigned char *buf);
-static void ubx_msg_inf(unsigned char *buf, size_t data_len);
+static gps_mask_t ubx_parse(struct gps_device_t *session, unsigned char *buf,
+ size_t len);
+static gps_mask_t ubx_msg_nav_sol(struct gps_device_t *session,
+ unsigned char *buf, size_t data_len);
+static gps_mask_t ubx_msg_nav_dop(struct gps_device_t *session,
+ unsigned char *buf, size_t data_len);
+static gps_mask_t ubx_msg_nav_timegps(struct gps_device_t *session,
+ unsigned char *buf, size_t data_len);
+static gps_mask_t ubx_msg_nav_svinfo(struct gps_device_t *session,
+ unsigned char *buf, size_t data_len);
+static void ubx_msg_sbas(struct gps_device_t *session, unsigned char *buf);
+static void ubx_msg_inf(unsigned char *buf, size_t data_len);
/**
* Navigation solution message
*/
static gps_mask_t
-ubx_msg_nav_sol(struct gps_device_t *session, unsigned char *buf, size_t data_len)
+ubx_msg_nav_sol(struct gps_device_t *session, unsigned char *buf,
+ size_t data_len)
{
unsigned short gw;
unsigned int tow, flags;
@@ -66,32 +69,29 @@ ubx_msg_nav_sol(struct gps_device_t *session, unsigned char *buf, size_t data_le
flags = (unsigned int)getub(buf, 11);
mask = 0;
- if ((flags & (UBX_SOL_VALID_WEEK |UBX_SOL_VALID_TIME)) != 0) {
+ if ((flags & (UBX_SOL_VALID_WEEK | UBX_SOL_VALID_TIME)) != 0) {
tow = (unsigned int)getleul(buf, 0);
gw = (unsigned short)getlesw(buf, 8);
session->driver.ubx.gps_week = gw;
- t = gpstime_to_unix((int)session->driver.ubx.gps_week, tow/1000.0) - session->context->leap_seconds;
+ t = gpstime_to_unix((int)session->driver.ubx.gps_week,
+ tow / 1000.0) - session->context->leap_seconds;
session->newdata.time = t;
- mask |= TIME_SET;
-#ifdef NTPSHM_ENABLE
- /* TODO overhead */
- if (session->context->enable_ntpshm)
- (void)ntpshm_put(session, t,0);
-#endif
+ mask |= TIME_IS;
}
- epx = (double)(getlesl(buf, 12)/100.0);
- epy = (double)(getlesl(buf, 16)/100.0);
- epz = (double)(getlesl(buf, 20)/100.0);
- evx = (double)(getlesl(buf, 28)/100.0);
- evy = (double)(getlesl(buf, 32)/100.0);
- evz = (double)(getlesl(buf, 36)/100.0);
+ epx = (double)(getlesl(buf, 12) / 100.0);
+ epy = (double)(getlesl(buf, 16) / 100.0);
+ epz = (double)(getlesl(buf, 20) / 100.0);
+ evx = (double)(getlesl(buf, 28) / 100.0);
+ evy = (double)(getlesl(buf, 32) / 100.0);
+ evz = (double)(getlesl(buf, 36) / 100.0);
ecef_to_wgs84fix(&session->newdata, &session->gpsdata.separation,
epx, epy, epz, evx, evy, evz);
- mask |= LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET;
- session->newdata.epx = session->newdata.epy = (double)(getlesl(buf, 24)/100.0)/sqrt(2);
- session->newdata.eps = (double)(getlesl(buf, 40)/100.0);
+ mask |= LATLON_IS | ALTITUDE_IS | SPEED_IS | TRACK_IS | CLIMB_IS;
+ session->newdata.epx = session->newdata.epy =
+ (double)(getlesl(buf, 24) / 100.0) / sqrt(2);
+ session->newdata.eps = (double)(getlesl(buf, 40) / 100.0);
/* Better to have a single point of truth about DOPs */
//session->gpsdata.dop.pdop = (double)(getleuw(buf, 44)/100.0);
session->gpsdata.satellites_used = (int)getub(buf, 47);
@@ -103,8 +103,8 @@ ubx_msg_nav_sol(struct gps_device_t *session, unsigned char *buf, size_t data_le
session->newdata.mode = MODE_3D;
break;
case UBX_MODE_2D:
- case UBX_MODE_DR: /* consider this too as 2D */
- case UBX_MODE_GPSDR: /* XXX DR-aided GPS may be valid 3D */
+ case UBX_MODE_DR: /* consider this too as 2D */
+ case UBX_MODE_GPSDR: /* XXX DR-aided GPS may be valid 3D */
session->newdata.mode = MODE_2D;
break;
default:
@@ -116,8 +116,8 @@ ubx_msg_nav_sol(struct gps_device_t *session, unsigned char *buf, size_t data_le
else if (session->newdata.mode != MODE_NO_FIX)
session->gpsdata.status = STATUS_FIX;
- mask |= MODE_SET | STATUS_SET;
- gpsd_report(LOG_DATA,
+ mask |= MODE_IS | STATUS_IS;
+ gpsd_report(LOG_DATA,
"NAVSOL: time=%.2f lat=%.2f lon=%.2f alt=%.2f track=%.2f speed=%.2f climb=%.2f mode=%d status=%d used=%d mask=%s\n",
session->newdata.time,
session->newdata.latitude,
@@ -128,8 +128,7 @@ ubx_msg_nav_sol(struct gps_device_t *session, unsigned char *buf, size_t data_le
session->newdata.climb,
session->newdata.mode,
session->gpsdata.status,
- session->gpsdata.satellites_used,
- gpsd_maskdump(mask));
+ session->gpsdata.satellites_used, gpsd_maskdump(mask));
return mask;
}
@@ -137,32 +136,33 @@ ubx_msg_nav_sol(struct gps_device_t *session, unsigned char *buf, size_t data_le
* Dilution of precision message
*/
static gps_mask_t
-ubx_msg_nav_dop(struct gps_device_t *session, unsigned char *buf, size_t data_len)
+ubx_msg_nav_dop(struct gps_device_t *session, unsigned char *buf,
+ size_t data_len)
{
if (data_len != 18)
return 0;
clear_dop(&session->gpsdata.dop);
- session->gpsdata.dop.gdop = (double)(getleuw(buf, 4)/100.0);
- session->gpsdata.dop.pdop = (double)(getleuw(buf, 6)/100.0);
- session->gpsdata.dop.tdop = (double)(getleuw(buf, 8)/100.0);
- session->gpsdata.dop.vdop = (double)(getleuw(buf, 10)/100.0);
- session->gpsdata.dop.hdop = (double)(getleuw(buf, 12)/100.0);
+ session->gpsdata.dop.gdop = (double)(getleuw(buf, 4) / 100.0);
+ session->gpsdata.dop.pdop = (double)(getleuw(buf, 6) / 100.0);
+ session->gpsdata.dop.tdop = (double)(getleuw(buf, 8) / 100.0);
+ session->gpsdata.dop.vdop = (double)(getleuw(buf, 10) / 100.0);
+ session->gpsdata.dop.hdop = (double)(getleuw(buf, 12) / 100.0);
gpsd_report(LOG_DATA, "NAVDOP: gdop=%.2f pdop=%.2f "
"hdop=%.2f vdop=%.2f tdop=%.2f mask={DOP}\n",
session->gpsdata.dop.gdop,
session->gpsdata.dop.hdop,
session->gpsdata.dop.vdop,
- session->gpsdata.dop.pdop,
- session->gpsdata.dop.tdop);
- return DOP_SET;
+ session->gpsdata.dop.pdop, session->gpsdata.dop.tdop);
+ return DOP_IS;
}
/**
* GPS Leap Seconds
*/
static gps_mask_t
-ubx_msg_nav_timegps(struct gps_device_t *session, unsigned char *buf, size_t data_len)
+ubx_msg_nav_timegps(struct gps_device_t *session, unsigned char *buf,
+ size_t data_len)
{
unsigned int gw, tow, flags;
double t;
@@ -179,36 +179,40 @@ ubx_msg_nav_timegps(struct gps_device_t *session, unsigned char *buf, size_t dat
if ((flags & 0x7) != 0)
session->context->leap_seconds = (int)getub(buf, 10);
- t = gpstime_to_unix((int)session->driver.ubx.gps_week, tow/1000.0) - session->context->leap_seconds;
+ t = gpstime_to_unix((int)session->driver.ubx.gps_week,
+ tow / 1000.0) - session->context->leap_seconds;
session->newdata.time = t;
gpsd_report(LOG_DATA, "TIMEGPS: time=%.2f mask={TIME}\n",
session->newdata.time);
- return TIME_SET;
+ return TIME_IS;
}
/**
* GPS Satellite Info
*/
static gps_mask_t
-ubx_msg_nav_svinfo(struct gps_device_t *session, unsigned char *buf, size_t data_len)
+ubx_msg_nav_svinfo(struct gps_device_t *session, unsigned char *buf,
+ size_t data_len)
{
unsigned int i, j, nchan, nsv, st;
- if (data_len < 152 ) {
+ if (data_len < 152) {
gpsd_report(LOG_PROG, "runt svinfo (datalen=%zd)\n", data_len);
return 0;
}
#if 0
// Alas, this sentence doesn't supply GPS week
tow = getleul(buf, 0);
- session->gpsdata.skyview_time = gpstime_to_unix(gps_week, tow)
+ session->gpsdata.skyview_time = gpstime_to_unix(gps_week, tow)
- session->context->leap_seconds;
#endif
/*@ +charint @*/
nchan = (unsigned int)getub(buf, 4);
if (nchan > MAXCHANNELS) {
- gpsd_report(LOG_WARN, "Invalid NAV SVINFO message, >%d reported visible",MAXCHANNELS);
+ gpsd_report(LOG_WARN,
+ "Invalid NAV SVINFO message, >%d reported visible",
+ MAXCHANNELS);
return 0;
}
/*@ -charint @*/
@@ -216,15 +220,16 @@ ubx_msg_nav_svinfo(struct gps_device_t *session, unsigned char *buf, size_t data
nsv = 0;
for (i = j = st = 0; i < nchan; i++) {
unsigned int off = 8 + 12 * i;
- if((int)getub(buf, off+4) == 0) continue; /* LEA-5H seems to have a bug reporting sats it does not see or hear*/
- session->gpsdata.PRN[j] = (int)getub(buf, off+1);
- session->gpsdata.ss[j] = (float)getub(buf, off+4);
- session->gpsdata.elevation[j] = (int)getsb(buf, off+5);
- session->gpsdata.azimuth[j] = (int)getlesw(buf, off+6);
- if(session->gpsdata.PRN[j])
- st++;
+ if ((int)getub(buf, off + 4) == 0)
+ continue; /* LEA-5H seems to have a bug reporting sats it does not see or hear */
+ session->gpsdata.PRN[j] = (int)getub(buf, off + 1);
+ session->gpsdata.ss[j] = (float)getub(buf, off + 4);
+ session->gpsdata.elevation[j] = (int)getsb(buf, off + 5);
+ session->gpsdata.azimuth[j] = (int)getlesw(buf, off + 6);
+ if (session->gpsdata.PRN[j])
+ st++;
/*@ -predboolothers */
- if (getub(buf, off+2) & 0x01)
+ if (getub(buf, off + 2) & 0x01)
session->gpsdata.used[nsv++] = session->gpsdata.PRN[j];
if (session->gpsdata.PRN[j] == (int)session->driver.ubx.sbas_in_use)
session->gpsdata.used[nsv++] = session->gpsdata.PRN[j];
@@ -234,24 +239,24 @@ ubx_msg_nav_svinfo(struct gps_device_t *session, unsigned char *buf, size_t data
session->gpsdata.skyview_time = NAN;
session->gpsdata.satellites_visible = (int)st;
session->gpsdata.satellites_used = (int)nsv;
- gpsd_report(LOG_DATA,
- "SVINFO: visible=%d used=%d mask={SATELLITE|USED}\n",
- session->gpsdata.satellites_visible,
- session->gpsdata.satellites_used);
- return SATELLITE_SET | USED_SET;
+ gpsd_report(LOG_DATA,
+ "SVINFO: visible=%d used=%d mask={SATELLITE|USED}\n",
+ session->gpsdata.satellites_visible,
+ session->gpsdata.satellites_used);
+ return SATELLITE_IS | USED_IS;
}
/*
* SBAS Info
*/
-static void
-ubx_msg_sbas(struct gps_device_t *session, unsigned char *buf)
+static void ubx_msg_sbas(struct gps_device_t *session, unsigned char *buf)
{
#ifdef UBX_SBAS_DEBUG
unsigned int i, nsv;
gpsd_report(LOG_WARN, "SBAS: %d %d %d %d %d\n",
- (int)getub(buf, 4), (int)getub(buf, 5), (int)getub(buf, 6), (int)getub(buf, 7), (int)getub(buf, 8));
+ (int)getub(buf, 4), (int)getub(buf, 5), (int)getub(buf, 6),
+ (int)getub(buf, 7), (int)getub(buf, 8));
nsv = (int)getub(buf, 8);
for (i = 0; i < nsv; i++) {
@@ -267,16 +272,19 @@ ubx_msg_sbas(struct gps_device_t *session, unsigned char *buf)
/*
* Raw Subframes
*/
-static void
-ubx_msg_sfrb(struct gps_device_t *session, unsigned char *buf)
+static void ubx_msg_sfrb(struct gps_device_t *session, unsigned char *buf)
{
- unsigned int words[10], chan, svid;
+ unsigned int preamble, words[10], chan, svid;
- gpsd_report(LOG_PROG, "UBX_RXM_SFRB\n");
chan = (unsigned int)getub(buf, 0);
svid = (unsigned int)getub(buf, 1);
- words[0] = (unsigned int)getleul(buf, 2) & 0xffffff;
- words[1] = (unsigned int)getleul(buf, 6) & 0xffffff;
+ gpsd_report(LOG_PROG, "UBX_RXM_SFRB: %u %u\n", chan, svid);
+ /* UBX does all the parity checking, but still bad data gets through */
+ words[0] = (unsigned int)getleul(buf, 2) & 0xffffff;
+ preamble = (words[0] >> 16) & 0xff;
+ if ((preamble != 0x74) && (preamble != 0x8b))
+ return;
+ words[1] = (unsigned int)getleul(buf, 6) & 0xffffff;
words[2] = (unsigned int)getleul(buf, 10) & 0xffffff;
words[3] = (unsigned int)getleul(buf, 14) & 0xffffff;
words[4] = (unsigned int)getleul(buf, 18) & 0xffffff;
@@ -288,211 +296,216 @@ ubx_msg_sfrb(struct gps_device_t *session, unsigned char *buf)
gpsd_interpret_subframe(session, words);
}
-static void
-ubx_msg_inf(unsigned char *buf, size_t data_len)
+static void ubx_msg_inf(unsigned char *buf, size_t data_len)
{
unsigned short msgid;
static char txtbuf[MAX_PACKET_LENGTH];
msgid = (unsigned short)((buf[2] << 8) | buf[3]);
- if (data_len > MAX_PACKET_LENGTH-1)
- data_len = MAX_PACKET_LENGTH-1;
+ if (data_len > MAX_PACKET_LENGTH - 1)
+ data_len = MAX_PACKET_LENGTH - 1;
- (void)strlcpy(txtbuf, (char *)buf+6, MAX_PACKET_LENGTH); txtbuf[data_len] = '\0';
+ (void)strlcpy(txtbuf, (char *)buf + 6, MAX_PACKET_LENGTH);
+ txtbuf[data_len] = '\0';
switch (msgid) {
- case UBX_INF_DEBUG:
- gpsd_report(LOG_PROG, "UBX_INF_DEBUG: %s\n", txtbuf);
- break;
- case UBX_INF_TEST:
- gpsd_report(LOG_PROG, "UBX_INF_TEST: %s\n", txtbuf);
- break;
- case UBX_INF_NOTICE:
- gpsd_report(LOG_INF, "UBX_INF_NOTICE: %s\n", txtbuf);
- break;
- case UBX_INF_WARNING:
- gpsd_report(LOG_WARN, "UBX_INF_WARNING: %s\n", txtbuf);
- break;
- case UBX_INF_ERROR:
- gpsd_report(LOG_WARN, "UBX_INF_ERROR: %s\n", txtbuf);
- break;
- default:
- break;
+ case UBX_INF_DEBUG:
+ gpsd_report(LOG_PROG, "UBX_INF_DEBUG: %s\n", txtbuf);
+ break;
+ case UBX_INF_TEST:
+ gpsd_report(LOG_PROG, "UBX_INF_TEST: %s\n", txtbuf);
+ break;
+ case UBX_INF_NOTICE:
+ gpsd_report(LOG_INF, "UBX_INF_NOTICE: %s\n", txtbuf);
+ break;
+ case UBX_INF_WARNING:
+ gpsd_report(LOG_WARN, "UBX_INF_WARNING: %s\n", txtbuf);
+ break;
+ case UBX_INF_ERROR:
+ gpsd_report(LOG_WARN, "UBX_INF_ERROR: %s\n", txtbuf);
+ break;
+ default:
+ break;
}
- return ;
+ return;
}
/*@ +charint @*/
-gps_mask_t ubx_parse(struct gps_device_t *session, unsigned char *buf, size_t len)
+gps_mask_t ubx_parse(struct gps_device_t * session, unsigned char *buf,
+ size_t len)
{
size_t data_len;
unsigned short msgid;
gps_mask_t mask = 0;
int i;
- if (len < 6) /* the packet at least contains a head of six bytes */
+ if (len < 6) /* the packet at least contains a head of six bytes */
return 0;
session->cycle_end_reliable = true;
-
+
/* extract message id and length */
msgid = (buf[2] << 8) | buf[3];
- data_len = (size_t)getlesw(buf, 4);
- switch (msgid)
- {
- case UBX_NAV_POSECEF:
- gpsd_report(LOG_IO, "UBX_NAV_POSECEF\n");
- break;
- case UBX_NAV_POSLLH:
- gpsd_report(LOG_IO, "UBX_NAV_POSLLH\n");
- break;
- case UBX_NAV_STATUS:
- gpsd_report(LOG_IO, "UBX_NAV_STATUS\n");
- break;
- case UBX_NAV_DOP:
- gpsd_report(LOG_PROG, "UBX_NAV_DOP\n");
- mask = ubx_msg_nav_dop(session, &buf[6], data_len);
- break;
- case UBX_NAV_SOL:
- gpsd_report(LOG_PROG, "UBX_NAV_SOL\n");
- mask = ubx_msg_nav_sol(session, &buf[6], data_len) | (CLEAR_SET | REPORT_SET);
- break;
- case UBX_NAV_POSUTM:
- gpsd_report(LOG_IO, "UBX_NAV_POSUTM\n");
- break;
- case UBX_NAV_VELECEF:
- gpsd_report(LOG_IO, "UBX_NAV_VELECEF\n");
- break;
- case UBX_NAV_VELNED:
- gpsd_report(LOG_IO, "UBX_NAV_VELNED\n");
- break;
- case UBX_NAV_TIMEGPS:
- gpsd_report(LOG_PROG, "UBX_NAV_TIMEGPS\n");
- mask = ubx_msg_nav_timegps(session, &buf[6], data_len);
- break;
- case UBX_NAV_TIMEUTC:
- gpsd_report(LOG_IO, "UBX_NAV_TIMEUTC\n");
- break;
- case UBX_NAV_CLOCK:
- gpsd_report(LOG_IO, "UBX_NAV_CLOCK\n");
- break;
- case UBX_NAV_SVINFO:
- gpsd_report(LOG_PROG, "UBX_NAV_SVINFO\n");
- mask = ubx_msg_nav_svinfo(session, &buf[6], data_len);
- break;
- case UBX_NAV_DGPS:
- gpsd_report(LOG_IO, "UBX_NAV_DGPS\n");
- break;
- case UBX_NAV_SBAS:
- gpsd_report(LOG_IO, "UBX_NAV_SBAS\n");
- ubx_msg_sbas(session, &buf[6]);
- break;
- case UBX_NAV_EKFSTATUS:
- gpsd_report(LOG_IO, "UBX_NAV_EKFSTATUS\n");
- break;
+ data_len = (size_t) getlesw(buf, 4);
+ switch (msgid) {
+ case UBX_NAV_POSECEF:
+ gpsd_report(LOG_IO, "UBX_NAV_POSECEF\n");
+ break;
+ case UBX_NAV_POSLLH:
+ gpsd_report(LOG_IO, "UBX_NAV_POSLLH\n");
+ break;
+ case UBX_NAV_STATUS:
+ gpsd_report(LOG_IO, "UBX_NAV_STATUS\n");
+ break;
+ case UBX_NAV_DOP:
+ gpsd_report(LOG_PROG, "UBX_NAV_DOP\n");
+ mask = ubx_msg_nav_dop(session, &buf[6], data_len);
+ break;
+ case UBX_NAV_SOL:
+ gpsd_report(LOG_PROG, "UBX_NAV_SOL\n");
+ mask =
+ ubx_msg_nav_sol(session, &buf[6],
+ data_len) | (CLEAR_IS | REPORT_IS);
+ break;
+ case UBX_NAV_POSUTM:
+ gpsd_report(LOG_IO, "UBX_NAV_POSUTM\n");
+ break;
+ case UBX_NAV_VELECEF:
+ gpsd_report(LOG_IO, "UBX_NAV_VELECEF\n");
+ break;
+ case UBX_NAV_VELNED:
+ gpsd_report(LOG_IO, "UBX_NAV_VELNED\n");
+ break;
+ case UBX_NAV_TIMEGPS:
+ gpsd_report(LOG_PROG, "UBX_NAV_TIMEGPS\n");
+ mask = ubx_msg_nav_timegps(session, &buf[6], data_len);
+ break;
+ case UBX_NAV_TIMEUTC:
+ gpsd_report(LOG_IO, "UBX_NAV_TIMEUTC\n");
+ break;
+ case UBX_NAV_CLOCK:
+ gpsd_report(LOG_IO, "UBX_NAV_CLOCK\n");
+ break;
+ case UBX_NAV_SVINFO:
+ gpsd_report(LOG_PROG, "UBX_NAV_SVINFO\n");
+ mask = ubx_msg_nav_svinfo(session, &buf[6], data_len);
+ break;
+ case UBX_NAV_DGPS:
+ gpsd_report(LOG_IO, "UBX_NAV_DGPS\n");
+ break;
+ case UBX_NAV_SBAS:
+ gpsd_report(LOG_IO, "UBX_NAV_SBAS\n");
+ ubx_msg_sbas(session, &buf[6]);
+ break;
+ case UBX_NAV_EKFSTATUS:
+ gpsd_report(LOG_IO, "UBX_NAV_EKFSTATUS\n");
+ break;
- case UBX_RXM_RAW:
- gpsd_report(LOG_IO, "UBX_RXM_RAW\n");
- break;
- case UBX_RXM_SFRB:
- ubx_msg_sfrb(session, &buf[6]);
- break;
- case UBX_RXM_SVSI:
- gpsd_report(LOG_PROG, "UBX_RXM_SVSI\n");
- break;
- case UBX_RXM_ALM:
- gpsd_report(LOG_IO, "UBX_RXM_ALM\n");
- break;
- case UBX_RXM_EPH:
- gpsd_report(LOG_IO, "UBX_RXM_EPH\n");
- break;
- case UBX_RXM_POSREQ:
- gpsd_report(LOG_IO, "UBX_RXM_POSREQ\n");
- break;
+ case UBX_RXM_RAW:
+ gpsd_report(LOG_IO, "UBX_RXM_RAW\n");
+ break;
+ case UBX_RXM_SFRB:
+ ubx_msg_sfrb(session, &buf[6]);
+ break;
+ case UBX_RXM_SVSI:
+ gpsd_report(LOG_PROG, "UBX_RXM_SVSI\n");
+ break;
+ case UBX_RXM_ALM:
+ gpsd_report(LOG_IO, "UBX_RXM_ALM\n");
+ break;
+ case UBX_RXM_EPH:
+ gpsd_report(LOG_IO, "UBX_RXM_EPH\n");
+ break;
+ case UBX_RXM_POSREQ:
+ gpsd_report(LOG_IO, "UBX_RXM_POSREQ\n");
+ break;
- case UBX_MON_SCHED:
- gpsd_report(LOG_IO, "UBX_MON_SCHED\n");
- break;
- case UBX_MON_IO:
- gpsd_report(LOG_IO, "UBX_MON_IO\n");
- break;
- case UBX_MON_IPC:
- gpsd_report(LOG_IO, "UBX_MON_IPC\n");
- break;
- case UBX_MON_VER:
- gpsd_report(LOG_IO, "UBX_MON_VER\n");
- break;
- case UBX_MON_EXCEPT:
- gpsd_report(LOG_IO, "UBX_MON_EXCEPT\n");
- break;
- case UBX_MON_MSGPP:
- gpsd_report(LOG_IO, "UBX_MON_MSGPP\n");
- break;
- case UBX_MON_RXBUF:
- gpsd_report(LOG_IO, "UBX_MON_RXBUF\n");
- break;
- case UBX_MON_TXBUF:
- gpsd_report(LOG_IO, "UBX_MON_TXBUF\n");
- break;
- case UBX_MON_HW:
- gpsd_report(LOG_IO, "UBX_MON_HW\n");
- break;
- case UBX_MON_USB:
- gpsd_report(LOG_IO, "UBX_MON_USB\n");
- break;
+ case UBX_MON_SCHED:
+ gpsd_report(LOG_IO, "UBX_MON_SCHED\n");
+ break;
+ case UBX_MON_IO:
+ gpsd_report(LOG_IO, "UBX_MON_IO\n");
+ break;
+ case UBX_MON_IPC:
+ gpsd_report(LOG_IO, "UBX_MON_IPC\n");
+ break;
+ case UBX_MON_VER:
+ gpsd_report(LOG_IO, "UBX_MON_VER\n");
+ break;
+ case UBX_MON_EXCEPT:
+ gpsd_report(LOG_IO, "UBX_MON_EXCEPT\n");
+ break;
+ case UBX_MON_MSGPP:
+ gpsd_report(LOG_IO, "UBX_MON_MSGPP\n");
+ break;
+ case UBX_MON_RXBUF:
+ gpsd_report(LOG_IO, "UBX_MON_RXBUF\n");
+ break;
+ case UBX_MON_TXBUF:
+ gpsd_report(LOG_IO, "UBX_MON_TXBUF\n");
+ break;
+ case UBX_MON_HW:
+ gpsd_report(LOG_IO, "UBX_MON_HW\n");
+ break;
+ case UBX_MON_USB:
+ gpsd_report(LOG_IO, "UBX_MON_USB\n");
+ break;
- case UBX_INF_DEBUG:
- /* FALLTHROUGH */
- case UBX_INF_TEST:
- /* FALLTHROUGH */
- case UBX_INF_NOTICE:
- /* FALLTHROUGH */
- case UBX_INF_WARNING:
- /* FALLTHROUGH */
- case UBX_INF_ERROR:
- ubx_msg_inf(buf, data_len);
- break;
+ case UBX_INF_DEBUG:
+ /* FALLTHROUGH */
+ case UBX_INF_TEST:
+ /* FALLTHROUGH */
+ case UBX_INF_NOTICE:
+ /* FALLTHROUGH */
+ case UBX_INF_WARNING:
+ /* FALLTHROUGH */
+ case UBX_INF_ERROR:
+ ubx_msg_inf(buf, data_len);
+ break;
- case UBX_TIM_TP:
- gpsd_report(LOG_IO, "UBX_TIM_TP\n");
- break;
- case UBX_TIM_TM:
- gpsd_report(LOG_IO, "UBX_TIM_TM\n");
- break;
- case UBX_TIM_TM2:
- gpsd_report(LOG_IO, "UBX_TIM_TM2\n");
- break;
- case UBX_TIM_SVIN:
- gpsd_report(LOG_IO, "UBX_TIM_SVIN\n");
- break;
+ case UBX_TIM_TP:
+ gpsd_report(LOG_IO, "UBX_TIM_TP\n");
+ break;
+ case UBX_TIM_TM:
+ gpsd_report(LOG_IO, "UBX_TIM_TM\n");
+ break;
+ case UBX_TIM_TM2:
+ gpsd_report(LOG_IO, "UBX_TIM_TM2\n");
+ break;
+ case UBX_TIM_SVIN:
+ gpsd_report(LOG_IO, "UBX_TIM_SVIN\n");
+ break;
- case UBX_CFG_PRT:
- gpsd_report(LOG_IO, "UBX_CFG_PRT\n");
- for(i=6;i<26;i++)
- session->driver.ubx.original_port_settings[i-6] = buf[i]; /* copy the original port settings */
- buf[14+6] &= ~0x02; /* turn off NMEA output on this port */
- (void)ubx_write(session, 0x06, 0x00, &buf[6], 20); /* send back with all other settings intact */
- session->driver.ubx.have_port_configuration = true;
- break;
+ case UBX_CFG_PRT:
+ gpsd_report(LOG_IO, "UBX_CFG_PRT\n");
+ for (i = 6; i < 26; i++)
+ session->driver.ubx.original_port_settings[i - 6] = buf[i]; /* copy the original port settings */
+ buf[14 + 6] &= ~0x02; /* turn off NMEA output on this port */
+ (void)ubx_write(session, 0x06, 0x00, &buf[6], 20); /* send back with all other settings intact */
+ session->driver.ubx.have_port_configuration = true;
+ break;
- case UBX_ACK_NAK:
- gpsd_report(LOG_IO, "UBX_ACK_NAK, class: %02x, id: %02x\n", buf[6], buf[7]);
- break;
- case UBX_ACK_ACK:
- gpsd_report(LOG_IO, "UBX_ACK_ACK, class: %02x, id: %02x\n", buf[6], buf[7]);
- break;
+ case UBX_ACK_NAK:
+ gpsd_report(LOG_IO, "UBX_ACK_NAK, class: %02x, id: %02x\n", buf[6],
+ buf[7]);
+ break;
+ case UBX_ACK_ACK:
+ gpsd_report(LOG_IO, "UBX_ACK_ACK, class: %02x, id: %02x\n", buf[6],
+ buf[7]);
+ break;
default:
gpsd_report(LOG_WARN,
- "UBX: unknown packet id 0x%04hx (length %zd) %s\n",
- msgid, len, gpsd_hexdump_wrapper(buf, len, LOG_WARN));
+ "UBX: unknown packet id 0x%04hx (length %zd) %s\n",
+ msgid, len, gpsd_hexdump_wrapper(buf, len, LOG_WARN));
}
if (mask)
(void)snprintf(session->gpsdata.tag, sizeof(session->gpsdata.tag),
- "0x%04hx", msgid);
+ "0x%04hx", msgid);
- return mask | ONLINE_SET;
+ return mask | ONLINE_IS;
}
+
/*@ -charint @*/
static gps_mask_t parse_input(struct gps_device_t *session)
@@ -500,7 +513,8 @@ static gps_mask_t parse_input(struct gps_device_t *session)
gps_mask_t st;
if (session->packet.type == UBX_PACKET) {
- st = ubx_parse(session, session->packet.outbuffer, session->packet.outbuflen);
+ st = ubx_parse(session, session->packet.outbuffer,
+ session->packet.outbuflen);
session->gpsdata.dev.driver_mode = MODE_BINARY;
return st;
#ifdef NMEA_ENABLE
@@ -513,88 +527,95 @@ static gps_mask_t parse_input(struct gps_device_t *session)
return 0;
}
-void ubx_catch_model(struct gps_device_t *session, unsigned char *buf, size_t len)
+bool ubx_write(struct gps_device_t * session,
+ unsigned int msg_class, unsigned int msg_id,
+ unsigned char *msg, unsigned short data_len)
{
- /*@ +charint */
- unsigned char *ip = &buf[19];
- unsigned char *op = (unsigned char *)session->subtype;
- size_t end = ((len - 19) < 63)?(len - 19):63;
- size_t i;
+ unsigned char CK_A, CK_B;
+ ssize_t i, count;
+ bool ok;
- for(i=0;i<end;i++) {
- if((*ip == 0x00) || (*ip == '*')) {
- *op = 0x00;
- break;
- }
- *(op++) = *(ip++);
- }
- /*@ -charint */
-}
+ /*@ -type @*/
+ session->msgbuf[0] = 0xb5;
+ session->msgbuf[1] = 0x62;
-bool ubx_write(struct gps_device_t *session,
- unsigned int msg_class, unsigned int msg_id,
- unsigned char *msg, unsigned short data_len)
-{
- unsigned char CK_A, CK_B;
- ssize_t i, count;
- bool ok;
-
- /*@ -type @*/
- session->msgbuf[0] = 0xb5;
- session->msgbuf[1] = 0x62;
-
- CK_A = CK_B = 0;
- session->msgbuf[2] = msg_class;
- session->msgbuf[3] = msg_id;
- session->msgbuf[4] = data_len & 0xff;
- session->msgbuf[5] = (data_len >> 8) & 0xff;
-
- assert(msg != NULL || data_len == 0);
- if (msg != NULL)
- (void)memcpy(&session->msgbuf[6], msg, data_len);
-
- /* calculate CRC */
- for (i = 2; i < 6; i++) {
+ CK_A = CK_B = 0;
+ session->msgbuf[2] = msg_class;
+ session->msgbuf[3] = msg_id;
+ session->msgbuf[4] = data_len & 0xff;
+ session->msgbuf[5] = (data_len >> 8) & 0xff;
+
+ assert(msg != NULL || data_len == 0);
+ if (msg != NULL)
+ (void)memcpy(&session->msgbuf[6], msg, data_len);
+
+ /* calculate CRC */
+ for (i = 2; i < 6; i++) {
CK_A += session->msgbuf[i];
CK_B += CK_A;
- }
- /*@ -nullderef @*/
- for (i = 0; i < data_len; i++) {
+ }
+ /*@ -nullderef @*/
+ for (i = 0; i < data_len; i++) {
CK_A += msg[i];
CK_B += CK_A;
- }
-
- session->msgbuf[6 + data_len] = CK_A;
- session->msgbuf[7 + data_len] = CK_B;
- session->msgbuflen = data_len + 8;
- /*@ +type @*/
-
- gpsd_report(LOG_IO,
- "=> GPS: UBX class: %02x, id: %02x, len: %d, data:%s, crc: %02x%02x\n",
- msg_class, msg_id, data_len,
- gpsd_hexdump_wrapper(msg, (size_t)data_len, LOG_IO),
- CK_A, CK_B);
-
- count = write(session->gpsdata.gps_fd,
- session->msgbuf, session->msgbuflen);
- (void)tcdrain(session->gpsdata.gps_fd);
- ok = (count == (ssize_t)session->msgbuflen);
- /*@ +nullderef @*/
- return(ok);
+ }
+
+ session->msgbuf[6 + data_len] = CK_A;
+ session->msgbuf[7 + data_len] = CK_B;
+ session->msgbuflen = data_len + 8;
+ /*@ +type @*/
+
+ gpsd_report(LOG_IO,
+ "=> GPS: UBX class: %02x, id: %02x, len: %d, data:%s, crc: %02x%02x\n",
+ msg_class, msg_id, data_len,
+ gpsd_hexdump_wrapper(msg, (size_t) data_len, LOG_IO),
+ CK_A, CK_B);
+
+ count = write(session->gpsdata.gps_fd,
+ session->msgbuf, session->msgbuflen);
+ (void)tcdrain(session->gpsdata.gps_fd);
+ ok = (count == (ssize_t) session->msgbuflen);
+ /*@ +nullderef @*/
+ return (ok);
}
#ifdef ALLOW_CONTROLSEND
-static ssize_t ubx_control_send(struct gps_device_t *session, char *msg, size_t data_len)
+static ssize_t ubx_control_send(struct gps_device_t *session, char *msg,
+ size_t data_len)
/* not used by gpsd, it's for gpsctl and friends */
{
- return ubx_write(session, (unsigned int)msg[0], (unsigned int)msg[1],
- (unsigned char *)msg+2, (unsigned short)(data_len-2)) ? ((ssize_t)(data_len+7)) : -1;
+ return ubx_write(session, (unsigned int)msg[0], (unsigned int)msg[1],
+ (unsigned char *)msg + 2,
+ (unsigned short)(data_len - 2)) ? ((ssize_t) (data_len +
+ 7)) : -1;
}
#endif /* ALLOW_CONTROLSEND */
+static void ubx_catch_model(struct gps_device_t *session, unsigned char *buf,
+ size_t len)
+{
+ /*@ +charint */
+ unsigned char *ip = &buf[19];
+ unsigned char *op = (unsigned char *)session->subtype;
+ size_t end = ((len - 19) < 63) ? (len - 19) : 63;
+ size_t i;
+
+ for (i = 0; i < end; i++) {
+ if ((*ip == 0x00) || (*ip == '*')) {
+ *op = 0x00;
+ break;
+ }
+ *(op++) = *(ip++);
+ }
+ /*@ -charint */
+}
+
static void ubx_event_hook(struct gps_device_t *session, event_t event)
{
- if (event == event_identified || event == event_reactivate) {
+ if (event == event_triggermatch)
+ ubx_catch_model(session,
+ session->packet.outbuffer, session->packet.outbuflen);
+ else if (event == event_identified || event == event_reactivate) {
unsigned char msg[32];
gpsd_report(LOG_IO, "UBX configure: %d\n", session->packet.counter);
@@ -602,51 +623,50 @@ static void ubx_event_hook(struct gps_device_t *session, event_t event)
(void)ubx_write(session, 0x06u, 0x00, NULL, 0); /* get this port's settings */
/*@ -type @*/
- msg[0] = 0x03; /* SBAS mode enabled, accept testbed mode */
- msg[1] = 0x07; /* SBAS usage: range, differential corrections and integrity */
- msg[2] = 0x03; /* use the maximun search range: 3 channels */
- msg[3] = 0x00; /* PRN numbers to search for all set to 0 => auto scan */
+ msg[0] = 0x03; /* SBAS mode enabled, accept testbed mode */
+ msg[1] = 0x07; /* SBAS usage: range, differential corrections and integrity */
+ msg[2] = 0x03; /* use the maximun search range: 3 channels */
+ msg[3] = 0x00; /* PRN numbers to search for all set to 0 => auto scan */
msg[4] = 0x00;
msg[5] = 0x00;
msg[6] = 0x00;
msg[7] = 0x00;
(void)ubx_write(session, 0x06u, 0x16, msg, 8);
- msg[0] = 0x01; /* class */
- msg[1] = 0x04; /* msg id = UBX_NAV_DOP */
- msg[2] = 0x01; /* rate */
+ msg[0] = 0x01; /* class */
+ msg[1] = 0x04; /* msg id = UBX_NAV_DOP */
+ msg[2] = 0x01; /* rate */
(void)ubx_write(session, 0x06u, 0x01, msg, 3);
- msg[0] = 0x01; /* class */
- msg[1] = 0x06; /* msg id = NAV-SOL */
- msg[2] = 0x01; /* rate */
+ msg[0] = 0x01; /* class */
+ msg[1] = 0x06; /* msg id = NAV-SOL */
+ msg[2] = 0x01; /* rate */
(void)ubx_write(session, 0x06u, 0x01, msg, 3);
- msg[0] = 0x01; /* class */
- msg[1] = 0x20; /* msg id = UBX_NAV_TIMEGPS */
- msg[2] = 0x01; /* rate */
+ msg[0] = 0x01; /* class */
+ msg[1] = 0x20; /* msg id = UBX_NAV_TIMEGPS */
+ msg[2] = 0x01; /* rate */
(void)ubx_write(session, 0x06u, 0x01, msg, 3);
- msg[0] = 0x01; /* class */
- msg[1] = 0x30; /* msg id = NAV-SVINFO */
- msg[2] = 0x0a; /* rate */
+ msg[0] = 0x01; /* class */
+ msg[1] = 0x30; /* msg id = NAV-SVINFO */
+ msg[2] = 0x0a; /* rate */
(void)ubx_write(session, 0x06u, 0x01, msg, 3);
- msg[0] = 0x01; /* class */
- msg[1] = 0x32; /* msg id = NAV-SBAS */
- msg[2] = 0x0a; /* rate */
+ msg[0] = 0x01; /* class */
+ msg[1] = 0x32; /* msg id = NAV-SBAS */
+ msg[2] = 0x0a; /* rate */
(void)ubx_write(session, 0x06u, 0x01, msg, 3);
/*@ +type @*/
- }
- if (event == event_deactivate)
- {
+ } else if (event == event_deactivate) {
/*@ -type @*/
unsigned char msg[4] = {
- 0x00, 0x00, /* hotstart */
+ 0x00, 0x00, /* hotstart */
0x01, /* controlled software reset */
- 0x00}; /* reserved */
+ 0x00
+ }; /* reserved */
/*@ +type @*/
gpsd_report(LOG_IO, "UBX revert\n");
/* Reverting all in one fast and reliable reset */
- (void)ubx_write(session, 0x06, 0x04, msg, 4); /* CFG-RST */
+ (void)ubx_write(session, 0x06, 0x04, msg, 4); /* CFG-RST */
}
}
@@ -656,27 +676,28 @@ static void ubx_nmea_mode(struct gps_device_t *session, int mode)
int i;
unsigned char buf[sizeof(session->driver.ubx.original_port_settings)];
- if(!session->driver.ubx.have_port_configuration)
+ if (!session->driver.ubx.have_port_configuration)
return;
/*@ +charint -usedef @*/
- for(i=0;i<(int)sizeof(session->driver.ubx.original_port_settings);i++)
+ for (i = 0; i < (int)sizeof(session->driver.ubx.original_port_settings);
+ i++)
buf[i] = session->driver.ubx.original_port_settings[i]; /* copy the original port settings */
- if(buf[0] == 0x01) /* set baudrate on serial port only */
+ if (buf[0] == 0x01) /* set baudrate on serial port only */
putlelong(buf, 8, session->gpsdata.dev.baudrate);
if (mode == MODE_NMEA) {
- buf[14] &= ~0x01; /* turn off UBX output on this port */
- buf[14] |= 0x02; /* turn on NMEA output on this port */
- } else { /* MODE_BINARY */
- buf[14] &= ~0x02; /* turn off NMEA output on this port */
- buf[14] |= 0x01; /* turn on UBX output on this port */
+ buf[14] &= ~0x01; /* turn off UBX output on this port */
+ buf[14] |= 0x02; /* turn on NMEA output on this port */
+ } else { /* MODE_BINARY */
+ buf[14] &= ~0x02; /* turn off NMEA output on this port */
+ buf[14] |= 0x01; /* turn on UBX output on this port */
}
/*@ -charint +usedef @*/
(void)ubx_write(session, 0x06u, 0x00, &buf[6], 20); /* send back with all other settings intact */
}
-static bool ubx_speed(struct gps_device_t *session,
+static bool ubx_speed(struct gps_device_t *session,
speed_t speed, char parity, int stopbits)
{
int i;
@@ -684,13 +705,14 @@ static bool ubx_speed(struct gps_device_t *session,
unsigned long usart_mode;
/*@ +charint -usedef -compdef */
- for(i=0;i<(int)sizeof(session->driver.ubx.original_port_settings);i++)
+ for (i = 0; i < (int)sizeof(session->driver.ubx.original_port_settings);
+ i++)
buf[i] = session->driver.ubx.original_port_settings[i]; /* copy the original port settings */
- if((!session->driver.ubx.have_port_configuration) || (buf[0] != 0x01)) /* set baudrate on serial port only */
+ if ((!session->driver.ubx.have_port_configuration) || (buf[0] != 0x01)) /* set baudrate on serial port only */
return false;
usart_mode = (unsigned long)getleul(buf, 4);
- usart_mode &=~ 0xE00; /* zero bits 11:9 */
+ usart_mode &= ~0xE00; /* zero bits 11:9 */
switch (parity) {
case (int)'E':
case 2:
@@ -706,7 +728,7 @@ static bool ubx_speed(struct gps_device_t *session,
usart_mode |= 0x4; /* 0x5 would work too */
break;
}
- usart_mode &=~ 0x03000; /* zero bits 13:12 */
+ usart_mode &= ~0x03000; /* zero bits 13:12 */
if (stopbits == 2)
usart_mode |= 0x2000; /* zero value means 1 stop bit */
putlelong(buf, 4, usart_mode);
@@ -722,32 +744,33 @@ static bool ubx_rate(struct gps_device_t *session, double cycletime)
unsigned short s;
/*@ -type @*/
unsigned char msg[6] = {
- 0x00, 0x00, /* U2: Measurement rate (ms) */
- 0x00, 0x01, /* U2: Navigation rate (cycles) */
- 0x00, 0x00, /* U2: Alignment to reference time: 0 = UTC, !0 = GPS */
+ 0x00, 0x00, /* U2: Measurement rate (ms) */
+ 0x00, 0x01, /* U2: Navigation rate (cycles) */
+ 0x00, 0x00, /* U2: Alignment to reference time: 0 = UTC, !0 = GPS */
};
/*@ +type @*/
/* clamp to cycle times that i know work on my receiver */
if (cycletime > 1000.0)
- cycletime = 1000.0;
+ cycletime = 1000.0;
if (cycletime < 200.0)
- cycletime = 200.0;
+ cycletime = 200.0;
gpsd_report(LOG_IO, "UBX rate change, report every %f secs\n", cycletime);
s = (unsigned short)cycletime;
msg[0] = (unsigned char)(s >> 8);
msg[1] = (unsigned char)(s & 0xff);
- return ubx_write(session, 0x06, 0x08, msg, 6); /* CFG-RATE */
+ return ubx_write(session, 0x06, 0x08, msg, 6); /* CFG-RATE */
}
#endif /* ALLOW_RECONFIGURE */
/* This is everything we export */
+/* *INDENT-OFF* */
const struct gps_type_t ubx_binary = {
.type_name = "uBlox UBX binary", /* Full name of type */
.packet_type = UBX_PACKET, /* associated lexer packet type */
- .trigger = NULL, /* Response string that identifies device (not active) */
+ .trigger = "$GPTXT,01,01,02,MOD",
.channels = 50, /* Number of satellite channels supported by the device */
.probe_detect = NULL, /* Startup-time device detector */
.get_packet = generic_get, /* Packet getter (using default routine) */
@@ -763,5 +786,9 @@ const struct gps_type_t ubx_binary = {
#ifdef ALLOW_CONTROLSEND
.control_send = ubx_control_send, /* no control sender yet */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL, /* no method for NTP fudge factor */
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* defined(UBX_ENABLE) && defined(BINARY_ENABLE) */
diff --git a/driver_zodiac.c b/driver_zodiac.c
index b9415708..9d13f6f4 100644
--- a/driver_zodiac.c
+++ b/driver_zodiac.c
@@ -17,7 +17,8 @@
#include "bits.h"
#ifdef ZODIAC_ENABLE
-struct header {
+struct header
+{
unsigned short sync;
unsigned short id;
unsigned short ndata;
@@ -46,11 +47,13 @@ static int end_write(int fd, void *d, int len)
char buf[BUFSIZ];
char *p = buf;
char *data = (char *)d;
- size_t n = (size_t)len;
+ size_t n = (size_t) len;
- while (n>0) {
- *p++ = *(data+1); *p++ = *data;
- data += 2; n -= 2;
+ while (n > 0) {
+ *p++ = *(data + 1);
+ *p++ = *data;
+ data += 2;
+ n -= 2;
}
return write(fd, buf, len);
}
@@ -58,7 +61,8 @@ static int end_write(int fd, void *d, int len)
#define end_write write
#endif /* WORDS_BIGENDIAN */
-static ssize_t zodiac_spew(struct gps_device_t *session, unsigned short type, unsigned short *dat, int dlen)
+static ssize_t zodiac_spew(struct gps_device_t *session, unsigned short type,
+ unsigned short *dat, int dlen)
{
struct header h;
int i;
@@ -68,14 +72,15 @@ static ssize_t zodiac_spew(struct gps_device_t *session, unsigned short type, un
h.id = (unsigned short)type;
h.ndata = (unsigned short)(dlen - 1);
h.flags = 0;
- h.csum = zodiac_checksum((unsigned short *) &h, 4);
+ h.csum = zodiac_checksum((unsigned short *)&h, 4);
if (session->gpsdata.gps_fd != -1) {
size_t hlen, datlen;
hlen = sizeof(h);
datlen = sizeof(unsigned short) * dlen;
- if (end_write(session->gpsdata.gps_fd, &h, hlen) != (ssize_t)hlen ||
- end_write(session->gpsdata.gps_fd, dat, datlen) != (ssize_t)datlen) {
+ if (end_write(session->gpsdata.gps_fd, &h, hlen) != (ssize_t) hlen ||
+ end_write(session->gpsdata.gps_fd, dat,
+ datlen) != (ssize_t) datlen) {
gpsd_report(LOG_RAW, "Reconfigure write failed\n");
return -1;
}
@@ -83,12 +88,12 @@ static ssize_t zodiac_spew(struct gps_device_t *session, unsigned short type, un
(void)snprintf(buf, sizeof(buf),
"%04x %04x %04x %04x %04x",
- h.sync,h.id,h.ndata,h.flags,h.csum);
+ h.sync, h.id, h.ndata, h.flags, h.csum);
for (i = 0; i < dlen; i++)
- (void)snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf),
+ (void)snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
" %04x", dat[i]);
- gpsd_report(LOG_RAW, "Sent Zodiac packet: %s\n",buf);
+ gpsd_report(LOG_RAW, "Sent Zodiac packet: %s\n", buf);
return 0;
}
@@ -97,26 +102,26 @@ static void send_rtcm(struct gps_device_t *session,
char *rtcmbuf, size_t rtcmbytes)
{
unsigned short data[34];
- int n = 1 + (int)(rtcmbytes/2 + rtcmbytes%2);
+ int n = 1 + (int)(rtcmbytes / 2 + rtcmbytes % 2);
if (session->driver.zodiac.sn++ > 32767)
session->driver.zodiac.sn = 0;
memset(data, 0, sizeof(data));
- data[0] = session->driver.zodiac.sn; /* sequence number */
+ data[0] = session->driver.zodiac.sn; /* sequence number */
memcpy(&data[1], rtcmbuf, rtcmbytes);
data[n] = zodiac_checksum(data, n);
- (void)zodiac_spew(session, 1351, data, n+1);
+ (void)zodiac_spew(session, 1351, data, n + 1);
}
static ssize_t zodiac_send_rtcm(struct gps_device_t *session,
- char *rtcmbuf, size_t rtcmbytes)
+ char *rtcmbuf, size_t rtcmbytes)
{
size_t len;
while (rtcmbytes > 0) {
- len = (size_t)(rtcmbytes>64?64:rtcmbytes);
+ len = (size_t) (rtcmbytes > 64 ? 64 : rtcmbytes);
send_rtcm(session, rtcmbuf, len);
rtcmbytes -= len;
rtcmbuf += len;
@@ -137,7 +142,7 @@ static gps_mask_t handle1000(struct gps_device_t *session)
/* sequence = getzword(8); */
/* measurement_sequence = getzword(9); */
/*@ -boolops -predboolothers @*/
- session->gpsdata.status = (getzword(10) & 0x1c) ? 0 : 1;
+ session->gpsdata.status = (getzword(10) & 0x1c) ? 0 : 1;
if (session->gpsdata.status != 0)
session->newdata.mode = (getzword(10) & 1) ? MODE_2D : MODE_3D;
else
@@ -158,42 +163,34 @@ static gps_mask_t handle1000(struct gps_device_t *session)
unpacked_date.tm_sec = (int)getzword(24);
subseconds = (int)getzlong(25) / 1e9;
/*@ -compdef */
- session->newdata.time =
- (double)mkgmtime(&unpacked_date) + subseconds;
+ session->newdata.time = (double)mkgmtime(&unpacked_date) + subseconds;
/*@ +compdef */
-#ifdef NTPSHM_ENABLE
- /* Removing/changing the magic number below is likely to disturb
- * the handling of the 1pps signal from the gps device. The regression
- * tests and simple gps applications do not detect this. A live test
- * with the 1pps signal active is required. */
- if (session->context->enable_ntpshm && session->newdata.mode > MODE_NO_FIX)
- (void)ntpshm_put(session, session->newdata.time, 1.1);
-#endif
/*@ -type @*/
- session->newdata.latitude = ((long)getzlong(27)) * RAD_2_DEG * 1e-8;
+ session->newdata.latitude = ((long)getzlong(27)) * RAD_2_DEG * 1e-8;
session->newdata.longitude = ((long)getzlong(29)) * RAD_2_DEG * 1e-8;
/*
* The Rockwell Jupiter TU30-D140 reports altitude as uncorrected height
* above WGS84 geoid. The Zodiac binary protocol manual does not
* specify whether word 31 is geodetic or WGS 84.
*/
- session->newdata.altitude = ((long)getzlong(31)) * 1e-2;
+ session->newdata.altitude = ((long)getzlong(31)) * 1e-2;
/*@ +type @*/
- session->gpsdata.separation = ((short)getzword(33)) * 1e-2;
+ session->gpsdata.separation = ((short)getzword(33)) * 1e-2;
session->newdata.altitude -= session->gpsdata.separation;
- session->newdata.speed = (int)getzlong(34) * 1e-2;
- session->newdata.track = (int)getzword(36) * RAD_2_DEG * 1e-3;
- session->mag_var = ((short)getzword(37)) * RAD_2_DEG * 1e-4;
- session->newdata.climb = ((short)getzword(38)) * 1e-2;
+ session->newdata.speed = (int)getzlong(34) * 1e-2;
+ session->newdata.track = (int)getzword(36) * RAD_2_DEG * 1e-3;
+ session->mag_var = ((short)getzword(37)) * RAD_2_DEG * 1e-4;
+ session->newdata.climb = ((short)getzword(38)) * 1e-2;
/* map_datum = getzword(39); */
/*
* The manual says these are 1-sigma. Device reports only eph, circular
* error; no harm in assigning it to both x and y components.
*/
- session->newdata.epx = session->newdata.epy = (int)getzlong(40) * 1e-2 * (1/sqrt(2)) * GPSD_CONFIDENCE;
- session->newdata.epv = (int)getzlong(42) * 1e-2 * GPSD_CONFIDENCE;
- session->newdata.ept = (int)getzlong(44) * 1e-2 * GPSD_CONFIDENCE;
- session->newdata.eps = (int)getzword(46) * 1e-2 * GPSD_CONFIDENCE;
+ session->newdata.epx = session->newdata.epy =
+ (int)getzlong(40) * 1e-2 * (1 / sqrt(2)) * GPSD_CONFIDENCE;
+ session->newdata.epv = (int)getzlong(42) * 1e-2 * GPSD_CONFIDENCE;
+ session->newdata.ept = (int)getzlong(44) * 1e-2 * GPSD_CONFIDENCE;
+ session->newdata.eps = (int)getzword(46) * 1e-2 * GPSD_CONFIDENCE;
/* clock_bias = (int)getzlong(47) * 1e-2; */
/* clock_bias_sd = (int)getzlong(49) * 1e-2; */
/* clock_drift = (int)getzlong(51) * 1e-2; */
@@ -204,37 +201,41 @@ static gps_mask_t handle1000(struct gps_device_t *session)
gpsd_report(LOG_INF, " solution invalid:\n");
gpsd_report(LOG_INF, " altitude: %d\n", (getzword(10) & 1) ? 1 : 0);
gpsd_report(LOG_INF, " no diff gps: %d\n", (getzword(10) & 2) ? 1 : 0);
- gpsd_report(LOG_INF, " not enough satellites: %d\n", (getzword(10) & 4) ? 1 : 0);
- gpsd_report(LOG_INF, " exceed max EHPE: %d\n", (getzword(10) & 8) ? 1 : 0);
- gpsd_report(LOG_INF, " exceed max EVPE: %d\n", (getzword(10) & 16) ? 1 : 0);
+ gpsd_report(LOG_INF, " not enough satellites: %d\n",
+ (getzword(10) & 4) ? 1 : 0);
+ gpsd_report(LOG_INF, " exceed max EHPE: %d\n",
+ (getzword(10) & 8) ? 1 : 0);
+ gpsd_report(LOG_INF, " exceed max EVPE: %d\n",
+ (getzword(10) & 16) ? 1 : 0);
gpsd_report(LOG_INF, " solution type:\n");
gpsd_report(LOG_INF, " propagated: %d\n", (getzword(11) & 1) ? 1 : 0);
gpsd_report(LOG_INF, " altitude: %d\n", (getzword(11) & 2) ? 1 : 0);
- gpsd_report(LOG_INF, " differential: %d\n", (getzword(11) & 4) ? 1 : 0);
- gpsd_report(LOG_INF, "Number of measurements in solution: %d\n", getzword(12));
+ gpsd_report(LOG_INF, " differential: %d\n",
+ (getzword(11) & 4) ? 1 : 0);
+ gpsd_report(LOG_INF, "Number of measurements in solution: %d\n",
+ getzword(12));
gpsd_report(LOG_INF, "Lat: %f\n", getzlong(27) * RAD_2_DEG * 1e-8);
gpsd_report(LOG_INF, "Lon: %f\n", getzlong(29) * RAD_2_DEG * 1e-8);
- gpsd_report(LOG_INF, "Alt: %f\n", (double) getzlong(31) * 1e-2);
- gpsd_report(LOG_INF, "Speed: %f\n", (double) getzlong(34) * 1e-2 * MPS_TO_KNOTS);
+ gpsd_report(LOG_INF, "Alt: %f\n", (double)getzlong(31) * 1e-2);
+ gpsd_report(LOG_INF, "Speed: %f\n",
+ (double)getzlong(34) * 1e-2 * MPS_TO_KNOTS);
gpsd_report(LOG_INF, "Map datum: %d\n", getzword(39));
- gpsd_report(LOG_INF, "Magnetic variation: %f\n", getzword(37) * RAD_2_DEG * 1e-4);
+ gpsd_report(LOG_INF, "Magnetic variation: %f\n",
+ getzword(37) * RAD_2_DEG * 1e-4);
gpsd_report(LOG_INF, "Course: %f\n", getzword(36) * RAD_2_DEG * 1e-4);
gpsd_report(LOG_INF, "Separation: %f\n", getzword(33) * 1e-2);
#endif
- mask = TIME_SET|LATLON_SET|ALTITUDE_SET|CLIMB_SET|SPEED_SET|TRACK_SET|STATUS_SET|MODE_SET;
- gpsd_report(LOG_DATA,
+ mask =
+ TIME_IS | LATLON_IS | ALTITUDE_IS | CLIMB_IS | SPEED_IS | TRACK_IS |
+ STATUS_IS | MODE_IS;
+ gpsd_report(LOG_DATA,
"1000: time=%.2f lat=%.2f lon=%.2f alt=%.2f track=%.2f speed=%.2f climb=%.2f mode=%d status=%d mask=%s\n",
- 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,
- gpsd_maskdump(mask));
+ 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, gpsd_maskdump(mask));
return mask;
}
@@ -247,12 +248,12 @@ static gps_mask_t handle1002(struct gps_device_t *session)
/* sequence = getzword(8); */
/* measurement_sequence = getzword(9); */
/*@+charint@*/
- int gps_week = getzword(10);
- int gps_seconds = getzlong(11);
+ int gps_week = getzword(10);
+ int gps_seconds = getzlong(11);
/* gps_nanoseconds = getzlong(13); */
/*@-charint@*/
session->gpsdata.satellites_used = 0;
- memset(session->gpsdata.used,0,sizeof(session->gpsdata.used));
+ memset(session->gpsdata.used, 0, sizeof(session->gpsdata.used));
for (i = 0; i < ZODIAC_CHANNELS; i++) {
/*@ -type @*/
session->driver.zodiac.Zv[i] = status = (int)getzword(15 + (3 * i));
@@ -276,12 +277,12 @@ static gps_mask_t handle1002(struct gps_device_t *session)
break;
}
}
- session->gpsdata.skyview_time = gpstime_to_unix(gps_week, (double)gps_seconds);
- gpsd_report(LOG_DATA,
- "1002: visible=%d used=%d mask={SATELLITE|USED}\n",
- session->gpsdata.satellites_visible,
+ session->gpsdata.skyview_time =
+ gpstime_to_unix(gps_week, (double)gps_seconds);
+ gpsd_report(LOG_DATA, "1002: visible=%d used=%d mask={SATELLITE|USED}\n",
+ session->gpsdata.satellites_visible,
session->gpsdata.satellites_used);
- return SATELLITE_SET | USED_SET;
+ return SATELLITE_IS | USED_IS;
}
static gps_mask_t handle1003(struct gps_device_t *session)
@@ -293,8 +294,8 @@ static gps_mask_t handle1003(struct gps_device_t *session)
* this message which causes gpsd to crash filtering on impossible
* number of satellites avoids this */
n = (int)getzword(14);
- if ((n < 0) || (n >12))
- return 0;
+ if ((n < 0) || (n > 12))
+ return 0;
/* ticks = getzlong(6); */
/* sequence = getzword(8); */
@@ -309,13 +310,16 @@ static gps_mask_t handle1003(struct gps_device_t *session)
for (i = 0; i < ZODIAC_CHANNELS; i++) {
if (i < session->gpsdata.satellites_visible) {
session->gpsdata.PRN[i] = (int)getzword(15 + (3 * i));
- session->gpsdata.azimuth[i] = (int)(((short)getzword(16 + (3 * i))) * RAD_2_DEG * 1e-4);
+ session->gpsdata.azimuth[i] =
+ (int)(((short)getzword(16 + (3 * i))) * RAD_2_DEG * 1e-4);
if (session->gpsdata.azimuth[i] < 0)
session->gpsdata.azimuth[i] += 360;
- session->gpsdata.elevation[i] = (int)(((short)getzword(17 + (3 * i))) * RAD_2_DEG * 1e-4);
+ session->gpsdata.elevation[i] =
+ (int)(((short)getzword(17 + (3 * i))) * RAD_2_DEG * 1e-4);
#if 0
- gpsd_report(LOG_INF, "Sat%02d: PRN:%d az:%d el:%d\n",
- i, getzword(15+(3 * i)),getzword(16+(3 * i)),getzword(17+(3 * i)));
+ gpsd_report(LOG_INF, "Sat%02d: PRN:%d az:%d el:%d\n",
+ i, getzword(15 + (3 * i)), getzword(16 + (3 * i)),
+ getzword(17 + (3 * i)));
#endif
} else {
session->gpsdata.PRN[i] = 0;
@@ -330,9 +334,8 @@ static gps_mask_t handle1003(struct gps_device_t *session)
session->gpsdata.dop.gdop,
session->gpsdata.dop.hdop,
session->gpsdata.dop.vdop,
- session->gpsdata.dop.pdop,
- session->gpsdata.dop.tdop);
- return SATELLITE_SET | DOP_SET;
+ session->gpsdata.dop.pdop, session->gpsdata.dop.tdop);
+ return SATELLITE_IS | DOP_IS;
}
static void handle1005(struct gps_device_t *session UNUSED)
@@ -348,17 +351,25 @@ static void handle1005(struct gps_device_t *session UNUSED)
gpsd_report(LOG_INF, "Station bad: %d\n", (getzword(9) & 1) ? 1 : 0);
gpsd_report(LOG_INF, "User disabled: %d\n", (getzword(9) & 2) ? 1 : 0);
gpsd_report(LOG_INF, "Station ID: %d\n", getzword(10));
- gpsd_report(LOG_INF, "Age of last correction in seconds: %d\n", getzword(11));
+ gpsd_report(LOG_INF, "Age of last correction in seconds: %d\n",
+ getzword(11));
gpsd_report(LOG_INF, "Number of corrections: %d\n", getzword(12));
for (i = 0; i < numcorrections; i++) {
- gpsd_report(LOG_INF, "Sat%02d:\n", getzword(13+i) & 0x3f);
- gpsd_report(LOG_INF, "ephemeris:%d\n", (getzword(13+i) & 64) ? 1 : 0);
- gpsd_report(LOG_INF, "rtcm corrections:%d\n", (getzword(13+i) & 128) ? 1 : 0);
- gpsd_report(LOG_INF, "rtcm udre:%d\n", (getzword(13+i) & 256) ? 1 : 0);
- gpsd_report(LOG_INF, "sat health:%d\n", (getzword(13+i) & 512) ? 1 : 0);
- gpsd_report(LOG_INF, "rtcm sat health:%d\n", (getzword(13+i) & 1024) ? 1 : 0);
- gpsd_report(LOG_INF, "corrections state:%d\n", (getzword(13+i) & 2048) ? 1 : 0);
- gpsd_report(LOG_INF, "iode mismatch:%d\n", (getzword(13+i) & 4096) ? 1 : 0);
+ gpsd_report(LOG_INF, "Sat%02d:\n", getzword(13 + i) & 0x3f);
+ gpsd_report(LOG_INF, "ephemeris:%d\n",
+ (getzword(13 + i) & 64) ? 1 : 0);
+ gpsd_report(LOG_INF, "rtcm corrections:%d\n",
+ (getzword(13 + i) & 128) ? 1 : 0);
+ gpsd_report(LOG_INF, "rtcm udre:%d\n",
+ (getzword(13 + i) & 256) ? 1 : 0);
+ gpsd_report(LOG_INF, "sat health:%d\n",
+ (getzword(13 + i) & 512) ? 1 : 0);
+ gpsd_report(LOG_INF, "rtcm sat health:%d\n",
+ (getzword(13 + i) & 1024) ? 1 : 0);
+ gpsd_report(LOG_INF, "corrections state:%d\n",
+ (getzword(13 + i) & 2048) ? 1 : 0);
+ gpsd_report(LOG_INF, "iode mismatch:%d\n",
+ (getzword(13 + i) & 4096) ? 1 : 0);
}
#endif
if (session->newdata.mode == MODE_NO_FIX)
@@ -377,11 +388,10 @@ static gps_mask_t handle1011(struct gps_device_t *session)
* client querying of the ID with firmware version in 2006.
* The Zodiac is supposed to send one of these messages on startup.
*/
- getstringz(session->subtype,
- session->packet.outbuffer,
- 19, 28); /* software version field */
- gpsd_report(LOG_DATA, "1011: subtype=%s mask={DEVICEID}\n", session->subtype);
- return DEVICEID_SET;
+ getstringz(session->subtype, session->packet.outbuffer, 19, 28); /* software version field */
+ gpsd_report(LOG_DATA, "1011: subtype=%s mask={DEVICEID}\n",
+ session->subtype);
+ return DEVICEID_IS;
}
@@ -395,7 +405,8 @@ static void handle1108(struct gps_device_t *session)
if ((int)(getzword(19) & 3) == 3)
session->context->leap_seconds = (int)getzword(16);
#if 0
- gpsd_report(LOG_INF, "Leap seconds: %d.%09d\n", getzword(16), getzlong(17));
+ gpsd_report(LOG_INF, "Leap seconds: %d.%09d\n", getzword(16),
+ getzlong(17));
gpsd_report(LOG_INF, "UTC validity: %d\n", getzword(19) & 3);
#endif
}
@@ -404,19 +415,26 @@ static gps_mask_t zodiac_analyze(struct gps_device_t *session)
{
char buf[BUFSIZ];
int i;
- unsigned int id = (unsigned int)((session->packet.outbuffer[3]<<8) | session->packet.outbuffer[2]);
+ unsigned int id =
+ (unsigned int)((session->packet.outbuffer[3] << 8) |
+ session->packet.outbuffer[2]);
if (session->packet.type != ZODIAC_PACKET) {
const struct gps_type_t **dp;
- gpsd_report(LOG_PROG, "zodiac_analyze packet type %d\n",session->packet.type);
+ gpsd_report(LOG_PROG, "zodiac_analyze packet type %d\n",
+ session->packet.type);
// Wrong packet type ?
// Maybe find a trigger just in case it's an Earthmate
- gpsd_report(LOG_RAW+4, "Is this a trigger: %s ?\n", (char*)session->packet.outbuffer);
+ gpsd_report(LOG_RAW + 4, "Is this a trigger: %s ?\n",
+ (char *)session->packet.outbuffer);
for (dp = gpsd_drivers; *dp; dp++) {
- char *trigger = (*dp)->trigger;
+ char *trigger = (*dp)->trigger;
- if (trigger!=NULL && strncmp((char *)session->packet.outbuffer, trigger, strlen(trigger))==0 && isatty(session->gpsdata.gps_fd)!=0) {
+ if (trigger != NULL
+ && strncmp((char *)session->packet.outbuffer, trigger,
+ strlen(trigger)) == 0
+ && isatty(session->gpsdata.gps_fd) != 0) {
gpsd_report(LOG_PROG, "found %s.\n", trigger);
(void)gpsd_switch_driver(session, (*dp)->type_name);
@@ -428,7 +446,7 @@ static gps_mask_t zodiac_analyze(struct gps_device_t *session)
buf[0] = '\0';
for (i = 0; i < (int)session->packet.outbuflen; i++)
- (void)snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf),
+ (void)snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
"%02x", (unsigned int)session->packet.outbuffer[i]);
gpsd_report(LOG_RAW, "Raw Zodiac packet type %d length %zd: %s\n",
id, session->packet.outbuflen, buf);
@@ -436,7 +454,8 @@ static gps_mask_t zodiac_analyze(struct gps_device_t *session)
if (session->packet.outbuflen < 10)
return 0;
- (void)snprintf(session->gpsdata.tag,sizeof(session->gpsdata.tag),"%u",id);
+ (void)snprintf(session->gpsdata.tag, sizeof(session->gpsdata.tag), "%u",
+ id);
/*
* Normal cycle for these devices is 1001 1002.
@@ -447,7 +466,7 @@ static gps_mask_t zodiac_analyze(struct gps_device_t *session)
switch (id) {
case 1000:
- return handle1000(session) | (CLEAR_SET | REPORT_SET);
+ return handle1000(session) | (CLEAR_IS | REPORT_IS);
case 1002:
return handle1002(session);
case 1003:
@@ -466,18 +485,19 @@ static gps_mask_t zodiac_analyze(struct gps_device_t *session)
}
#ifdef ALLOW_CONTROLSEND
-static ssize_t zodiac_control_send(struct gps_device_t *session,
- char *msg, size_t len)
+static ssize_t zodiac_control_send(struct gps_device_t *session,
+ char *msg, size_t len)
{
unsigned short *shortwords = (unsigned short *)msg;
/* and if len isn't even, it's your own fault */
- return zodiac_spew(session, shortwords[0], shortwords+1, (int)(len/2-1));
+ return zodiac_spew(session, shortwords[0], shortwords + 1,
+ (int)(len / 2 - 1));
}
#endif /* ALLOW_CONTROLSEND */
#ifdef ALLOW_RECONFIGURE
-static bool zodiac_speed_switch(struct gps_device_t *session,
+static bool zodiac_speed_switch(struct gps_device_t *session,
speed_t speed, char parity, int stopbits)
{
unsigned short data[15];
@@ -504,19 +524,31 @@ static bool zodiac_speed_switch(struct gps_device_t *session,
memset(data, 0, sizeof(data));
/* data is the part of the message starting at word 6 */
data[0] = session->driver.zodiac.sn; /* sequence number */
- data[1] = 1; /* port 1 data valid */
+ data[1] = 1; /* port 1 data valid */
data[2] = (unsigned short)parity; /* port 1 character width (8 bits) */
- data[3] = (unsigned short)(stopbits-1); /* port 1 stop bits (1 stopbit) */
- data[4] = 0; /* port 1 parity (none) */
- data[5] = (unsigned short)(round(log((double)speed/300)/M_LN2)+1); /* port 1 speed */
+ data[3] = (unsigned short)(stopbits - 1); /* port 1 stop bits (1 stopbit) */
+ data[4] = 0; /* port 1 parity (none) */
+ data[5] = (unsigned short)(round(log((double)speed / 300) / M_LN2) + 1); /* port 1 speed */
data[14] = zodiac_checksum(data, 14);
(void)zodiac_spew(session, 1330, data, 15);
- return true; /* it would be nice to error-check this */
+ return true; /* it would be nice to error-check this */
}
#endif /* ALLOW_RECONFIGURE */
+#ifdef NTPSHM_ENABLE
+static double zodiac_ntp_offset(struct gps_device_t *session)
+{
+ /* Removing/changing the magic number below is likely to disturb
+ * the handling of the 1pps signal from the gps device. The regression
+ * tests and simple gps applications do not detect this. A live test
+ * with the 1pps signal active is required. */
+ return 1.1;
+}
+#endif /* NTPSHM_ENABLE */
+
/* this is everything we export */
+/* *INDENT-OFF* */
const struct gps_type_t zodiac_binary =
{
.type_name = "Zodiac binary", /* full name of type */
@@ -537,6 +569,10 @@ const struct gps_type_t zodiac_binary =
#ifdef ALLOW_CONTROLSEND
.control_send = zodiac_control_send, /* for gpsctl and friends */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = zodiac_ntp_offset, /* compute NTO fudge factor */
+#endif /* NTPSHM_ENABLE */
};
+/* *INDENT-ON* */
#endif /* ZODIAC_ENABLE */
diff --git a/drivers.c b/drivers.c
index 89cb0d4e..c8b55ef4 100644
--- a/drivers.c
+++ b/drivers.c
@@ -5,7 +5,7 @@
#include <sys/types.h>
#include "gpsd_config.h"
#ifdef HAVE_SYS_IOCTL_H
- #include <sys/ioctl.h>
+#include <sys/ioctl.h>
#endif /* HAVE_SYS_IOCTL_H */
#include <sys/time.h>
#include <stdlib.h>
@@ -19,10 +19,11 @@
#include <stdarg.h>
#include "gpsd.h"
-#include "bits.h" /* for getbeuw(), to extract big-endiamn words */
+#include "bits.h" /* for getbeuw(), to extract big-endian words */
extern const struct gps_type_t zodiac_binary;
extern const struct gps_type_t ubx_binary;
+extern const struct gps_type_t sirf_binary;
ssize_t generic_get(struct gps_device_t *session)
{
@@ -30,7 +31,7 @@ ssize_t generic_get(struct gps_device_t *session)
}
#if defined(NMEA_ENABLE) || defined(SIRF_ENABLE) || defined(EVERMORE_ENABLE) || defined(ITRAX_ENABLE) || defined(NAVCOM_ENABLE)
-ssize_t pass_rtcm(struct gps_device_t *session, char *buf, size_t rtcmbytes)
+ssize_t pass_rtcm(struct gps_device_t * session, char *buf, size_t rtcmbytes)
/* most GPSes take their RTCM corrections straight up */
{
return gpsd_write(session, buf, rtcmbytes);
@@ -44,13 +45,13 @@ ssize_t pass_rtcm(struct gps_device_t *session, char *buf, size_t rtcmbytes)
*
**************************************************************************/
-gps_mask_t nmea_parse_input(struct gps_device_t *session)
+gps_mask_t nmea_parse_input(struct gps_device_t * session)
{
+ const struct gps_type_t **dp;
+
if (session->packet.type == COMMENT_PACKET) {
return 0;
- } else if (session->packet.type != NMEA_PACKET ) {
- const struct gps_type_t **dp;
-
+ } else if (session->packet.type != NMEA_PACKET) {
for (dp = gpsd_drivers; *dp; dp++) {
if (session->packet.type == (*dp)->packet_type) {
gpsd_report(LOG_WARN, "%s packet seen when NMEA expected.\n",
@@ -60,53 +61,37 @@ gps_mask_t nmea_parse_input(struct gps_device_t *session)
}
}
return 0;
- } else /* session->packet.type == NMEA_PACKET) */ {
- gps_mask_t st = 0;
+ } else { /* session->packet.type == NMEA_PACKET) */
-#ifdef OCEANSERVER_ENABLE
- if (strncmp((char *)session->packet.outbuffer, "$C", 2)==0 || strncmp((char *)session->packet.outbuffer, "$OHPR", 5)==0) {
- (void)gpsd_switch_driver(session, "OceanServer Digital Compas OS5000");
- return 1;
- }
-#endif /* OCEANSERVER_ENABLE */
-
- /* some packets do not end in \n, so make sure at least one
- * for good loggin */
+ gps_mask_t st = 0;
+ /*
+ * Some packets do not end in \n, append one
+ * for good logging
+ */
gpsd_report(LOG_IO, "<= GPS: %s\n", session->packet.outbuffer);
- if ((st=nmea_parse((char *)session->packet.outbuffer, session))==0) {
-#ifdef NON_NMEA_ENABLE
- const struct gps_type_t **dp;
-
- /* maybe this is a trigger string for a driver we know about? */
-#ifdef UBX_ENABLE
- if(strncmp((char *)session->packet.outbuffer, "$GPTXT,01,01,02,MOD", 19)==0) {
- ubx_catch_model(session, session->packet.outbuffer, session->packet.outbuflen);
- (void)gpsd_switch_driver(session, "uBlox UBX binary");
- return 0;
- }
-#endif /* UBX_ENABLE */
- for (dp = gpsd_drivers; *dp; dp++) {
- char *trigger = (*dp)->trigger;
+ if ((st =
+ nmea_parse((char *)session->packet.outbuffer, session)) == 0) {
+ gpsd_report(LOG_WARN, "unknown sentence: \"%s\"\n",
+ session->packet.outbuffer);
+ }
+ for (dp = gpsd_drivers; *dp; dp++) {
+ char *trigger = (*dp)->trigger;
- if (trigger!=NULL && strncmp((char *)session->packet.outbuffer, trigger, strlen(trigger))==0 && isatty(session->gpsdata.gps_fd)!=0) {
- gpsd_report(LOG_PROG, "found %s.\n", trigger);
+ if (trigger != NULL
+ && strncmp((char *)session->packet.outbuffer, trigger,
+ strlen(trigger)) == 0) {
+ gpsd_report(LOG_PROG, "found trigger string %s.\n", trigger);
+ if (*dp != session->device_type) {
(void)gpsd_switch_driver(session, (*dp)->type_name);
- return DEVICEID_SET;
+ if (session->device_type != NULL
+ && session->device_type->event_hook != NULL)
+ session->device_type->event_hook(session,
+ event_triggermatch);
+ st |= DEVICEID_IS;
}
}
-#endif /* NON_NMEA_ENABLE */
- gpsd_report(LOG_WARN, "unknown sentence: \"%s\"\n", session->packet.outbuffer);
}
-#ifdef NTPSHM_ENABLE
- /* this magic number is derived from observation */
- if (session->context->enable_ntpshm &&
- (st & TIME_SET) != 0 &&
- (session->gpsdata.fix.time!=session->last_fixtime)) {
- (void)ntpshm_put(session, session->gpsdata.fix.time, 0);
- session->last_fixtime = session->gpsdata.fix.time;
- }
-#endif /* NTPSHM_ENABLE */
return st;
}
}
@@ -118,9 +103,10 @@ static void nmea_event_hook(struct gps_device_t *session, event_t event)
* inner natures.
*/
if (event == event_configure) {
- /* change this guard if the probe count goes up */
+ /* change this guard if the probe count goes up */
if (session->packet.counter <= 8)
- gpsd_report(LOG_WARN, "=> Probing device subtype %d\n", session->packet.counter);
+ gpsd_report(LOG_WARN, "=> Probing device subtype %d\n",
+ session->packet.counter);
/*
* The reason for splitting these probes up by packet sequence
* number, interleaving them with the first few packet receives,
@@ -139,13 +125,13 @@ static void nmea_event_hook(struct gps_device_t *session, event_t event)
* unless there is actual following data.
*/
switch (session->packet.counter) {
-#ifdef SIRF_ENABLE
+#ifdef NMEA_ENABLE
case 0:
- /* probe for Garmin serial GPS -- expect $PGRMC followed by data*/
+ /* probe for Garmin serial GPS -- expect $PGRMC followed by data */
(void)nmea_send(session, "$PGRMCE");
break;
-#endif /* SIRF_ENABLE */
-#ifdef NMEA_ENABLE
+#endif /* NMEA_ENABLE */
+#ifdef SIRF_ENABLE
case 1:
/*
* We used to try to probe for SiRF by issuing "$PSRF105,1"
@@ -162,10 +148,12 @@ static void nmea_event_hook(struct gps_device_t *session, event_t event)
(void)nmea_send(session,
"$PSRF100,0,%d,%d,%d,0",
session->gpsdata.dev.baudrate,
- 9-session->gpsdata.dev.stopbits,
+ 9 - session->gpsdata.dev.stopbits,
session->gpsdata.dev.stopbits);
session->back_to_nmea = true;
break;
+#endif /* SIRF_ENABLE */
+#ifdef NMEA_ENABLE
case 2:
/* probe for the FV-18 -- expect $PFEC,GPint followed by data */
(void)nmea_send(session, "$PFEC,GPint");
@@ -180,7 +168,8 @@ static void nmea_event_hook(struct gps_device_t *session, event_t event)
/* Enable checksum and GGA(1s), GLL(0s), GSA(1s), GSV(1s), RMC(1s), VTG(0s), PEMT101(1s) */
/* EverMore will reply with: \x10\x02\x04\x38\x8E\xC6\x10\x03 */
(void)gpsd_write(session,
- "\x10\x02\x12\x8E\x7F\x01\x01\x00\x01\x01\x01\x00\x01\x00\x00\x00\x00\x00\x00\x13\x10\x03", 22);
+ "\x10\x02\x12\x8E\x7F\x01\x01\x00\x01\x01\x01\x00\x01\x00\x00\x00\x00\x00\x00\x13\x10\x03",
+ 22);
break;
#endif /* EVERMORE_ENABLE */
#ifdef ITRAX_ENABLE
@@ -219,24 +208,21 @@ static void nmea_event_hook(struct gps_device_t *session, event_t event)
}
}
-#if defined(SIRF_ENABLE) && defined(BINARY_ENABLE)
-extern const struct gps_type_t sirf_binary;
-#endif
-
#ifdef ALLOW_RECONFIGURE
static void nmea_mode_switch(struct gps_device_t *session, int mode)
{
if (mode == MODE_BINARY) {
#if defined(SIRF_ENABLE) && defined(BINARY_ENABLE)
- if ( 0 != (SIRF_PACKET & session->observed)) {
- /* it was SiRF binary once, do it again */
- sirf_binary.mode_switcher(session, mode);
+ if (0 != (SIRF_PACKET & session->observed)) {
+ /* it was SiRF binary once, do it again */
+ sirf_binary.mode_switcher(session, mode);
}
#endif
}
}
#endif /* ALLOW_RECONFIGURE */
+/* *INDENT-OFF* */
const struct gps_type_t nmea = {
.type_name = "Generic NMEA", /* full name of type */
.packet_type = NMEA_PACKET, /* associated lexer packet type */
@@ -256,8 +242,11 @@ const struct gps_type_t nmea = {
#ifdef ALLOW_CONTROLSEND
.control_send = nmea_write, /* how to send control strings */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL, /* no method for NTP fudge factor */
+#endif /* NTPSHM_ ENABLE */
};
-
+/* *INDENT-ON* */
#if defined(GARMIN_ENABLE) && defined(NMEA_ENABLE)
/**************************************************************************
@@ -279,12 +268,14 @@ static void garmin_mode_switch(struct gps_device_t *session, int mode)
}
#endif /* ALLOW_RECONFIGURE */
-static void garmin_nmea_event_hook(struct gps_device_t *session, event_t event)
+static void garmin_nmea_event_hook(struct gps_device_t *session,
+ event_t event)
{
if (event == event_driver_switch) {
/* forces a reconfigure as the following packets come in */
session->packet.counter = 0;
- } if (event == event_configure) {
+ }
+ if (event == event_configure) {
/*
* And here's that reconfigure. It's spplit up like this because
* receivers like the Garmin GPS-10 don't handle having having a lot of
@@ -329,6 +320,7 @@ static void garmin_nmea_event_hook(struct gps_device_t *session, event_t event)
}
}
+/* *INDENT-OFF* */
const struct gps_type_t garmin = {
.type_name = "Garmin NMEA", /* full name of type */
.packet_type = NMEA_PACKET, /* associated lexer packet type */
@@ -348,7 +340,11 @@ const struct gps_type_t garmin = {
#ifdef ALLOW_CONTROLSEND
.control_send = nmea_write, /* how to send control strings */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL, /* no method for NTP fudge factor */
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* GARMIN_ENABLE && NMEA_ENABLE */
#ifdef ASHTECH_ENABLE
@@ -383,6 +379,7 @@ static void ashtech_event_hook(struct gps_device_t *session, event_t event)
}
}
+/* *INDENT-OFF* */
const struct gps_type_t ashtech = {
.type_name = "Ashtech", /* full name of type */
.packet_type = NMEA_PACKET, /* associated lexer packet type */
@@ -402,7 +399,11 @@ const struct gps_type_t ashtech = {
#ifdef ALLOW_CONTROLSEND
.control_send = nmea_write, /* how to send control strings */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL, /* no method for NTP fudge factor */
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* ASHTECH_ENABLE */
#ifdef FV18_ENABLE
@@ -422,9 +423,10 @@ static void fv18_event_hook(struct gps_device_t *session, event_t event)
*/
if (event == event_identified || event == event_reactivate)
(void)nmea_send(session,
- "$PFEC,GPint,GSA01,DTM00,ZDA01,RMC01,GLL00,VTG00,GSV05");
+ "$PFEC,GPint,GSA01,DTM00,ZDA01,RMC01,GLL00,VTG00,GSV05");
}
+/* *INDENT-OFF* */
const struct gps_type_t fv18 = {
.type_name = "San Jose Navigation FV18", /* full name of type */
.packet_type = NMEA_PACKET, /* associated lexer packet type */
@@ -444,7 +446,11 @@ const struct gps_type_t fv18 = {
#ifdef ALLOW_CONTROLSEND
.control_send = nmea_write, /* how to send control strings */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL, /* no method for NTP fudge factor */
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* FV18_ENABLE */
#ifdef GPSCLOCK_ENABLE
@@ -470,6 +476,7 @@ static void gpsclock_event_hook(struct gps_device_t *session, event_t event)
}
}
+/* *INDENT-OFF* */
const struct gps_type_t gpsclock = {
.type_name = "Furuno Electric GH-79L4", /* full name of type */
.packet_type = NMEA_PACKET, /* associated lexer packet type */
@@ -489,7 +496,11 @@ const struct gps_type_t gpsclock = {
#ifdef ALLOW_CONTROLSEND
.control_send = nmea_write, /* how to send control strings */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL, /* no method for NTP fudge factor */
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* GPSCLOCK_ENABLE */
#ifdef TRIPMATE_ENABLE
@@ -517,6 +528,7 @@ static void tripmate_event_hook(struct gps_device_t *session, event_t event)
(void)nmea_send(session, "$PRWIILOG,ZCH,V,,");
}
+/* *INDENT-OFF* */
static const struct gps_type_t tripmate = {
.type_name = "Delorme TripMate", /* full name of type */
.packet_type = NMEA_PACKET, /* lexer packet type */
@@ -536,7 +548,11 @@ static const struct gps_type_t tripmate = {
#ifdef ALLOW_CONTROLSEND
.control_send = nmea_write, /* how to send control strings */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL, /* no method for NTP fudge factor */
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* TRIPMATE_ENABLE */
#ifdef EARTHMATE_ENABLE
@@ -560,6 +576,7 @@ static void earthmate_event_hook(struct gps_device_t *session, event_t event)
}
/*@ -redef @*/
+/* *INDENT-OFF* */
static const struct gps_type_t earthmate = {
.type_name = "Delorme EarthMate (pre-2003, Zodiac chipset)",
.packet_type = NMEA_PACKET, /* associated lexer packet type */
@@ -579,8 +596,12 @@ static const struct gps_type_t earthmate = {
#ifdef ALLOW_CONTROLSEND
.control_send = nmea_write, /* how to send control strings */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL, /* no method for NTP fudge factor */
+#endif /* NTPSHM_ ENABLE */
};
/*@ -redef @*/
+/* *INDENT-ON* */
#endif /* EARTHMATE_ENABLE */
#endif /* NMEA_ENABLE */
@@ -599,11 +620,8 @@ static const struct gps_type_t earthmate = {
*
**************************************************************************/
-enum {
-#include "packet_states.h"
-};
-
static void tnt_add_checksum(char *sentence)
+/* add NMEA-style CRC checksum to a command */
{
unsigned char sum = '\0';
char c, *p = sentence;
@@ -613,146 +631,100 @@ static void tnt_add_checksum(char *sentence)
} else {
gpsd_report(LOG_ERROR, "Bad TNT sentence: '%s'\n", sentence);
}
- while ( ((c = *p) != '*') && (c != '\0')) {
+ while (((c = *p) != '\0')) {
sum ^= c;
p++;
}
- *p++ = '*';
- /*@i@*/snprintf(p, 4, "%02X\r\n", sum);
+ (void)snprintf(p, 6, "*%02X\r\n", (unsigned int)sum);
}
-static int tnt_send(int fd, const char *fmt, ... )
+
+static ssize_t tnt_control_send(struct gps_device_t *session,
+ char *msg, size_t len)
+/* send a control string in TNT native formal */
+{
+ ssize_t status;
+
+ tnt_add_checksum(msg);
+ status = write(session->gpsdata.gps_fd, msg, strlen(msg));
+ (void)tcdrain(session->gpsdata.gps_fd);
+ return status;
+}
+
+static bool tnt_send(struct gps_device_t *session, const char *fmt, ...)
+/* printf(3)-like TNT command generator */
{
- int status;
char buf[BUFSIZ];
va_list ap;
+ ssize_t sent;
- va_start(ap, fmt) ;
- (void)vsnprintf(buf, sizeof(buf)-5, fmt, ap);
+ va_start(ap, fmt);
+ (void)vsnprintf(buf, sizeof(buf) - 5, fmt, ap);
va_end(ap);
- strlcat(buf, "*", BUFSIZ);
- tnt_add_checksum(buf);
- status = (int)write(fd, buf, strlen(buf));
- tcdrain(fd);
- if (status == (int)strlen(buf)) {
- gpsd_report(LOG_IO, "=> GPS: %s\n", buf);
- return status;
+ sent = tnt_control_send(session, buf, strlen(buf));
+ if (sent == (ssize_t) strlen(buf)) {
+ gpsd_report(LOG_IO, "=> GPS: %s", buf);
+ return true;
} else {
- gpsd_report(LOG_WARN, "=> GPS: %s FAILED\n", buf);
- return -1;
+ gpsd_report(LOG_WARN, "=> GPS: %s FAILED", buf);
+ return false;
}
}
-#define TNT_SNIFF_RETRIES 100
-/*
- * The True North compass won't start talking
- * unless you ask it to. So to identify it we
- * need to query for its ID string.
- */
-static int tnt_packet_sniff(struct gps_device_t *session)
+#ifdef ALLOW_RECONFIGURE
+static bool tnt_speed(struct gps_device_t *session,
+ speed_t speed, char parity, int stopbits)
{
- unsigned int n, count = 0;
-
- gpsd_report(LOG_RAW, "tnt_packet_sniff begins\n");
- for (n = 0; n < TNT_SNIFF_RETRIES; n++)
- {
- count = 0;
- (void)tnt_send(session->gpsdata.gps_fd, "@X?");
- if (ioctl(session->gpsdata.gps_fd, FIONREAD, &count) == -1)
- return BAD_PACKET;
- if (count == 0) {
- //int delay = 10000000000.0 / session->gpsdata.baudrate;
- //gpsd_report(LOG_RAW, "usleep(%d)\n", delay);
- //usleep(delay);
- gpsd_report(LOG_RAW, "sleep(1)\n");
- (void)sleep(1);
- } else if (generic_get(session) >= 0) {
- if((session->packet.type == NMEA_PACKET)&&(session->packet.state == NMEA_RECOGNIZED))
- {
- gpsd_report(LOG_RAW, "tnt_packet_sniff returns %d\n",session->packet.type);
- return session->packet.type;
- }
- }
- }
-
- gpsd_report(LOG_RAW, "tnt_packet_sniff found no packet\n");
- return BAD_PACKET;
+ /*
+ * Baud rate change followed by device reset.
+ * See page 40 of Technical Guide 1555-B. We need:
+ * 2400 -> 1, 4800 -> 2, 9600 -> 3, 19200 -> 4, 38400 -> 5
+ */
+ unsigned int val = speed / 2400u; /* 2400->1, 4800->2, 9600->4, 19200->8... */
+ unsigned int i = 0;
+
+ /* fast way to compute log2(val) */
+ while ((val >> i) > 1)
+ ++i;
+ return tnt_send(session, "@B6=%d", i + 1)
+ && tnt_send(session, "@F28.6=1");
}
+#endif /* ALLOW_RECONFIGURE */
static void tnt_event_hook(struct gps_device_t *session, event_t event)
+/* TNT lifetime event hook */
{
- if (event == event_identified) {
- // Send codes to start the flow of data
- //tnt_send(session->gpsdata.gps_fd, "@BA?"); // Query current rate
- //tnt_send(session->gpsdata.gps_fd, "@BA=8"); // Start HTM packet at 1Hz
- /*
- * Sending this twice seems to make it more reliable!!
- * I think it gets the input on the unit synced up.
- */
- (void)tnt_send(session->gpsdata.gps_fd, "@BA=15"); // Start HTM packet at 1200 per minute
- (void)tnt_send(session->gpsdata.gps_fd, "@BA=15"); // Start HTM packet at 1200 per minute
+ if (event == event_wakeup) {
+ (void)tnt_send(session, "@F0.3=1"); /* set run mode */
+ (void)tnt_send(session, "@F2.2=1"); /* report in degrees */
}
}
-static bool tnt_probe(struct gps_device_t *session)
-{
- unsigned int *ip;
-#ifdef FIXED_PORT_SPEED
- /* just the one fixed port speed... */
- static unsigned int rates[] = {FIXED_PORT_SPEED};
-#else /* FIXED_PORT_SPEED not defined */
- /* The supported baud rates */
- static unsigned int rates[] = {38400, 19200, 2400, 4800, 9600 };
-#endif /* FIXED_PORT_SPEED defined */
-
- gpsd_report(LOG_PROG, "Probing TrueNorth Compass\n");
-
- /*
- * Only block until we get at least one character, whatever the
- * third arg of read(2) says.
- */
- /*@ ignore @*/
- memset(session->ttyset.c_cc,0,sizeof(session->ttyset.c_cc));
- session->ttyset.c_cc[VMIN] = 1;
- /*@ end @*/
-
- session->ttyset.c_cflag &= ~(PARENB | PARODD | CRTSCTS);
- session->ttyset.c_cflag |= CREAD | CLOCAL;
- session->ttyset.c_iflag = session->ttyset.c_oflag = session->ttyset.c_lflag = (tcflag_t) 0;
-
- session->baudindex = 0;
- for (ip = rates; ip < rates + sizeof(rates)/sizeof(rates[0]); ip++)
- if (ip == rates || *ip != rates[0])
- {
- gpsd_report(LOG_PROG, "hunting at speed %d\n", *ip);
- gpsd_set_speed(session, *ip, 'N',1);
- if (tnt_packet_sniff(session) != BAD_PACKET) {
- return true;
- }
- }
- return false;
-}
-
-static const struct gps_type_t trueNorth = {
+/* *INDENT-OFF* */
+const struct gps_type_t trueNorth = {
.type_name = "True North", /* full name of type */
.packet_type = NMEA_PACKET, /* associated lexer packet type */
- .trigger = " TNT1500",
+ .trigger = "$PTNTHTM", /* their proprietary sentence */
.channels = 0, /* not an actual GPS at all */
- .probe_detect = tnt_probe, /* probe by sending ID query */
+ .probe_detect = NULL, /* no probe in run mode */
.get_packet = generic_get, /* how to get a packet */
.parse_packet = nmea_parse_input, /* how to interpret a packet */
.rtcm_writer = NULL, /* Don't send */
.event_hook = tnt_event_hook, /* lifetime event handler */
#ifdef ALLOW_RECONFIGURE
- .speed_switcher = NULL, /* no speed switcher */
+ .speed_switcher = tnt_speed, /* no speed switcher */
.mode_switcher = NULL, /* no mode switcher */
.rate_switcher = NULL, /* no wrapup */
.min_cycle = 0.5, /* fixed at 20 samples per second */
#endif /* ALLOW_RECONFIGURE */
#ifdef ALLOW_CONTROLSEND
- .control_send = nmea_write, /* how to send control strings */
+ .control_send = tnt_control_send, /* how to send control strings */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL,
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif
#ifdef OCEANSERVER_ENABLE
@@ -769,18 +741,18 @@ static const struct gps_type_t trueNorth = {
*
**************************************************************************/
-static int oceanserver_send(int fd, const char *fmt, ... )
+static int oceanserver_send(int fd, const char *fmt, ...)
{
int status;
char buf[BUFSIZ];
va_list ap;
- va_start(ap, fmt) ;
- (void)vsnprintf(buf, sizeof(buf)-5, fmt, ap);
+ va_start(ap, fmt);
+ (void)vsnprintf(buf, sizeof(buf) - 5, fmt, ap);
va_end(ap);
- strlcat(buf, "", BUFSIZ);
+ (void)strlcat(buf, "", BUFSIZ);
status = (int)write(fd, buf, strlen(buf));
- tcdrain(fd);
+ (void)tcdrain(fd);
if (status == (int)strlen(buf)) {
gpsd_report(LOG_IO, "=> GPS: %s\n", buf);
return status;
@@ -790,7 +762,8 @@ static int oceanserver_send(int fd, const char *fmt, ... )
}
}
-static void oceanserver_event_hook(struct gps_device_t *session, event_t event)
+static void oceanserver_event_hook(struct gps_device_t *session,
+ event_t event)
{
if (event == event_configure && session->packet.counter == 0) {
/* report in NMEA format */
@@ -800,10 +773,11 @@ static void oceanserver_event_hook(struct gps_device_t *session, event_t event)
}
}
+/* *INDENT-OFF* */
static const struct gps_type_t oceanServer = {
.type_name = "OceanServer Digital Compass OS5000", /* full name of type */
.packet_type = NMEA_PACKET, /* associated lexer packet type */
- .trigger = "$C,",
+ .trigger = "$OHPR,", /* detect their main sentence */
.channels = 0, /* not an actual GPS at all */
.probe_detect = NULL,
.get_packet = generic_get, /* how to get a packet */
@@ -819,7 +793,11 @@ static const struct gps_type_t oceanServer = {
#ifdef ALLOW_CONTROLSEND
.control_send = nmea_write, /* how to send control strings */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL,
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif
#ifdef RTCM104V2_ENABLE
@@ -833,12 +811,15 @@ static gps_mask_t rtcm104v2_analyze(struct gps_device_t *session)
{
rtcm2_unpack(&session->gpsdata.rtcm2, (char *)session->packet.isgps.buf);
gpsd_report(LOG_RAW, "RTCM 2.x packet type 0x%02x length %d words: %s\n",
- session->gpsdata.rtcm2.type, session->gpsdata.rtcm2.length+2,
- gpsd_hexdump_wrapper(session->packet.isgps.buf,
- (session->gpsdata.rtcm2.length+2)*sizeof(isgps30bits_t), LOG_RAW));
- return RTCM2_SET;
+ session->gpsdata.rtcm2.type,
+ session->gpsdata.rtcm2.length + 2,
+ gpsd_hexdump_wrapper(session->packet.isgps.buf,
+ (session->gpsdata.rtcm2.length +
+ 2) * sizeof(isgps30bits_t), LOG_RAW));
+ return RTCM2_IS;
}
+/* *INDENT-OFF* */
static const struct gps_type_t rtcm104v2 = {
.type_name = "RTCM104V2", /* full name of type */
.packet_type = RTCM2_PACKET, /* associated lexer packet type */
@@ -858,7 +839,11 @@ static const struct gps_type_t rtcm104v2 = {
#ifdef ALLOW_CONTROLSEND
.control_send = nmea_write, /* how to send control strings */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL,
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* RTCM104V2_ENABLE */
#ifdef RTCM104V3_ENABLE
/**************************************************************************
@@ -872,12 +857,16 @@ static gps_mask_t rtcm104v3_analyze(struct gps_device_t *session)
uint16_t length = getbeuw(session->packet.inbuffer, 1);
uint16_t type = getbeuw(session->packet.inbuffer, 3) >> 4;
+ /* *INDENT-OFF* */
gpsd_report(LOG_RAW, "RTCM 3.x packet type %d length %d words: %s\n",
- type, length, gpsd_hexdump_wrapper(session->packet.inbuffer,
- (size_t)(session->gpsdata.rtcm3.length), LOG_RAW));
- return RTCM3_SET;
+ type, length, gpsd_hexdump_wrapper(session->packet.inbuffer,
+ (size_t) (session->gpsdata.rtcm3.length),
+ LOG_RAW));
+ /* *INDENT-ON* */
+ return RTCM3_IS;
}
+/* *INDENT-OFF* */
static const struct gps_type_t rtcm104v3 = {
.type_name = "RTCM104V3", /* full name of type */
.packet_type = RTCM3_PACKET, /* associated lexer packet type */
@@ -897,7 +886,11 @@ static const struct gps_type_t rtcm104v3 = {
#ifdef ALLOW_CONTROLSEND
.control_send = nmea_write, /* how to send control strings */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL,
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* RTCM104V3_ENABLE */
#ifdef GARMINTXT_ENABLE
@@ -913,7 +906,7 @@ static gps_mask_t garmintxt_parse_input(struct gps_device_t *session)
return garmintxt_parse(session);
}
-
+/* *INDENT-OFF* */
static const struct gps_type_t garmintxt = {
.type_name = "Garmin Simple Text", /* full name of type */
.packet_type = GARMINTXT_PACKET, /* associated lexer packet type */
@@ -933,7 +926,11 @@ static const struct gps_type_t garmintxt = {
#ifdef ALLOW_CONTROLSEND
.control_send = nmea_write, /* how to send control strings */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL,
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* GARMINTXT_ENABLE */
#ifdef MTK3301_ENABLE
@@ -942,32 +939,34 @@ static const struct gps_type_t garmintxt = {
* MTK-3301
*
**************************************************************************/
-const char* mtk_reasons[4] = {"Invalid", "Unsupported", "Valid but Failed", "Valid success"};
+const char *mtk_reasons[4] =
+ { "Invalid", "Unsupported", "Valid but Failed", "Valid success" };
-gps_mask_t processMTK3301(int c UNUSED, char *field[], struct gps_device_t *session)
+gps_mask_t processMTK3301(int c UNUSED, char *field[],
+ struct gps_device_t *session)
{
int msg, reason;
gps_mask_t mask;
- mask = 1; //ONLINE_SET;
-
- switch(msg = atoi(&(field[0])[4]))
- {
- case 705: /* */
- (void)strlcat(session->subtype,field[1],64);
- (void)strlcat(session->subtype,"-",64);
- (void)strlcat(session->subtype,field[2],64);
- return 0; /* return a unknown sentence, which will cause the driver switch */
- case 001: /* ACK / NACK */
- reason = atoi(field[2]);
- if(atoi(field[1]) == -1)
- gpsd_report(LOG_WARN, "MTK NACK: unknown sentence\n");
- else if(reason < 3)
- gpsd_report(LOG_WARN, "MTK NACK: %s, reason: %s\n", field[1], mtk_reasons[reason]);
- else
- gpsd_report(LOG_WARN, "MTK ACK: %s\n", field[1]);
- break;
- default:
- return 0; /* ignore */
+ mask = 1; //ONLINE_IS;
+
+ switch (msg = atoi(&(field[0])[4])) {
+ case 705: /* */
+ (void)strlcat(session->subtype, field[1], 64);
+ (void)strlcat(session->subtype, "-", 64);
+ (void)strlcat(session->subtype, field[2], 64);
+ return 0; /* return a unknown sentence, which will cause the driver switch */
+ case 001: /* ACK / NACK */
+ reason = atoi(field[2]);
+ if (atoi(field[1]) == -1)
+ gpsd_report(LOG_WARN, "MTK NACK: unknown sentence\n");
+ else if (reason < 3)
+ gpsd_report(LOG_WARN, "MTK NACK: %s, reason: %s\n", field[1],
+ mtk_reasons[reason]);
+ else
+ gpsd_report(LOG_WARN, "MTK ACK: %s\n", field[1]);
+ break;
+ default:
+ return 0; /* ignore */
}
return mask;
}
@@ -994,12 +993,13 @@ static void mtk3301_event_hook(struct gps_device_t *session, event_t event)
*/
/* FIXME: Do we need to resend this on reactivation? */
- if(event == event_identified) {
- (void)nmea_send(session,"$PMTK320,0"); /* power save off */
- (void)nmea_send(session,"$PMTK300,1000,0,0,0.0,0.0"); /* Fix interval */
- (void)nmea_send(session,"$PMTK314,0,1,0,1,1,5,1,1,0,0,0,0,0,0,0,0,0,1,0");
- (void)nmea_send(session,"$PMTK301,2"); /* DGPS is WAAS */
- (void)nmea_send(session,"$PMTK313,1"); /* SBAS enable */
+ if (event == event_identified) {
+ (void)nmea_send(session, "$PMTK320,0"); /* power save off */
+ (void)nmea_send(session, "$PMTK300,1000,0,0,0.0,0.0"); /* Fix interval */
+ (void)nmea_send(session,
+ "$PMTK314,0,1,0,1,1,5,1,1,0,0,0,0,0,0,0,0,0,1,0");
+ (void)nmea_send(session, "$PMTK301,2"); /* DGPS is WAAS */
+ (void)nmea_send(session, "$PMTK313,1"); /* SBAS enable */
}
}
@@ -1007,18 +1007,19 @@ static void mtk3301_event_hook(struct gps_device_t *session, event_t event)
static bool mtk3301_rate_switcher(struct gps_device_t *session, double rate)
{
char buf[78];
- /*@i1@*/unsigned int milliseconds = 1000 * rate;
- if(rate > 1)
- milliseconds=1000;
- else if(rate < 0.2)
- milliseconds=200;
-
+ /*@i1@*/ unsigned int milliseconds = 1000 * rate;
+ if (rate > 1)
+ milliseconds = 1000;
+ else if (rate < 0.2)
+ milliseconds = 200;
+
(void)snprintf(buf, 78, "$PMTK300,%u,0,0,0,0", milliseconds);
- (void)nmea_send(session,buf); /* Fix interval */
+ (void)nmea_send(session, buf); /* Fix interval */
return true;
}
#endif /* ALLOW_RECONFIGURE */
+/* *INDENT-OFF* */
const struct gps_type_t mtk3301 = {
.type_name = "MTK-3301", /* full name of type */
.packet_type = NMEA_PACKET, /* associated lexer packet type */
@@ -1038,7 +1039,11 @@ const struct gps_type_t mtk3301 = {
#ifdef ALLOW_CONTROLSEND
.control_send = nmea_write, /* how to send control strings */
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL,
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* MTK3301_ENABLE */
@@ -1052,10 +1057,12 @@ const struct gps_type_t mtk3301 = {
static gps_mask_t aivdm_analyze(struct gps_device_t *session)
{
if (session->packet.type == AIVDM_PACKET) {
- if (aivdm_decode((char *)session->packet.outbuffer, session->packet.outbuflen, &session->aivdm, &session->gpsdata.ais)) {
- return ONLINE_SET | AIS_SET;
- }else
- return ONLINE_SET;
+ if (aivdm_decode
+ ((char *)session->packet.outbuffer, session->packet.outbuflen,
+ &session->aivdm, &session->gpsdata.ais)) {
+ return ONLINE_IS | AIS_IS;
+ } else
+ return ONLINE_IS;
#ifdef NMEA_ENABLE
} else if (session->packet.type == NMEA_PACKET) {
return nmea_parse((char *)session->packet.outbuffer, session);
@@ -1064,6 +1071,7 @@ static gps_mask_t aivdm_analyze(struct gps_device_t *session)
return 0;
}
+/* *INDENT-OFF* */
static const struct gps_type_t aivdm = {
/* Full name of type */
.type_name = "AIVDM",
@@ -1097,7 +1105,11 @@ static const struct gps_type_t aivdm = {
/* Control string sender - should provide checksum and headers/trailer */
.control_send = NULL,
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ .ntp_offset = NULL,
+#endif /* NTPSHM_ ENABLE */
};
+/* *INDENT-ON* */
#endif /* AIVDM_ENABLE */
extern const struct gps_type_t garmin_usb_binary, garmin_ser_binary;
@@ -1186,5 +1198,6 @@ static const struct gps_type_t *gpsd_driver_array[] = {
#endif /* GARMINTXT_ENABLE */
NULL,
};
+
/*@ +nullassign @*/
const struct gps_type_t **gpsd_drivers = &gpsd_driver_array[0];
diff --git a/geoid.c b/geoid.c
index 0e1647a6..a64c5f08 100644
--- a/geoid.c
+++ b/geoid.c
@@ -14,26 +14,33 @@
static double fix_minuz(double d);
-static double bilinear(double x1, double y1, double x2, double y2, double x, double y, double z11, double z12, double z21, double z22)
+static double bilinear(double x1, double y1, double x2, double y2, double x,
+ double y, double z11, double z12, double z21,
+ double z22)
{
- double delta;
+ double delta;
- if (y1 == y2 && x1 == x2 ) return (z11);
- if (y1 == y2 && x1 != x2 ) return (z22*(x-x1)+z11*(x2-x))/(x2-x1);
- if (x1 == x2 && y1 != y2 ) return (z22*(y-y1)+z11*(y2-y))/(y2-y1);
+ if (y1 == y2 && x1 == x2)
+ return (z11);
+ if (y1 == y2 && x1 != x2)
+ return (z22 * (x - x1) + z11 * (x2 - x)) / (x2 - x1);
+ if (x1 == x2 && y1 != y2)
+ return (z22 * (y - y1) + z11 * (y2 - y)) / (y2 - y1);
- delta=(y2-y1)*(x2-x1);
+ delta = (y2 - y1) * (x2 - x1);
- return (z22*(y-y1)*(x-x1)+z12*(y2-y)*(x-x1)+z21*(y-y1)*(x2-x)+z11*(y2-y)*(x2-x))/delta;
+ return (z22 * (y - y1) * (x - x1) + z12 * (y2 - y) * (x - x1) +
+ z21 * (y - y1) * (x2 - x) + z11 * (y2 - y) * (x2 - x)) / delta;
}
/* return geoid separtion (MSL - WGS84) in meters, given a lat/lot in degrees */
-/*@ +charint @*/
double wgs84_separation(double lat, double lon)
{
#define GEOID_ROW 19
#define GEOID_COL 37
+ /* *INDENT-OFF* */
+ /*@ +charint @*/
const char geoid_delta[GEOID_COL*GEOID_ROW]={
/* 90S */ -30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30, -30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,
/* 80S */ -53,-54,-55,-52,-48,-42,-38,-38,-29,-26,-26,-24,-23,-21,-19,-16,-12, -8, -4, -1, 1, 4, 4, 6, 5, 4, 2, -6,-15,-24,-33,-40,-48,-50,-53,-52,-53,
@@ -53,67 +60,74 @@ double wgs84_separation(double lat, double lon)
/* 60N */ 2, 9, 17, 10, 13, 1,-14,-30,-39,-46,-42,-21, 6, 29, 49, 65, 60, 57, 47, 41, 21, 18, 14, 7, -3,-22, -29,-32,-32,-26,-15, -2, 13, 17, 19, 6, 2,
/* 70N */ 2, 2, 1, -1, -3, -7,-14,-24,-27,-25,-19, 3, 24, 37, 47, 60, 61, 58, 51, 43, 29, 20, 12, 5, -2,-10, -14,-12,-10,-14,-12, -6, -2, 3, 6, 4, 2,
/* 80N */ 3, 1, -2, -3, -3, -3, -1, 3, 1, 5, 9, 11, 19, 27, 31, 34, 33, 34, 33, 34, 28, 23, 17, 13, 9, 4, 4, 1, -2, -2, 0, 2, 3, 2, 1, 1, 3,
- /* 90N */ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13};
-/*@ -charint @*/
- int ilat, ilon;
- int ilat1, ilat2, ilon1, ilon2;
-
- ilat=(int)floor(( 90.+lat)/10);
- ilon=(int)floor((180.+lon)/10);
-
+ /* 90N */ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13
+ };
+ /*@ -charint @*/
+ /* *INDENT-ON* */
+ int ilat, ilon;
+ int ilat1, ilat2, ilon1, ilon2;
+
+ ilat = (int)floor((90. + lat) / 10);
+ ilon = (int)floor((180. + lon) / 10);
+
/* sanity checks to prevent segfault on bad data */
- if ( ( ilat > 90 ) || ( ilat < -90 ) ) {
+ if ((ilat > 90) || (ilat < -90)) {
return 0.0;
}
- if ( ( ilon > 180 ) || ( ilon < -180 ) ) {
+ if ((ilon > 180) || (ilon < -180)) {
return 0.0;
}
- ilat1=ilat;
- ilon1=ilon;
- ilat2=(ilat < GEOID_ROW-1)? ilat+1:ilat;
- ilon2=(ilon < GEOID_COL-1)? ilon+1:ilon;
-
- return bilinear(
- ilon1*10.-180.,ilat1*10.-90.,
- ilon2*10.-180.,ilat2*10.-90.,
- lon, lat,
- (double)geoid_delta[ilon1+ilat1*GEOID_COL],
- (double)geoid_delta[ilon2+ilat1*GEOID_COL],
- (double)geoid_delta[ilon1+ilat2*GEOID_COL],
- (double)geoid_delta[ilon2+ilat2*GEOID_COL]
+ ilat1 = ilat;
+ ilon1 = ilon;
+ ilat2 = (ilat < GEOID_ROW - 1) ? ilat + 1 : ilat;
+ ilon2 = (ilon < GEOID_COL - 1) ? ilon + 1 : ilon;
+
+ return bilinear(ilon1 * 10. - 180., ilat1 * 10. - 90.,
+ ilon2 * 10. - 180., ilat2 * 10. - 90.,
+ lon, lat,
+ (double)geoid_delta[ilon1 + ilat1 * GEOID_COL],
+ (double)geoid_delta[ilon2 + ilat1 * GEOID_COL],
+ (double)geoid_delta[ilon1 + ilat2 * GEOID_COL],
+ (double)geoid_delta[ilon2 + ilat2 * GEOID_COL]
);
}
void ecef_to_wgs84fix(struct gps_fix_t *fix, double *separation,
- double x, double y, double z,
- double vx, double vy, double vz)
+ double x, double y, double z,
+ double vx, double vy, double vz)
/* fill in WGS84 position/velocity fields from ECEF coordinates */
{
- double lambda,phi,p,theta,n,h,vnorth,veast,heading;
- const double a = WGS84A; /* equatorial radius */
- const double b = WGS84B; /* polar radius */
- const double e2 = (a*a - b*b) / (a*a);
- const double e_2 = (a*a - b*b) / (b*b);
+ double lambda, phi, p, theta, n, h, vnorth, veast, heading;
+ const double a = WGS84A; /* equatorial radius */
+ const double b = WGS84B; /* polar radius */
+ const double e2 = (a * a - b * b) / (a * a);
+ const double e_2 = (a * a - b * b) / (b * b);
/* geodetic location */
- lambda = atan2(y,x);
- /*@ -evalorder @*/
- p = sqrt(pow(x,2) + pow(y,2));
- theta = atan2(z*a,p*b);
- phi = atan2(z + e_2*b*pow(sin(theta),3),p - e2*a*pow(cos(theta),3));
- n = a / sqrt(1.0 - e2*pow(sin(phi),2));
+ lambda = atan2(y, x);
+ /*@ -evalorder @*/
+ p = sqrt(pow(x, 2) + pow(y, 2));
+ theta = atan2(z * a, p * b);
+ phi =
+ atan2(z + e_2 * b * pow(sin(theta), 3),
+ p - e2 * a * pow(cos(theta), 3));
+ n = a / sqrt(1.0 - e2 * pow(sin(phi), 2));
h = p / cos(phi) - n;
fix->latitude = phi * RAD_2_DEG;
fix->longitude = lambda * RAD_2_DEG;
*separation = wgs84_separation(fix->latitude, fix->longitude);
fix->altitude = h - *separation;
/* velocity computation */
- vnorth = -vx*sin(phi)*cos(lambda)-vy*sin(phi)*sin(lambda)+vz*cos(phi);
- veast = -vx*sin(lambda)+vy*cos(lambda);
- fix->climb = vx*cos(phi)*cos(lambda)+vy*cos(phi)*sin(lambda)+vz*sin(phi);
- fix->speed = sqrt(pow(vnorth,2) + pow(veast,2));
+ vnorth =
+ -vx * sin(phi) * cos(lambda) - vy * sin(phi) * sin(lambda) +
+ vz * cos(phi);
+ veast = -vx * sin(lambda) + vy * cos(lambda);
+ fix->climb =
+ vx * cos(phi) * cos(lambda) + vy * cos(phi) * sin(lambda) +
+ vz * sin(phi);
+ fix->speed = sqrt(pow(vnorth, 2) + pow(veast, 2));
heading = atan2(fix_minuz(veast), fix_minuz(vnorth));
/*@ +evalorder @*/
if (heading < 0)
diff --git a/gps.h b/gps.h
index 3439b000..b3dbc7e0 100644
--- a/gps.h
+++ b/gps.h
@@ -41,10 +41,9 @@ extern "C" {
#define MAXTAGLEN 8 /* maximum length of sentence tag name */
#define MAXCHANNELS 20 /* maximum GPS channels (*not* satellites!) */
#define GPS_PRNMAX 32 /* above this number are SBAS satellites */
+#define GPS_PATH_MAX 64 /* dev files usually have short names */
+#define MAXUSERDEVS 4 /* max devices per user */
-#define WGS84A 6378137 /* equatorial radius */
-#define WGS84F 298.257223563 /* flattening */
-#define WGS84B 6356752.3142 /* polar radius */
/*
* The structure describing an uncertainty volume in kinematic space.
* This is what GPSes are meant to produce; all the other info is
@@ -829,23 +828,29 @@ struct ais_t
};
};
-struct compass_t {
- double magnetic_length; /* unitvector sqrt(x^2 + y^2 +z^2) */
- double magnetic_field_x;
- double magnetic_field_y;
- double magnetic_field_z;
- double acceleration_length; /* unitvector sqrt(x^2 + y^2 +z^2) */
- double acceleration_field_x;
- double acceleration_field_y;
- double acceleration_field_z;
- double gyro_output_x;
- double gyro_output_y;
- double temperature;
+struct attitude_t {
+ double heading;
+ double pitch;
+ double roll;
+ double yaw;
+ double dip;
+ double mag_len; /* unitvector sqrt(x^2 + y^2 +z^2) */
+ double mag_x;
+ double mag_y;
+ double mag_z;
+ double acc_len; /* unitvector sqrt(x^2 + y^2 +z^2) */
+ double acc_x;
+ double acc_y;
+ double acc_z;
+ double gyro_x;
+ double gyro_y;
+ double temp;
+ double depth;
/* compass status -- TrueNorth (and any similar) devices only */
- char headingStatus;
- char pitchStatus;
- char rollStatus;
- double horzField; /* Magnitude of horizontal magnetic field */
+ char mag_st;
+ char pitch_st;
+ char roll_st;
+ char yaw_st;
};
struct dop_t {
@@ -871,12 +876,6 @@ struct rawdata_t {
#define SAT_FIX_USED 0x40 /* used for position fix */
};
-/* following structures are for representing new-protocol responses */
-
-#define MAXDEVICES_PER_USER 4
-#define GPS_PATH_MAX 64 /* dev files usually have short names */
-#define TYPES_PER_DEVICE 4
-
struct version_t {
char release[64]; /* external version */
char rev[64]; /* internal revision ID */
@@ -909,8 +908,6 @@ struct policy_t {
char devpath[GPS_PATH_MAX]; /* specific device to watch */
};
-/* this is the main structure that includes all previous substructures */
-
/*
* Someday we may support Windows, under which socket_t is a separate type.
* In the meantime, having a typedef for this semantic kind is no bad thing,
@@ -919,6 +916,23 @@ struct policy_t {
*/
typedef int socket_t;
+/* mode flags for setting streaming policy */
+#define WATCH_ENABLE 0x0001u /* enable streaming */
+#define WATCH_JSON 0x0002u /* enable JSON output */
+#define WATCH_NMEA 0x0004u /* enable output in NMEA */
+#define WATCH_RARE 0x0008u /* enable output of packets in hex */
+#define WATCH_RAW 0x0010u /* enable output of raw packets */
+#define WATCH_SCALED 0x0020u /* scale output to floats, when applicable */
+#define WATCH_NEWSTYLE 0x0040u /* force JSON streaming */
+#define WATCH_OLDSTYLE 0x0080u /* force old-style streaming */
+#define WATCH_DEVICE 0x0100u /* watch specific device */
+#define WATCH_DISABLE 0x0200u /* disable watching */
+#define POLL_NONBLOCK 0x1000u /* set non-blocking poll (experimental!) */
+
+/*
+ * Main structure that includes all previous substructures
+ */
+
struct gps_data_t {
gps_mask_t set; /* has field been set since this was last cleared? */
#define ONLINE_SET 0x00000001u
@@ -932,11 +946,11 @@ struct gps_data_t {
#define STATUS_SET 0x00000100u
#define MODE_SET 0x00000200u
#define DOP_SET 0x00000400u
-#define VERSION_SET 0x00000800u /* only used in client library */
+#define VERSION_SET 0x00000800u
#define HERR_SET 0x00001000u
#define VERR_SET 0x00002000u
-#define PERR_SET 0x00004000u
-#define POLICY_SET 0x00008000u /* only used in client library */
+#define UNUSED1_SET 0x00004000u /* unused and reserved */
+#define POLICY_SET 0x00008000u
#define SATELLITE_SET 0x00010000u
#define RAW_SET 0x00020000u
#define USED_SET 0x00040000u
@@ -951,9 +965,8 @@ struct gps_data_t {
#define RTCM3_SET 0x08000000u
#define AIS_SET 0x10000000u
#define PACKET_SET 0x20000000u
-#define CLEAR_SET 0x40000000u /* sentence starts a reporting cycle */
-#define REPORT_SET 0x80000000u /* sentence ends a reporting cycle */
-#define DATA_SET ~(ONLINE_SET|PACKET_SET|CLEAR_SET|REPORT_SET)
+#define ATTITUDE_SET 0x40000000u
+#define AUXDATA_SET 0x80000000u /* reserved */
double online; /* NZ if GPS is on line, 0 if not.
*
* Note: gpsd clears this time when sentences
@@ -1010,14 +1023,14 @@ struct gps_data_t {
struct rtcm2_t rtcm2;
struct rtcm3_t rtcm3;
struct ais_t ais;
- struct compass_t compass;
+ struct attitude_t attitude;
struct rawdata_t raw;
/* "artificial" structures for various protocol responses */
struct version_t version;
struct {
double time;
int ndevices;
- struct devconfig_t list[MAXDEVICES_PER_USER];
+ struct devconfig_t list[MAXUSERDEVS];
} devices;
char error[80];
};
@@ -1026,38 +1039,29 @@ struct gps_data_t {
void *privdata;
};
-/* mode flags for gps_stream() */
-#define WATCH_DISABLE 0x000u /* disable watching */
-#define WATCH_ENABLE 0x0001u /* enable streaming */
-#define WATCH_JSON 0x0002u /* enable JSON output */
-#define WATCH_NMEA 0x0004u /* enable output in NMEA */
-#define WATCH_RARE 0x0008u /* enable output of packets in hex */
-#define WATCH_RAW 0x0010u /* enable output of raw packets */
-#define WATCH_SCALED 0x0020u /* scale output to floats, when applicable */
-#define WATCH_NEWSTYLE 0x0040u /* force JSON streaming */
-#define WATCH_OLDSTYLE 0x0080u /* force old-style streaming */
-#define WATCH_DEVICE 0x0100u /* watch specific device */
-#define POLL_NONBLOCK 0x1000u /* set non-blocking poll */
-
-extern int gps_open_r(const char *host, const char *port,
- /*@out@*/struct gps_data_t *gpsdata);
-extern /*@null@*/struct gps_data_t *gps_open(const char *host,const char *port);
+extern int gps_open_r(const char *host, const char *,
+ /*@out@*/struct gps_data_t *);
+extern /*@null@*/struct gps_data_t *gps_open(const char *, const char *);
extern int gps_close(struct gps_data_t *);
-extern int gps_send(struct gps_data_t *gpsdata, const char *fmt, ... );
-extern int gps_poll(struct gps_data_t *gpsdata);
-extern bool gps_waiting(struct gps_data_t *gpsdata);
-extern int gps_stream(struct gps_data_t *gpsdata,
- unsigned int flags,
- /*@null@*/void *);
-extern void gps_set_raw_hook(struct gps_data_t *gpsdata, void (*hook)(struct gps_data_t *sentence, char *buf, size_t len));
+extern int gps_send(struct gps_data_t *, const char *, ... );
+extern int gps_poll(struct gps_data_t *);
+extern bool gps_waiting(struct gps_data_t *);
+extern int gps_stream(struct gps_data_t *, unsigned int, /*@null@*/void *);
+extern void gps_set_raw_hook(struct gps_data_t *,
+ void (*)(struct gps_data_t *, char *, size_t));
extern char /*@observer@*/ *gps_errstr(const int);
+/* this only needs to be visible for the unit tests */
+extern int gps_unpack(char *, struct gps_data_t *);
+
+/* dependencies on struct gpsdata_t end hrere */
+
extern void gps_clear_fix(/*@ out @*/struct gps_fix_t *);
extern void gps_merge_fix(/*@ out @*/struct gps_fix_t *,
gps_mask_t,
/*@ in @*/struct gps_fix_t *);
-extern unsigned int gps_valid_fields(/*@ in @*/struct gps_fix_t *);
extern void gps_enable_debug(int, FILE *);
+extern /*@observer@*/const char *gps_maskdump(gps_mask_t);
extern time_t mkgmtime(register struct tm *);
extern double timestamp(void);
@@ -1068,9 +1072,6 @@ extern void unix_to_gpstime(double, /*@out@*/int *, /*@out@*/double *);
extern double earth_distance(double, double, double, double);
extern double wgs84_separation(double, double);
-/* this only needs to be visible for the unit tests */
-extern int gps_unpack(char *, struct gps_data_t *);
-
/* some multipliers for interpreting GPS output */
#define METERS_TO_FEET 3.2808399 /* Meters to U.S./British feet */
#define METERS_TO_MILES 0.00062137119 /* Meters to miles */
@@ -1087,6 +1088,11 @@ extern int gps_unpack(char *, struct gps_data_t *);
#define RAD_2_DEG 57.2957795130823208767981548141051703
#define DEG_2_RAD 0.0174532925199432957692369076848861271
+/* geodetic constants */
+#define WGS84A 6378137 /* equatorial radius */
+#define WGS84F 298.257223563 /* flattening */
+#define WGS84B 6356752.3142 /* polar radius */
+
/* gps_open() errno return values */
#define NL_NOSERVICE -1 /* can't get service entry */
#define NL_NOHOST -2 /* can't get host entry */
diff --git a/gps/gps.py b/gps/gps.py
index 2a3056ad..639db851 100755
--- a/gps/gps.py
+++ b/gps/gps.py
@@ -33,24 +33,25 @@ DOP_SET = 0x00000400
VERSION_SET = 0x00000800
HERR_SET = 0x00001000
VERR_SET = 0x00002000
-PERR_SET = 0x00004000
-POLICY_SET = 0x00020000
-ERR_SET = (HERR_SET|VERR_SET|PERR_SET)
-SATELLITE_SET = 0x00040000
-RAW_SET = 0x00080000
-USED_SET = 0x00100000
-SPEEDERR_SET = 0x00200000
-TRACKERR_SET = 0x00400000
-CLIMBERR_SET = 0x00800000
-DEVICE_SET = 0x01000000
-DEVICELIST_SET = 0x02000000
-DEVICEID_SET = 0x04000000
-ERROR_SET = 0x08000000
-RTCM2_SET = 0x10000000
-RTCM3_SET = 0x20000000
-AIS_SET = 0x40000000
-PACKET_SET = 0x80000000
-DATA_SET = ~(ONLINE_SET|PACKET_SET)
+UNUSED1_SET = 0x00004000
+POLICY_SET = 0x00008000
+SATELLITE_SET = 0x00010000
+RAW_SET = 0x00020000
+USED_SET = 0x00040000
+SPEEDERR_SET = 0x00080000
+TRACKERR_SET = 0x00100000
+CLIMBERR_SET = 0x00200000
+DEVICE_SET = 0x00400000
+DEVICELIST_SET = 0x00800000
+DEVICEID_SET = 0x01000000
+ERROR_SET = 0x02000000
+RTCM2_SET = 0x04000000
+RTCM3_SET = 0x08000000
+AIS_SET = 0x10000000
+PACKET_SET = 0x20000000
+ATTITUDE_SET = 0x40000000
+AUXDATA_SET = 0x80000000
+UNION_SET = (RTCM2_SET|RTCM3_SET|AIS_SET|VERSION_SET|DEVICELIST_SET|ERROR_SET)
STATUS_NO_FIX = 0
STATUS_FIX = 1
@@ -58,7 +59,7 @@ STATUS_DGPS_FIX = 2
MODE_NO_FIX = 1
MODE_2D = 2
MODE_3D = 3
-MAXCHANNELS = 12
+MAXCHANNELS = 20
SIGNAL_STRENGTH_UNKNOWN = NaN
WATCH_DISABLE = 0x0000
@@ -250,39 +251,10 @@ class gps(gpsdata):
data = field[2:]
if data[0] == "?":
continue
- if cmd == 'A':
- self.fix.altitude = float(data)
- self.valid |= ALTITUDE_SET
- elif cmd == 'B':
- parts = data.split()
- self.baudrate = int(parts[0])
- self.stopbits = int(parts[3])
- elif cmd == 'C':
- parts = data.split()
- if len(parts) == 2:
- (self.cycle, self.mincycle) = map(float, parts)
- else:
- self.mincycle = self.cycle = float(data)
- elif cmd == 'D':
- self.utc = data
- self.fix.time = isotime(self.utc)
- self.valid |= TIME_SET
- elif cmd == 'E':
- parts = data.split()
- (self.epe, eph, self.fix.epv) = map(float, parts)
- self.epx = self.epy = eph
- self.valid |= HERR_SET | VERR_SET | PERR_SET
- elif cmd == 'F':
+ if cmd == 'F':
self.device = data
elif cmd == 'I':
self.gps_id = data
- elif cmd == 'K':
- self.devices = data[1:].split()
- elif cmd == 'M':
- self.fix.mode = int(data)
- self.valid |= MODE_SET
- elif cmd == 'N':
- self.driver_mode = int(data)
elif cmd == 'O':
fields = data.split()
if fields[0] == '?':
@@ -328,26 +300,6 @@ class gps(gpsdata):
else:
self.fix.mode = MODE_3D
self.valid |= MODE_SET
- elif cmd == 'P':
- (self.fix.latitude, self.fix.longitude) = map(float, data.split())
- self.valid |= LATLON_SET
- elif cmd == 'Q':
- parts = data.split()
- self.satellites_used = int(parts[0])
- (self.pdop, self.hdop, self.vdop, self.tdop, self.gdop) = map(float, parts[1:])
- self.valid |= HDOP_SET | VDOP_SET | PDOP_SET | TDOP_SET | GDOP_SET
- elif cmd == 'S':
- self.status = int(data)
- self.valid |= STATUS_SET
- elif cmd == 'T':
- self.fix.track = float(data)
- self.valid |= TRACK_SET
- elif cmd == 'U':
- self.fix.climb = float(data)
- self.valid |= CLIMB_SET
- elif cmd == 'V':
- self.fix.speed = float(data)
- self.valid |= SPEED_SET
elif cmd == 'X':
self.online = float(data)
self.valid |= ONLINE_SET
diff --git a/gps_json.h b/gps_json.h
index a00a31b4..8202a7d1 100644
--- a/gps_json.h
+++ b/gps_json.h
@@ -8,7 +8,7 @@
#include "json.h"
#define GPS_JSON_COMMAND_MAX 80
-#define GPS_JSON_RESPONSE_MAX 1024
+#define GPS_JSON_RESPONSE_MAX 1536
#ifdef __cplusplus
extern "C" {
@@ -16,6 +16,7 @@ extern "C" {
char *json_stringify(/*@out@*/char *, size_t, /*@in@*/const char *);
void json_tpv_dump(const struct gps_data_t *, /*@out@*/char *, size_t);
void json_sky_dump(const struct gps_data_t *, /*@out@*/char *, size_t);
+void json_att_dump(const struct gps_data_t *, /*@out@*/char *, size_t);
void json_device_dump(const struct gps_device_t *, /*@out@*/char *, size_t);
void json_watch_dump(const struct policy_t *, /*@out@*/char *, size_t);
int json_watch_read(const char *, /*@out@*/struct policy_t *,
diff --git a/gpsctl.c b/gpsctl.c
index c4dda615..8646d723 100644
--- a/gpsctl.c
+++ b/gpsctl.c
@@ -58,7 +58,7 @@ static gps_mask_t get_packet(struct gps_device_t *session)
continue;
}
fieldmask = gpsd_poll(session);
- if ((fieldmask &~ ONLINE_SET)!=0)
+ if ((fieldmask &~ ONLINE_IS)!=0)
return fieldmask;
}
}
@@ -82,7 +82,7 @@ static int gps_query(struct gps_data_t *gpsdata, const char *fmt, ... )
}
gpsd_report(LOG_PROG, "gps_query(), wrote, %s\n", buf);
ret = gps_poll(gpsdata);
- if (ERROR_SET & gpsdata->set) {
+ if (ERROR_IS & gpsdata->set) {
gpsd_report(LOG_ERROR, "gps_query() error '%s'\n", gpsdata->error);
}
return ret;
@@ -199,7 +199,7 @@ int main(int argc, char **argv)
case 't': /* force the device type */
devtype = optarg;
break;
- case 'T': /* force the device type */
+ case 'T': /* set the timeout on packet recognition */
timeout = (unsigned)atoi(optarg);
break;
case 'D': /* set debugging level */
diff --git a/gpsd.c b/gpsd.c
index bf707e4d..c16a3b73 100644
--- a/gpsd.c
+++ b/gpsd.c
@@ -12,7 +12,7 @@
#include <unistd.h>
#endif /* S_SPLINT_S */
#ifdef HAVE_SYSLOG_H
- #include <syslog.h>
+#include <syslog.h>
#endif /* HAVE_SYSLOG_H */
#include <signal.h>
#include <errno.h>
@@ -20,33 +20,33 @@
#include <fcntl.h>
#include <string.h>
#ifndef S_SPLINT_S
- #ifdef HAVE_SYS_SOCKET_H
- #include <sys/socket.h>
- #else
- #define AF_UNSPEC 0
- #endif /* HAVE_SYS_SOCKET_H */
- #ifdef HAVE_SYS_UN_H
- #include <sys/un.h>
- #endif /* HAVE_SYS_UN_H */
- #ifdef HAVE_NETINET_IN_H
- #include <netinet/in.h>
- #endif /* HAVE_NETINET_IN_H */
- #ifdef HAVE_ARPA_INET_H
- #include <arpa/inet.h>
- #endif /* HAVE_ARPA_INET_H */
- #ifdef HAVE_NETDB_H
- #include <netdb.h>
- #endif /* HAVE_NETDB_H */
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#else
+#define AF_UNSPEC 0
+#endif /* HAVE_SYS_SOCKET_H */
+#ifdef HAVE_SYS_UN_H
+#include <sys/un.h>
+#endif /* HAVE_SYS_UN_H */
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif /* HAVE_NETINET_IN_H */
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif /* HAVE_ARPA_INET_H */
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif /* HAVE_NETDB_H */
#endif /* S_SPLINT_S */
#include <stdarg.h>
#include <setjmp.h>
#include <stdio.h>
#include <assert.h>
#ifdef HAVE_PWD_H
- #include <pwd.h>
+#include <pwd.h>
#endif /* HAVE_PWD_H */
#ifdef HAVE_GRP_H
- #include <grp.h>
+#include <grp.h>
#endif /* HAVE_GRP_H */
#include <stdbool.h>
#include <math.h>
@@ -86,7 +86,7 @@
* owning group for tty devices is. Used when we drop privileges.
*/
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
-#define PROTO_TTY "/dev/tty00" /* correct for *BSD */
+#define PROTO_TTY "/dev/tty00" /* correct for *BSD */
#else
#define PROTO_TTY "/dev/ttyS0" /* correct for Linux */
#endif
@@ -154,6 +154,7 @@ static bool listen_global = false;
static bool nowait = false;
static jmp_buf restartbuf;
+/* *INDENT-OFF* */
/*@ -initallelements -nullassign -nullderef @*/
struct gps_context_t context = {
.valid = 0,
@@ -178,13 +179,14 @@ struct gps_context_t context = {
#endif /* NTPSHM_ENABLE */
};
/*@ +initallelements +nullassign +nullderef @*/
+/* *INDENT-ON* */
static volatile sig_atomic_t signalled;
static void onsig(int sig)
{
/* just set a variable, and deal with it in the main loop */
- signalled = (sig_atomic_t)sig;
+ signalled = (sig_atomic_t) sig;
}
static int daemonize(void)
@@ -192,13 +194,13 @@ static int daemonize(void)
int fd;
pid_t pid;
- /*@ -type @*/ /* weirdly, splint 3.1.2 is confused by fork() */
+ /*@ -type @*//* weirdly, splint 3.1.2 is confused by fork() */
switch (pid = fork()) {
case -1:
return -1;
- case 0: /* child side */
+ case 0: /* child side */
break;
- default: /* parent side */
+ default: /* parent side */
exit(0);
}
/*@ +type @*/
@@ -224,7 +226,7 @@ static int daemonize(void)
static pthread_mutex_t report_mutex;
#endif /* PPS_ENABLE */
-void gpsd_report(int errlevel, const char *fmt, ... )
+void gpsd_report(int errlevel, const char *fmt, ...)
/* assemble command in printf(3) style, use stderr or syslog */
{
#ifndef SQUELCH_ENABLE
@@ -238,16 +240,19 @@ void gpsd_report(int errlevel, const char *fmt, ... )
/* +unrecog */
#endif /* PPS_ENABLE */
(void)strlcpy(buf, "gpsd: ", BUFSIZ);
- va_start(ap, fmt) ;
- (void)vsnprintf(buf + strlen(buf), sizeof(buf)-strlen(buf), fmt, ap);
+ va_start(ap, fmt);
+ (void)vsnprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), fmt,
+ ap);
va_end(ap);
buf2[0] = '\0';
for (sp = buf; *sp != '\0'; sp++)
- if (isprint(*sp) || (isspace(*sp) && (sp[1]=='\0' || sp[2]=='\0')))
- (void)snprintf(buf2+strlen(buf2), 2, "%c", *sp);
+ if (isprint(*sp)
+ || (isspace(*sp) && (sp[1] == '\0' || sp[2] == '\0')))
+ (void)snprintf(buf2 + strlen(buf2), 2, "%c", *sp);
else
- (void)snprintf(buf2+strlen(buf2), 6, "\\x%02x", (unsigned)*sp);
+ (void)snprintf(buf2 + strlen(buf2), 6, "\\x%02x",
+ (unsigned)*sp);
if (in_background)
syslog((errlevel == 0) ? LOG_ERR : LOG_NOTICE, "%s", buf2);
@@ -284,7 +289,7 @@ A device may be a local serial device for GPS input, or a URL of the form:\n\
in which case it specifies an input source for GPSD, DGPS or ntrip data.\n\
\n\
The following driver types are compiled into this gpsd instance:\n",
- DEFAULT_GPSD_PORT);
+ DEFAULT_GPSD_PORT);
for (dp = gpsd_drivers; *dp; dp++) {
(void)printf(" %s\n", (*dp)->type_name);
}
@@ -300,7 +305,7 @@ static int passivesock_af(int af, char *service, char *tcp_or_udp, int qlen)
* qlen = maximum wait-queue length for connections
*/
struct servent *pse;
- struct protoent *ppe ; /* splint has a bug here */
+ struct protoent *ppe; /* splint has a bug here */
sockaddr_t sat;
int sin_len = 0;
int s = -1, type, proto, one = 1;
@@ -308,27 +313,27 @@ static int passivesock_af(int af, char *service, char *tcp_or_udp, int qlen)
char *af_str = "";
if ((pse = getservbyname(service, tcp_or_udp)))
- port = ntohs((in_port_t)pse->s_port);
- else if ((port = (in_port_t)atoi(service)) == 0) {
+ port = ntohs((in_port_t) pse->s_port);
+ else if ((port = (in_port_t) atoi(service)) == 0) {
gpsd_report(LOG_ERROR, "can't get \"%s\" service entry.\n", service);
return -1;
}
ppe = getprotobyname(tcp_or_udp);
if (strcmp(tcp_or_udp, "udp") == 0) {
type = SOCK_DGRAM;
- /*@i@*/proto = (ppe) ? ppe->p_proto : IPPROTO_UDP;
+ /*@i@*/ proto = (ppe) ? ppe->p_proto : IPPROTO_UDP;
} else {
type = SOCK_STREAM;
- /*@i@*/proto = (ppe) ? ppe->p_proto : IPPROTO_TCP;
+ /*@i@*/ proto = (ppe) ? ppe->p_proto : IPPROTO_TCP;
}
/*@ -mustfreefresh +matchanyintegral @*/
- switch(af) {
+ switch (af) {
case AF_INET:
sin_len = sizeof(sat.sa_in);
- memset((char *) &sat.sa_in, 0, sin_len);
- sat.sa_in.sin_family = (sa_family_t)AF_INET;
+ memset((char *)&sat.sa_in, 0, sin_len);
+ sat.sa_in.sin_family = (sa_family_t) AF_INET;
if (listen_global)
sat.sa_in.sin_addr.s_addr = htonl(INADDR_ANY);
else
@@ -343,8 +348,8 @@ static int passivesock_af(int af, char *service, char *tcp_or_udp, int qlen)
case AF_INET6:
sin_len = sizeof(sat.sa_in6);
- memset ((char *) &sat.sa_in6, 0, sin_len);
- sat.sa_in6.sin6_family = (sa_family_t)AF_INET6;
+ memset((char *)&sat.sa_in6, 0, sin_len);
+ sat.sa_in6.sin6_family = (sa_family_t) AF_INET6;
if (listen_global) {
/* BAD: sat.sa_in6.sin6_addr = in6addr_any;
* the simple assignment will not work (except as an initializer)
@@ -359,13 +364,13 @@ static int passivesock_af(int af, char *service, char *tcp_or_udp, int qlen)
sat.sa_in6.sin6_port = htons(port);
/*
- * Traditionally BSD uses "communication domains", named by
- * constants starting with PF_ as the first argument for
- * select. In practice PF_INET has the same value as AF_INET
- * (on BSD and Linux, and probably everywhere else). POSIX
- * leaves much of this unspecified, but requires that AF_INET
- * be recognized. We follow tradition here.
- */
+ * Traditionally BSD uses "communication domains", named by
+ * constants starting with PF_ as the first argument for
+ * select. In practice PF_INET has the same value as AF_INET
+ * (on BSD and Linux, and probably everywhere else). POSIX
+ * leaves much of this unspecified, but requires that AF_INET
+ * be recognized. We follow tradition here.
+ */
af_str = "IPv6";
s = socket(PF_INET6, type, proto);
break;
@@ -380,16 +385,16 @@ static int passivesock_af(int af, char *service, char *tcp_or_udp, int qlen)
gpsd_report(LOG_ERROR, "can't create %s socket\n", af_str);
return -1;
}
- if (setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&one,
- (int)sizeof(one)) == -1) {
+ if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&one,
+ (int)sizeof(one)) == -1) {
gpsd_report(LOG_ERROR, "Error: SETSOCKOPT SO_REUSEADDR\n");
return -1;
}
if (bind(s, &sat.sa, sin_len) < 0) {
- gpsd_report(LOG_ERROR, "can't bind to %s port %s, %s\n", af_str,
- service, strerror(errno));
+ gpsd_report(LOG_ERROR, "can't bind to %s port %s, %s\n", af_str,
+ service, strerror(errno));
if (errno == EADDRINUSE) {
- gpsd_report(LOG_ERROR, "maybe gpsd is already running!\n");
+ gpsd_report(LOG_ERROR, "maybe gpsd is already running!\n");
}
return -1;
}
@@ -398,16 +403,19 @@ static int passivesock_af(int af, char *service, char *tcp_or_udp, int qlen)
return -1;
}
+ gpsd_report(LOG_SPIN, "passivesock_af() -> %d\n", s);
return s;
/*@ +mustfreefresh -matchanyintegral @*/
}
-static int passivesocks(char *service, char *tcp_or_udp, int qlen, /*@out@*/int socks[])
+/* *INDENT-OFF* */
+static int passivesocks(char *service, char *tcp_or_udp,
+ int qlen, /*@out@*/int socks[])
{
int numsocks = AFCOUNT;
int i;
- for (i=0;i<AFCOUNT;i++)
+ for (i = 0; i < AFCOUNT; i++)
socks[i] = -1;
if (AF_UNSPEC == af || (AF_INET == af))
@@ -416,40 +424,42 @@ static int passivesocks(char *service, char *tcp_or_udp, int qlen, /*@out@*/int
if (AF_UNSPEC == af || (AF_INET6 == af))
socks[1] = passivesock_af(AF_INET6, service, tcp_or_udp, qlen);
- for (i=0;i<AFCOUNT;i++)
- if(socks[i]<0)
+ for (i = 0; i < AFCOUNT; i++)
+ if (socks[i] < 0)
numsocks--;
/* Return the number of succesfully opened sockets
* The failed ones are identified by negative values */
return numsocks;
}
+/* *INDENT-ON* */
static int filesock(char *filename)
{
struct sockaddr_un addr;
int sock;
- /*@ -mayaliasunique @*/
+ /*@ -mayaliasunique -usedef @*/
if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
gpsd_report(LOG_ERROR, "Can't create device-control socket\n");
return -1;
}
- /*@i1@*/(void)strlcpy(addr.sun_path, filename, 104); /* from sys/un.h */
+ (void)strlcpy(addr.sun_path, filename, 104); /* from sys/un.h */
addr.sun_family = AF_UNIX;
- (void)bind(sock, (struct sockaddr *) &addr, (int)sizeof(addr));
+ (void)bind(sock, (struct sockaddr *)&addr, (int)sizeof(addr));
if (listen(sock, QLEN) == -1) {
gpsd_report(LOG_ERROR, "can't listen on local socket %s\n", filename);
return -1;
}
- /*@ +mayaliasunique @*/
+ /*@ +mayaliasunique +usedef @*/
return sock;
}
-struct subscriber_t {
+struct subscriber_t
+{
int fd; /* client file descriptor. -1 if unused */
double active; /* when subscriber last polled for data */
- struct policy_t policy; /* configurable bits */
+ struct policy_t policy; /* configurable bits */
};
/*
@@ -479,7 +489,7 @@ struct subscriber_t {
#define subscribed(sub, devp) (sub->policy.devpath[0]=='\0' || strcmp(sub->policy.devpath, devp->gpsdata.dev.path)==0)
struct gps_device_t devices[MAXDEVICES];
-struct subscriber_t subscribers[MAXSUBSCRIBERS]; /* indexed by client file descriptor */
+struct subscriber_t subscribers[MAXSUBSCRIBERS]; /* indexed by client file descriptor */
static void adjust_max_fd(int fd, bool on)
/* track the largest fd currently in use */
@@ -511,14 +521,14 @@ static void adjust_max_fd(int fd, bool on)
#define UNALLOCATED_FD -1
-static /*@null@*/ /*@observer@*/ struct subscriber_t* allocate_client(void)
+static /*@null@*//*@observer@ */ struct subscriber_t *allocate_client(void)
/* return the address of a subscriber structure allocated for a new session */
{
int si;
#if UNALLOCATED_FD == 0
#error client allocation code will fail horribly
-#endif
+#endif
for (si = 0; si < NITEMS(subscribers); si++) {
if (subscribers[si].fd == UNALLOCATED_FD) {
subscribers[si].fd = 0; /* mark subscriber as allocated */
@@ -536,9 +546,10 @@ static void detach_client(struct subscriber_t *sub)
return;
c_ip = netlib_sock2ip(sub->fd);
(void)shutdown(sub->fd, SHUT_RDWR);
+ gpsd_report(LOG_SPIN, "close(%d) in detach_client()\n", sub->fd);
(void)close(sub->fd);
gpsd_report(LOG_INF, "detaching %s (sub %d, fd %d) in detach_client\n",
- c_ip, sub_index(sub), sub->fd);
+ c_ip, sub_index(sub), sub->fd);
FD_CLR(sub->fd, &all_fds);
adjust_max_fd(sub->fd, false);
sub->active = 0;
@@ -552,7 +563,8 @@ static void detach_client(struct subscriber_t *sub)
/*@+mustfreeonly@*/
}
-static ssize_t throttled_write(struct subscriber_t *sub, char *buf, size_t len)
+static ssize_t throttled_write(struct subscriber_t *sub, char *buf,
+ size_t len)
/* write to client -- throttle if it's gone or we're close to buffer overrun */
{
ssize_t status;
@@ -561,32 +573,35 @@ static ssize_t throttled_write(struct subscriber_t *sub, char *buf, size_t len)
if (isprint(buf[0]))
gpsd_report(LOG_IO, "=> client(%d): %s", sub_index(sub), buf);
else {
- char *cp, buf2[MAX_PACKET_LENGTH*3];
+ char *cp, buf2[MAX_PACKET_LENGTH * 3];
buf2[0] = '\0';
for (cp = buf; cp < buf + len; cp++)
(void)snprintf(buf2 + strlen(buf2),
- sizeof(buf2)-strlen(buf2),
- "%02x", (unsigned int)(*cp & 0xff));
- gpsd_report(LOG_IO, "=> client(%d): =%s\r\n", sub_index(sub), buf2);
+ sizeof(buf2) - strlen(buf2),
+ "%02x", (unsigned int)(*cp & 0xff));
+ gpsd_report(LOG_IO, "=> client(%d): =%s\r\n", sub_index(sub),
+ buf2);
}
}
status = send(sub->fd, buf, len, 0);
- if (status == (ssize_t)len)
+ if (status == (ssize_t) len)
return status;
else if (status > -1) {
gpsd_report(LOG_INF, "short write disconnecting client(%d)\n",
- sub_index(sub));
+ sub_index(sub));
detach_client(sub);
return 0;
} else if (errno == EAGAIN || errno == EINTR)
- return 0; /* no data written, and errno says to retry */
- else if (errno == EBADF)
+ return 0; /* no data written, and errno says to retry */
+ else if (errno == EBADF)
gpsd_report(LOG_WARN, "client(%d) has vanished.\n", sub_index(sub));
- else if (errno == EWOULDBLOCK && timestamp() - sub->active > NOREAD_TIMEOUT)
+ else if (errno == EWOULDBLOCK
+ && timestamp() - sub->active > NOREAD_TIMEOUT)
gpsd_report(LOG_INF, "client(%d) timed out.\n", sub_index(sub));
else
- gpsd_report(LOG_INF, "client(%d) write: %s\n", sub_index(sub), strerror(errno));
+ gpsd_report(LOG_INF, "client(%d) write: %s\n", sub_index(sub),
+ strerror(errno));
detach_client(sub);
return status;
}
@@ -598,12 +613,12 @@ static void notify_watchers(struct gps_device_t *device, char *sentence, ...)
char buf[BUFSIZ];
struct subscriber_t *sub;
- va_start(ap, sentence) ;
+ va_start(ap, sentence);
(void)vsnprintf(buf, sizeof(buf), sentence, ap);
va_end(ap);
for (sub = subscribers; sub < subscribers + MAXSUBSCRIBERS; sub++)
- if (sub->active!=0 && subscribed(sub, device))
+ if (sub->active != 0 && subscribed(sub, device))
(void)throttled_write(sub, buf, strlen(buf));
}
@@ -614,22 +629,28 @@ static void deactivate_device(struct gps_device_t *device)
"{\"class\":\"DEVICE\",\"path\":\"%s\",\"activated\":0}\r\n",
device->gpsdata.dev.path);
if (device->gpsdata.gps_fd != -1) {
+ FD_CLR(device->gpsdata.gps_fd, &all_fds);
+ adjust_max_fd(device->gpsdata.gps_fd, false);
gpsd_deactivate(device);
device->gpsdata.gps_fd = -1; /* device is already disconnected */
}
}
+/* *INDENT-OFF* */
/*@ -globstate @*/
-/*@null@*/ /*@observer@*/static struct gps_device_t *find_device(char *device_name)
+/*@null@*//*@observer@*/ static struct gps_device_t *find_device(char
+ *device_name)
/* find the device block for an existing device name */
{
struct gps_device_t *devp;
for (devp = devices; devp < devices + MAXDEVICES; devp++)
- if (allocated_device(devp) && strcmp(devp->gpsdata.dev.path, device_name)==0)
+ if (allocated_device(devp)
+ && strcmp(devp->gpsdata.dev.path, device_name) == 0)
return devp;
return NULL;
}
+/* *INDENT-ON* */
/*@ -nullret @*/
/*@ -statictrans @*/
@@ -639,11 +660,13 @@ static bool open_device(char *device_name)
struct gps_device_t *devp;
for (devp = devices; devp < devices + MAXDEVICES; devp++)
- if (!allocated_device(devp) || (strcmp(devp->gpsdata.dev.path, device_name)==0 && !initialized_device(devp))) {
+ if (!allocated_device(devp)
+ || (strcmp(devp->gpsdata.dev.path, device_name) == 0
+ && !initialized_device(devp))) {
goto found;
}
return false;
-found:
+ found:
gpsd_init(devp, &context, device_name);
if (gpsd_activate(devp) < 0)
return false;
@@ -663,14 +686,12 @@ static bool add_device(char *device_name)
for (devp = devices; devp < devices + MAXDEVICES; devp++)
if (!allocated_device(devp)) {
gpsd_init(devp, &context, device_name);
- gpsd_report(LOG_INF,"stashing device %s at slot %d\n",
- device_name,
- (int)(devp - devices));
+ gpsd_report(LOG_INF, "stashing device %s at slot %d\n",
+ device_name, (int)(devp - devices));
devp->gpsdata.gps_fd = -1;
notify_watchers(devp,
"{\"class\":\"DEVICE\",\"path\":\"%s\",\"activated\":%ld}\r\n",
- devp->gpsdata.dev.path,
- timestamp());
+ devp->gpsdata.dev.path, timestamp());
return true;
}
return false;
@@ -687,18 +708,18 @@ static bool awaken(struct subscriber_t *user, struct gps_device_t *device)
/* open that device */
if (!initialized_device(device)) {
if (!open_device(device->gpsdata.dev.path)) {
- gpsd_report(LOG_PROG, "client(%d): open failed\n", sub_index(user));
+ gpsd_report(LOG_PROG, "client(%d): open failed\n",
+ sub_index(user));
free_device(device);
return false;
}
}
if (device->gpsdata.gps_fd != -1) {
- gpsd_report(LOG_PROG,"client(%d): device %d (fd=%d, path %s) already active.\n",
- sub_index(user),
- (int)(device - devices),
- device->gpsdata.gps_fd,
- device->gpsdata.dev.path);
+ gpsd_report(LOG_PROG,
+ "client(%d): device %d (fd=%d, path %s) already active.\n",
+ sub_index(user), (int)(device - devices),
+ device->gpsdata.gps_fd, device->gpsdata.dev.path);
return true;
} else {
if (gpsd_activate(device) < 0) {
@@ -706,7 +727,8 @@ static bool awaken(struct subscriber_t *user, struct gps_device_t *device)
sub_index(user));
return false;
} else {
- gpsd_report(LOG_RAW, "flagging descriptor %d in assign_channel()\n",
+ gpsd_report(LOG_RAW,
+ "flagging descriptor %d in assign_channel()\n",
device->gpsdata.gps_fd);
FD_SET(device->gpsdata.gps_fd, &all_fds);
adjust_max_fd(device->gpsdata.gps_fd, true);
@@ -715,17 +737,18 @@ static bool awaken(struct subscriber_t *user, struct gps_device_t *device)
}
}
-/*@ observer @*/static char *snarfline(char *p, /*@out@*/char **out)
+/*@ observer @*/ static char *snarfline(char *p, /*@out@*/ char **out)
/* copy the rest of the command line, before CR-LF */
{
char *q;
- static char stash[BUFSIZ];
+ static char stash[BUFSIZ];
/*@ -temptrans -mayaliasunique @*/
- for (q = p; isprint(*p) && !isspace(*p) && /*@i@*/(p-q < BUFSIZ-1); p++)
+ for (q = p; isprint(*p) && !isspace(*p) && /*@i@*/ (p - q < BUFSIZ - 1);
+ p++)
continue;
- (void)memcpy(stash, q, (size_t)(p-q));
- stash[p-q] = '\0';
+ (void)memcpy(stash, q, (size_t) (p - q));
+ stash[p - q] = '\0';
*out = stash;
return p;
/*@ +temptrans +mayaliasunique @*/
@@ -751,78 +774,83 @@ static bool privileged_user(struct gps_device_t *device)
static void handle_control(int sfd, char *buf)
/* handle privileged commands coming through the control socket */
{
- char *p, *stash, *eq;
- struct gps_device_t *devp;
+ char *p, *stash, *eq;
+ struct gps_device_t *devp;
/*@ -sefparams @*/
if (buf[0] == '-') {
- p = snarfline(buf+1, &stash);
+ p = snarfline(buf + 1, &stash);
gpsd_report(LOG_INF, "<= control(%d): removing %s\n", sfd, stash);
if ((devp = find_device(stash))) {
- if (devp->gpsdata.gps_fd > 0) {
- FD_CLR(devp->gpsdata.gps_fd, &all_fds);
- adjust_max_fd(devp->gpsdata.gps_fd, false);
- }
deactivate_device(devp);
free_device(devp);
ignore_return(write(sfd, "OK\n", 3));
} else
ignore_return(write(sfd, "ERROR\n", 6));
} else if (buf[0] == '+') {
- p = snarfline(buf+1, &stash);
+ p = snarfline(buf + 1, &stash);
if (find_device(stash)) {
- gpsd_report(LOG_INF,"<= control(%d): %s already active \n", sfd, stash);
+ gpsd_report(LOG_INF, "<= control(%d): %s already active \n", sfd,
+ stash);
ignore_return(write(sfd, "ERROR\n", 6));
} else {
- gpsd_report(LOG_INF,"<= control(%d): adding %s \n", sfd, stash);
+ gpsd_report(LOG_INF, "<= control(%d): adding %s \n", sfd, stash);
if (add_device(stash))
ignore_return(write(sfd, "OK\n", 3));
else
ignore_return(write(sfd, "ERROR\n", 6));
}
} else if (buf[0] == '!') {
- p = snarfline(buf+1, &stash);
+ p = snarfline(buf + 1, &stash);
eq = strchr(stash, '=');
if (eq == NULL) {
- gpsd_report(LOG_WARN,"<= control(%d): ill-formed command \n", sfd);
+ gpsd_report(LOG_WARN, "<= control(%d): ill-formed command \n",
+ sfd);
ignore_return(write(sfd, "ERROR\n", 6));
} else {
*eq++ = '\0';
if ((devp = find_device(stash))) {
- gpsd_report(LOG_INF,"<= control(%d): writing to %s \n", sfd, stash);
+ gpsd_report(LOG_INF, "<= control(%d): writing to %s \n", sfd,
+ stash);
ignore_return(write(devp->gpsdata.gps_fd, eq, strlen(eq)));
ignore_return(write(sfd, "OK\n", 3));
} else {
- gpsd_report(LOG_INF,"<= control(%d): %s not active \n", sfd, stash);
+ gpsd_report(LOG_INF, "<= control(%d): %s not active \n", sfd,
+ stash);
ignore_return(write(sfd, "ERROR\n", 6));
}
}
} else if (buf[0] == '&') {
- p = snarfline(buf+1, &stash);
+ p = snarfline(buf + 1, &stash);
eq = strchr(stash, '=');
if (eq == NULL) {
- gpsd_report(LOG_WARN,"<= control(%d): ill-formed command \n", sfd);
+ gpsd_report(LOG_WARN, "<= control(%d): ill-formed command \n",
+ sfd);
ignore_return(write(sfd, "ERROR\n", 6));
} else {
size_t len;
int st;
*eq++ = '\0';
- len = strlen(eq)+5;
+ len = strlen(eq) + 5;
if ((devp = find_device(stash)) != NULL) {
/* NOTE: this destroys the original buffer contents */
st = gpsd_hexpack(eq, eq, len);
if (st <= 0) {
- gpsd_report(LOG_INF,"<= control(%d): invalid hex string (error %d).\n", sfd, st);
+ gpsd_report(LOG_INF,
+ "<= control(%d): invalid hex string (error %d).\n",
+ sfd, st);
ignore_return(write(sfd, "ERROR\n", 6));
- }
- else
- {
- gpsd_report(LOG_INF,"<= control(%d): writing %d bytes fromhex(%s) to %s\n", sfd, st, eq, stash);
- ignore_return(write(devp->gpsdata.gps_fd, eq, (size_t)st));
+ } else {
+ gpsd_report(LOG_INF,
+ "<= control(%d): writing %d bytes fromhex(%s) to %s\n",
+ sfd, st, eq, stash);
+ ignore_return(write
+ (devp->gpsdata.gps_fd, eq, (size_t) st));
ignore_return(write(sfd, "OK\n", 3));
}
} else {
- gpsd_report(LOG_INF,"<= control(%d): %s not active\n", sfd, stash);
+ gpsd_report(LOG_INF, "<= control(%d): %s not active\n", sfd,
+ stash);
ignore_return(write(sfd, "ERROR\n", 6));
}
}
@@ -831,7 +859,7 @@ static void handle_control(int sfd, char *buf)
}
#ifdef ALLOW_RECONFIGURE
-static void set_serial(struct gps_device_t *device,
+static void set_serial(struct gps_device_t *device,
speed_t speed, char *modestring)
/* set serial parameters for a device from a speed and modestring */
{
@@ -839,27 +867,26 @@ static void set_serial(struct gps_device_t *device,
char parity = device->gpsdata.dev.parity;
int wordsize = 8;
- if (strchr("78", *modestring)!= NULL) {
+ if (strchr("78", *modestring) != NULL) {
while (isspace(*modestring))
modestring++;
wordsize = (int)(*modestring++ - '0');
- if (strchr("NOE", *modestring)!= NULL) {
+ if (strchr("NOE", *modestring) != NULL) {
parity = *modestring++;
while (isspace(*modestring))
modestring++;
- if (strchr("12", *modestring)!=NULL)
+ if (strchr("12", *modestring) != NULL)
stopbits = (unsigned int)(*modestring - '0');
}
}
gpsd_report(LOG_PROG, "set_serial(,%d,%s) %c%d\n", speed, modestring,
- parity, stopbits);
+ parity, stopbits);
/* no support for other word sizes yet */
- if (wordsize == (int)(9 - stopbits) && device->device_type->speed_switcher!=NULL)
- if (device->device_type->speed_switcher(device,
- speed,
- parity,
- (int)stopbits)) {
+ /* *INDENT-OFF* */
+ if (wordsize == (int)(9 - stopbits)
+ && device->device_type->speed_switcher != NULL) {
+ if (device->device_type->speed_switcher(device, speed, parity, (int)stopbits)) {
/*
* Deep black magic is required here. We have to
* allow the control string time to register at the
@@ -868,9 +895,9 @@ static void set_serial(struct gps_device_t *device,
*
* This definitely fails below 40 milliseconds on a
* BU-303b. 50ms is also verified by Chris Kuethe on
- * Pharos iGPS360 + GSW 2.3.1ES + prolific
- * Rayming TN-200 + GSW 2.3.1 + ftdi
- * Rayming TN-200 + GSW 2.3.2 + ftdi
+ * Pharos iGPS360 + GSW 2.3.1ES + prolific
+ * Rayming TN-200 + GSW 2.3.1 + ftdi
+ * Rayming TN-200 + GSW 2.3.2 + ftdi
* so it looks pretty solid.
*
* The minimum delay time is probably constant
@@ -880,28 +907,31 @@ static void set_serial(struct gps_device_t *device,
(void)usleep(50000);
gpsd_set_speed(device, speed, parity, stopbits);
}
+ }
+ /* *INDENT-ON* */
}
#endif /* ALLOW_RECONFIGURE */
static void json_devicelist_dump(char *reply, size_t replylen)
{
struct gps_device_t *devp;
- (void)strlcpy(reply,
- "{\"class\":\"DEVICES\",\"devices\":[", replylen);
+ (void)strlcpy(reply, "{\"class\":\"DEVICES\",\"devices\":[", replylen);
for (devp = devices; devp < devices + MAXDEVICES; devp++)
- if (allocated_device(devp) && strlen(reply)+strlen(devp->gpsdata.dev.path)+3 < replylen-1) {
+ if (allocated_device(devp)
+ && strlen(reply) + strlen(devp->gpsdata.dev.path) + 3 <
+ replylen - 1) {
char *cp;
json_device_dump(devp,
- reply+strlen(reply), replylen-strlen(reply));
+ reply + strlen(reply), replylen - strlen(reply));
cp = reply + strlen(reply);
*--cp = '\0';
*--cp = '\0';
(void)strlcat(reply, ",", replylen);
}
- if (reply[strlen(reply)-1] == ',')
- reply[strlen(reply)-1] = '\0';
- (void)strlcat(reply, "]}\r\n", replylen);
+ if (reply[strlen(reply) - 1] == ',')
+ reply[strlen(reply) - 1] = '\0';
+ (void)strlcat(reply, "]}\r\n", replylen);
}
static void rstrip(char *str)
@@ -909,14 +939,15 @@ static void rstrip(char *str)
{
char *strend;
strend = str + strlen(str) - 1;
- while (isspace(*strend))
+ while (isspace(*strend)) {
+ *strend = '\0';
--strend;
- strend[1] = '\0';
+ }
}
-static void handle_request(struct subscriber_t *sub,
- const char *buf, const char **after,
- char *reply, size_t replylen)
+static void handle_request(struct subscriber_t *sub,
+ const char *buf, const char **after,
+ char *reply, size_t replylen)
{
struct gps_device_t *devp;
const char *end = NULL;
@@ -936,12 +967,13 @@ static void handle_request(struct subscriber_t *sub,
if (strncmp(buf, "DEVICES;", 8) == 0) {
buf += 8;
json_devicelist_dump(reply, replylen);
- } else if (strncmp(buf, "WATCH", 5) == 0 && (buf[5] == ';' || buf[5] == '=')) {
+ } else if (strncmp(buf, "WATCH", 5) == 0
+ && (buf[5] == ';' || buf[5] == '=')) {
buf += 5;
if (*buf == ';') {
++buf;
} else {
- int status = json_watch_read(buf+1, &sub->policy, &end);
+ int status = json_watch_read(buf + 1, &sub->policy, &end);
if (end == NULL)
buf += strlen(buf);
else {
@@ -957,30 +989,32 @@ static void handle_request(struct subscriber_t *sub,
} else if (sub->policy.watcher) {
if (sub->policy.devpath[0] == '\0') {
/* awaken all devices */
- for(devp = devices; devp < devices + MAXDEVICES; devp++)
+ for (devp = devices; devp < devices + MAXDEVICES; devp++)
if (allocated_device(devp))
(void)awaken(sub, devp);
} else {
devp = find_device(sub->policy.devpath);
if (devp == NULL) {
(void)snprintf(reply, replylen,
- "{\"class\":\"ERROR\",\"message\":\"Do nuch device as %s\"}\r\n", sub->policy.devpath);
- gpsd_report(LOG_ERROR, "ERROR response: %s", reply);
+ "{\"class\":\"ERROR\",\"message\":\"Do nuch device as %s\"}\r\n",
+ sub->policy.devpath);
+ gpsd_report(LOG_ERROR, "ERROR response: %s", reply);
goto bailout;
} else if (!awaken(sub, devp))
(void)snprintf(reply, replylen,
- "{\"class\":\"ERROR\",\"message\":\"Can't assign %s\"}\r\n", sub->policy.devpath);
- gpsd_report(LOG_ERROR, "ERROR response: %s", reply);
- goto bailout;
- }
+ "{\"class\":\"ERROR\",\"message\":\"Can't assign %s\"}\r\n",
+ sub->policy.devpath);
+ gpsd_report(LOG_ERROR, "ERROR response: %s", reply);
+ goto bailout;
}
+ }
}
/* display a device list and the user's policy */
json_devicelist_dump(reply + strlen(reply), replylen - strlen(reply));
- json_watch_dump(&sub->policy,
- reply + strlen(reply),
- replylen - strlen(reply));
- } else if (strncmp(buf, "DEVICE", 6) == 0 && (buf[6] == ';' || buf[6] == '=')) {
+ json_watch_dump(&sub->policy,
+ reply + strlen(reply), replylen - strlen(reply));
+ } else if (strncmp(buf, "DEVICE", 6) == 0
+ && (buf[6] == ';' || buf[6] == '=')) {
struct devconfig_t devconf;
struct gps_device_t *device;
buf += 6;
@@ -990,7 +1024,7 @@ static void handle_request(struct subscriber_t *sub,
} else {
#ifdef ALLOW_RECONFIGURE
/* first, select a device to operate on */
- int status = json_device_read(buf+1, &devconf, &end);
+ int status = json_device_read(buf + 1, &devconf, &end);
if (end == NULL)
buf += strlen(buf);
else {
@@ -1001,19 +1035,19 @@ static void handle_request(struct subscriber_t *sub,
device = NULL;
/*@-branchstate@*/
if (status != 0) {
- (void)snprintf(reply, replylen,
+ (void)snprintf(reply, replylen,
"{\"class\":\"ERROR\",\"message\":\"Invalid DEVICE: %s\"}\r\n",
json_error_string(status));
- gpsd_report(LOG_ERROR, "ERROR response: %s", reply);
+ gpsd_report(LOG_ERROR, "ERROR response: %s", reply);
goto bailout;
} else {
- if (devconf.path[0]!='\0') {
+ if (devconf.path[0] != '\0') {
/* user specified a path, try to assign it */
if (!awaken(sub, find_device(devconf.path))) {
- (void)snprintf(reply, replylen,
+ (void)snprintf(reply, replylen,
"{\"class\":\"ERROR\",\"message\":\"Can't open %s.\"}\r\n",
devconf.path);
- gpsd_report(LOG_ERROR, "ERROR response: %s", reply);
+ gpsd_report(LOG_ERROR, "ERROR response: %s", reply);
goto bailout;
}
} else {
@@ -1025,62 +1059,69 @@ static void handle_request(struct subscriber_t *sub,
devcount++;
}
if (devcount == 0) {
- (void)strlcat(reply,
- "{\"class\":\"ERROR\",\"message\":\"Can't perform DEVICE configuration, no devices attached.\"}\r\n",
- replylen);
- gpsd_report(LOG_ERROR, "ERROR response: %s", reply);
+ (void)strlcat(reply,
+ "{\"class\":\"ERROR\",\"message\":\"Can't perform DEVICE configuration, no devices attached.\"}\r\n",
+ replylen);
+ gpsd_report(LOG_ERROR, "ERROR response: %s", reply);
goto bailout;
} else if (devcount > 1) {
- (void)snprintf(reply+strlen(reply), replylen-strlen(reply),
- "{\"class\":\"ERROR\",\"message\":\"No path specified in DEVICE, but multiple devices are attached.\"}\r\n");
- gpsd_report(LOG_ERROR, "ERROR response: %s", reply);
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "{\"class\":\"ERROR\",\"message\":\"No path specified in DEVICE, but multiple devices are attached.\"}\r\n");
+ gpsd_report(LOG_ERROR, "ERROR response: %s", reply);
goto bailout;
}
/* we should have exactly one device now */
}
if (device == NULL)
- (void)snprintf(reply+strlen(reply), replylen-strlen(reply),
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
"{\"class\":\"ERROR\",\"message\":\"Channel has no device (possible internal error).\"}\r\n");
else if (!privileged_user(device))
- (void)snprintf(reply+strlen(reply), replylen-strlen(reply),
- "{\"class\":\"ERROR\",\"message\":\"Multiple subscribers, cannot change control bits on %s.\"}\r\n", device->gpsdata.dev.path);
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "{\"class\":\"ERROR\",\"message\":\"Multiple subscribers, cannot change control bits on %s.\"}\r\n",
+ device->gpsdata.dev.path);
else if (device->device_type == NULL)
- (void)snprintf(reply+strlen(reply), replylen-strlen(reply),
- "{\"class\":\"ERROR\",\"message\":\"Type of %s is unknown.\"}\r\n", device->gpsdata.dev.path);
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "{\"class\":\"ERROR\",\"message\":\"Type of %s is unknown.\"}\r\n",
+ device->gpsdata.dev.path);
else {
char serialmode[3];
const struct gps_type_t *dt = device->device_type;
/* interpret defaults */
if (devconf.baudrate == DEVDEFAULT_BPS)
- devconf.baudrate = (uint)gpsd_get_speed(&device->ttyset);
+ devconf.baudrate =
+ (uint) gpsd_get_speed(&device->ttyset);
if (devconf.parity == DEVDEFAULT_PARITY)
- devconf.stopbits=device->gpsdata.dev.stopbits;
+ devconf.stopbits = device->gpsdata.dev.stopbits;
if (devconf.stopbits == DEVDEFAULT_STOPBITS)
- devconf.stopbits=device->gpsdata.dev.stopbits;
+ devconf.stopbits = device->gpsdata.dev.stopbits;
if (isnan(devconf.cycle))
- devconf.cycle=device->gpsdata.dev.cycle;
+ devconf.cycle = device->gpsdata.dev.cycle;
/* now that channel is selected, apply changes */
if (devconf.driver_mode != device->gpsdata.dev.driver_mode
- && devconf.driver_mode != DEVDEFAULT_NATIVE
- && dt->mode_switcher != NULL)
+ && devconf.driver_mode != DEVDEFAULT_NATIVE
+ && dt->mode_switcher != NULL)
dt->mode_switcher(device, devconf.driver_mode);
-
- serialmode[0] = devconf.parity;
+
+ serialmode[0] = devconf.parity;
serialmode[1] = '0' + devconf.stopbits;
serialmode[2] = '\0';
- set_serial(device,
- (speed_t)devconf.baudrate, serialmode);
- if (dt->rate_switcher != NULL
- && isnan(devconf.cycle)==0
+ set_serial(device,
+ (speed_t) devconf.baudrate, serialmode);
+ if (dt->rate_switcher != NULL
+ && isnan(devconf.cycle) == 0
&& devconf.cycle >= dt->min_cycle)
- if (dt->rate_switcher(device, devconf.cycle))
- device->gpsdata.dev.cycle = devconf.cycle;
+ if (dt->rate_switcher(device, devconf.cycle))
+ device->gpsdata.dev.cycle = devconf.cycle;
}
}
/*@+branchstate@*/
#else /* ALLOW_RECONFIGURE */
- (void)snprintf(reply+strlen(reply), replylen-strlen(reply),
+ (void)snprintf(reply + strlen(reply), replylen - strlen(reply),
"{\"class\":\"ERROR\",\"message\":\"Device configuration support not compiled.\"}\r\n");
#endif /* ALLOW_RECONFIGURE */
}
@@ -1088,10 +1129,11 @@ static void handle_request(struct subscriber_t *sub,
for (devp = devices; devp < devices + MAXDEVICES; devp++)
if (!allocated_device(devp))
continue;
- else if (devconf.path[0] != '\0' && devp!=NULL && strcmp(devp->gpsdata.dev.path, devconf.path)!=0)
+ else if (devconf.path[0] != '\0' && devp != NULL
+ && strcmp(devp->gpsdata.dev.path, devconf.path) != 0)
continue;
else {
- json_device_dump(devp,
+ json_device_dump(devp,
reply + strlen(reply),
replylen - strlen(reply));
}
@@ -1100,15 +1142,15 @@ static void handle_request(struct subscriber_t *sub,
buf += 5;
for (devp = devices; devp < devices + MAXDEVICES; devp++)
if (allocated_device(devp) && subscribed(sub, devp))
- if ((devp->observed & GPS_TYPEMASK)!=0)
+ if ((devp->observed & GPS_TYPEMASK) != 0)
active++;
(void)snprintf(reply, replylen,
"{\"class\":\"POLL\",\"timestamp\":%.3f,\"active\":%d,\"fixes\":[",
timestamp(), active);
for (devp = devices; devp < devices + MAXDEVICES; devp++) {
if (allocated_device(devp) && subscribed(sub, devp)) {
- if ((devp->observed & GPS_TYPEMASK)!=0) {
- json_tpv_dump(&devp->gpsdata,
+ if ((devp->observed & GPS_TYPEMASK) != 0) {
+ json_tpv_dump(&devp->gpsdata,
reply + strlen(reply),
replylen - strlen(reply));
rstrip(reply);
@@ -1116,13 +1158,13 @@ static void handle_request(struct subscriber_t *sub,
}
}
}
- if (reply[strlen(reply)-1] == ',')
- reply[strlen(reply)-1] = '\0'; /* trim trailing comma */
+ if (reply[strlen(reply) - 1] == ',')
+ reply[strlen(reply) - 1] = '\0'; /* trim trailing comma */
(void)strlcat(reply, "],\"skyviews\":[", replylen);
for (devp = devices; devp < devices + MAXDEVICES; devp++) {
if (allocated_device(devp) && subscribed(sub, devp)) {
- if ((devp->observed & GPS_TYPEMASK)!=0) {
- json_sky_dump(&devp->gpsdata,
+ if ((devp->observed & GPS_TYPEMASK) != 0) {
+ json_sky_dump(&devp->gpsdata,
reply + strlen(reply),
replylen - strlen(reply));
rstrip(reply);
@@ -1130,8 +1172,8 @@ static void handle_request(struct subscriber_t *sub,
}
}
}
- if (reply[strlen(reply)-1] == ',')
- reply[strlen(reply)-1] = '\0'; /* trim trailing comma */
+ if (reply[strlen(reply) - 1] == ',')
+ reply[strlen(reply) - 1] = '\0'; /* trim trailing comma */
(void)strlcat(reply, "]}]}\r\n", replylen);
} else if (strncmp(buf, "VERSION;", 8) == 0) {
buf += 8;
@@ -1141,13 +1183,13 @@ static void handle_request(struct subscriber_t *sub,
errend = buf + strlen(buf) - 1;
while (isspace(*errend) && errend > buf)
--errend;
- (void)snprintf(reply, replylen,
+ (void)snprintf(reply, replylen,
"{\"class\":\"ERROR\",\"message\":\"Unrecognized request '%.*s'\"}\r\n",
- (int)(errend-buf), buf);
+ (int)(errend - buf), buf);
gpsd_report(LOG_ERROR, "ERROR response: %s", reply);
buf += strlen(buf);
}
- bailout:
+ bailout:
*after = buf;
/*@+nullderef +nullpass@*/
/*@+compdef@*/
@@ -1155,17 +1197,18 @@ static void handle_request(struct subscriber_t *sub,
static int handle_gpsd_request(struct subscriber_t *sub, const char *buf)
{
- char reply[GPS_JSON_RESPONSE_MAX+1];
+ char reply[GPS_JSON_RESPONSE_MAX + 1];
reply[0] = '\0';
if (buf[0] == '?') {
const char *end;
- for (end = ++buf; *buf!='\0'; buf = end)
+ for (end = ++buf; *buf != '\0'; buf = end)
if (isspace(*buf))
end = buf + 1;
else
- handle_request(sub, buf, &end,
- reply+strlen(reply),sizeof(reply)-strlen(reply));
+ handle_request(sub, buf, &end,
+ reply + strlen(reply),
+ sizeof(reply) - strlen(reply));
}
return (int)throttled_write(sub, reply, strlen(reply));
}
@@ -1199,7 +1242,7 @@ int main(int argc, char *argv[])
while ((option = getopt(argc, argv, "F:D:S:bGhlNnP:V")) != -1) {
switch (option) {
case 'D':
- debuglevel = (int) strtol(optarg, 0, 0);
+ debuglevel = (int)strtol(optarg, 0, 0);
gpsd_hexdump_level = debuglevel;
#ifdef CLIENTDEBUG_ENABLE
gps_enable_debug(debuglevel, stderr);
@@ -1248,7 +1291,8 @@ int main(int argc, char *argv[])
case 'V':
(void)printf("gpsd: %s (revision %s)\n", VERSION, REVISION);
exit(0);
- case 'h': case '?':
+ case 'h':
+ case '?':
default:
usage();
exit(0);
@@ -1262,7 +1306,8 @@ int main(int argc, char *argv[])
#endif
if (!control_socket && optind >= argc) {
- gpsd_report(LOG_ERROR, "can't run with neither control socket nor devices\n");
+ gpsd_report(LOG_ERROR,
+ "can't run with neither control socket nor devices\n");
exit(1);
}
@@ -1274,12 +1319,17 @@ int main(int argc, char *argv[])
if (control_socket) {
(void)unlink(control_socket);
if ((csock = filesock(control_socket)) == -1) {
- gpsd_report(LOG_ERROR,"control socket create failed, netlib error %d\n",csock);
+ gpsd_report(LOG_ERROR,
+ "control socket create failed, netlib error %d\n",
+ csock);
exit(2);
- }
+ } else
+ gpsd_report(LOG_SPIN, "control socket %s is fd %d\n",
+ control_socket, csock);
FD_SET(csock, &all_fds);
adjust_max_fd(csock, true);
- gpsd_report(LOG_PROG, "control socket opened at %s\n", control_socket);
+ gpsd_report(LOG_PROG, "control socket opened at %s\n",
+ control_socket);
}
if (go_background)
@@ -1300,10 +1350,13 @@ int main(int argc, char *argv[])
gpsd_report(LOG_INF, "launching (Version %s)\n", VERSION);
/*@ -observertrans @*/
if (!gpsd_service)
- gpsd_service = getservbyname("gpsd", "tcp") ? "gpsd" : DEFAULT_GPSD_PORT;
+ gpsd_service =
+ getservbyname("gpsd", "tcp") ? "gpsd" : DEFAULT_GPSD_PORT;
/*@ +observertrans @*/
if (passivesocks(gpsd_service, "tcp", QLEN, msocks) < 1) {
- gpsd_report(LOG_ERR,"command sockets creation failed, netlib errors %d, %d\n", msocks[0], msocks[1]);
+ gpsd_report(LOG_ERR,
+ "command sockets creation failed, netlib errors %d, %d\n",
+ msocks[0], msocks[1]);
exit(2);
}
gpsd_report(LOG_INF, "listening on port %s\n", gpsd_service);
@@ -1313,8 +1366,8 @@ int main(int argc, char *argv[])
errno = 0;
// nice() can ONLY succeed when run as root!
// do not even bother as non-root
- if (nice(NICEVAL) == -1 && errno != 0 )
- gpsd_report (2, "NTPD Priority setting failed.\n");
+ if (nice(NICEVAL) == -1 && errno != 0)
+ gpsd_report(2, "NTPD Priority setting failed.\n");
}
(void)ntpshm_init(&context, nowait);
#endif /* NTPSHM_ENABLE */
@@ -1323,9 +1376,10 @@ int main(int argc, char *argv[])
/* we need to connect to dbus as root */
if (initialize_dbus_connection()) {
/* the connection could not be started */
- gpsd_report (LOG_ERROR, "unable to connect to the DBUS system bus\n");
+ gpsd_report(LOG_ERROR, "unable to connect to the DBUS system bus\n");
} else
- gpsd_report (LOG_PROG, "successfully connected to the DBUS system bus\n");
+ gpsd_report(LOG_PROG,
+ "successfully connected to the DBUS system bus\n");
#endif /* DBUS_ENABLE */
if (getuid() == 0 && go_background) {
@@ -1335,7 +1389,7 @@ int main(int argc, char *argv[])
/* make default devices accessible even after we drop privileges */
for (i = optind; i < argc; i++)
if (stat(argv[i], &stb) == 0)
- (void)chmod(argv[i], stb.st_mode|S_IRGRP|S_IWGRP);
+ (void)chmod(argv[i], stb.st_mode | S_IRGRP | S_IWGRP);
/*
* Drop privileges. Up to now we've been running as root. Instead,
* set the user ID to 'nobody' (or whatever the --enable-gpsd-user
@@ -1345,16 +1399,18 @@ int main(int argc, char *argv[])
* permissions set.
*/
/*@-type@*/
- if ((optind<argc&&stat(argv[optind], &stb)==0)||stat(PROTO_TTY,&stb)==0) {
+ if ((optind < argc && stat(argv[optind], &stb) == 0)
+ || stat(PROTO_TTY, &stb) == 0) {
gpsd_report(LOG_PROG, "changing to group %d\n", stb.st_gid);
if (setgid(stb.st_gid) != 0)
- gpsd_report(LOG_ERROR, "setgid() failed, errno %s\n", strerror(errno));
+ gpsd_report(LOG_ERROR, "setgid() failed, errno %s\n",
+ strerror(errno));
}
#ifdef GPSD_GROUP
else {
- struct group *grp = getgrnam(GPSD_GROUP);
- if (grp)
- (void)setgid(grp->gr_gid);
+ struct group *grp = getgrnam(GPSD_GROUP);
+ if (grp)
+ (void)setgid(grp->gr_gid);
}
#endif
pw = getpwnam(GPSD_USER);
@@ -1366,7 +1422,7 @@ int main(int argc, char *argv[])
gpsd_report(LOG_INF, "running with effective user ID %d\n", geteuid());
for (i = 0; i < NITEMS(subscribers); i++)
- subscribers[i].fd = UNALLOCATED_FD;
+ subscribers[i].fd = UNALLOCATED_FD;
/* daemon got termination or interrupt signal */
if ((st = setjmp(restartbuf)) > 0) {
@@ -1386,7 +1442,7 @@ int main(int argc, char *argv[])
(void)signal(SIGQUIT, onsig);
(void)signal(SIGPIPE, SIG_IGN);
- for(i=0; i<AFCOUNT; i++)
+ for (i = 0; i < AFCOUNT; i++)
if (msocks[i] >= 0) {
FD_SET(msocks[i], &all_fds);
adjust_max_fd(msocks[i], true);
@@ -1399,14 +1455,16 @@ int main(int argc, char *argv[])
for (i = optind; i < argc; i++) {
if (!add_device(argv[i])) {
- gpsd_report(LOG_ERROR, "GPS device %s nonexistent or can't be read\n", argv[i]);
+ gpsd_report(LOG_ERROR,
+ "GPS device %s nonexistent or can't be read\n",
+ argv[i]);
}
}
while (0 == signalled) {
(void)memcpy((char *)&rfds, (char *)&all_fds, sizeof(rfds));
- gpsd_report(LOG_RAW+2, "select waits\n");
+ gpsd_report(LOG_RAW + 2, "select waits\n");
/*
* Poll for user commands or GPS data. The timeout doesn't
* actually matter here since select returns whenever one of
@@ -1416,8 +1474,9 @@ int main(int argc, char *argv[])
* low-clock-rate SBCs and the like).
*/
/*@ -usedef @*/
- tv.tv_sec = 1; tv.tv_usec = 0;
- if (select(maxfd+1, &rfds, NULL, NULL, &tv) == -1) {
+ tv.tv_sec = 1;
+ tv.tv_usec = 0;
+ if (select(maxfd + 1, &rfds, NULL, NULL, &tv) == -1) {
if (errno == EINTR)
continue;
gpsd_report(LOG_ERROR, "select: %s\n", strerror(errno));
@@ -1425,38 +1484,39 @@ int main(int argc, char *argv[])
}
/*@ +usedef @*/
-#ifdef __UNUSED__
- {
+ if (debuglevel >= LOG_SPIN) {
char dbuf[BUFSIZ];
dbuf[0] = '\0';
- for (sub = subscribers; sub < subscribers + MAXSUBSCRIBERS; sub++)
- if (FD_ISSET(sub->fd, &all_fds))
+ for (i = 0; i < FD_SETSIZE; i++)
+ if (FD_ISSET(i, &all_fds))
(void)snprintf(dbuf + strlen(dbuf),
- sizeof(dbuf)-strlen(dbuf),
- " %d", sub->fd);
- strlcat(dbuf, "} -> {", BUFSIZ);
- for (sub = subscribers; sub < subscribers + MAXSUBSCRIBERS; sub++)
- if (FD_ISSET(sub->fd, &rfds))
+ sizeof(dbuf) - strlen(dbuf), "%d ", i);
+ if (strlen(dbuf) > 0)
+ dbuf[strlen(dbuf) - 1] = '\0';
+ (void)strlcat(dbuf, "} -> {", BUFSIZ);
+ for (i = 0; i < FD_SETSIZE; i++)
+ if (FD_ISSET(i, &rfds))
(void)snprintf(dbuf + strlen(dbuf),
- sizeof(dbuf)-strlen(dbuf),
- " %d", sub->fd);
- gpsd_report(LOG_RAW, "Polling descriptor set: {%s}\n", dbuf);
+ sizeof(dbuf) - strlen(dbuf), " %d ", i);
+ gpsd_report(LOG_SPIN, "select() {%s} at %f\n", dbuf, timestamp());
}
-#endif /* UNUSED */
/* always be open to new client connections */
- for(i=0; i<AFCOUNT; i++) {
+ for (i = 0; i < AFCOUNT; i++) {
if (msocks[i] >= 0 && FD_ISSET(msocks[i], &rfds)) {
- socklen_t alen = (socklen_t)sizeof(fsin);
+ socklen_t alen = (socklen_t) sizeof(fsin);
char *c_ip;
- /*@i@*/int ssock = accept(msocks[i], (struct sockaddr *)&fsin, &alen);
+ /*@+matchanyintegral@*/
+ int ssock =
+ accept(msocks[i], (struct sockaddr *)&fsin, &alen);
+ /*@+matchanyintegral@*/
if (ssock == -1)
gpsd_report(LOG_ERROR, "accept: %s\n", strerror(errno));
else {
struct subscriber_t *client = NULL;
int opts = fcntl(ssock, F_GETFL);
- static struct linger linger = {1, RELEASE_TIMEOUT};
+ static struct linger linger = { 1, RELEASE_TIMEOUT };
if (opts >= 0)
(void)fcntl(ssock, F_SETFL, opts | O_NONBLOCK);
@@ -1465,11 +1525,15 @@ int main(int argc, char *argv[])
client = allocate_client();
if (client == NULL) {
gpsd_report(LOG_ERROR, "Client %s connect on fd %d -"
- "no subscriber slots available\n", c_ip, ssock);
+ "no subscriber slots available\n", c_ip,
+ ssock);
(void)close(ssock);
- } else if (setsockopt(ssock, SOL_SOCKET,SO_LINGER,(char *)&linger,
- (int)sizeof(struct linger)) == -1) {
- gpsd_report(LOG_ERROR, "Error: SETSOCKOPT SO_LINGER\n");
+ } else
+ if (setsockopt
+ (ssock, SOL_SOCKET, SO_LINGER, (char *)&linger,
+ (int)sizeof(struct linger)) == -1) {
+ gpsd_report(LOG_ERROR,
+ "Error: SETSOCKOPT SO_LINGER\n");
(void)close(ssock);
} else {
char announce[GPS_JSON_RESPONSE_MAX];
@@ -1477,10 +1541,12 @@ int main(int argc, char *argv[])
adjust_max_fd(ssock, true);
client->fd = ssock;
client->active = timestamp();
- gpsd_report(LOG_INF, "client %s (%d) connect on fd %d\n",
- c_ip, sub_index(client), ssock);
+ gpsd_report(LOG_SPIN,
+ "client %s (%d) connect on fd %d\n", c_ip,
+ sub_index(client), ssock);
json_version_dump(announce, sizeof(announce));
- (void)throttled_write(client, announce, strlen(announce));
+ (void)throttled_write(client, announce,
+ strlen(announce));
}
}
FD_CLR(msocks[i], &rfds);
@@ -1489,13 +1555,16 @@ int main(int argc, char *argv[])
/* also be open to new control-socket connections */
if (csock > -1 && FD_ISSET(csock, &rfds)) {
- socklen_t alen = (socklen_t)sizeof(fsin);
- /*@i1@*/int ssock = accept(csock, (struct sockaddr *) &fsin, &alen);
+ socklen_t alen = (socklen_t) sizeof(fsin);
+ /*@+matchanyintegral@*/
+ int ssock = accept(csock, (struct sockaddr *)&fsin, &alen);
+ /*@-matchanyintegral@*/
if (ssock == -1)
gpsd_report(LOG_ERROR, "accept: %s\n", strerror(errno));
else {
- gpsd_report(LOG_INF, "control socket connect on fd %d\n", ssock);
+ gpsd_report(LOG_INF, "control socket connect on fd %d\n",
+ ssock);
FD_SET(ssock, &all_fds);
FD_SET(ssock, &control_fds);
adjust_max_fd(ssock, true);
@@ -1516,10 +1585,11 @@ int main(int argc, char *argv[])
if (FD_ISSET(cfd, &control_fds)) {
char buf[BUFSIZ];
- while (read(cfd, buf, sizeof(buf)-1) > 0) {
+ while (read(cfd, buf, sizeof(buf) - 1) > 0) {
gpsd_report(LOG_IO, "<= control(%d): %s\n", cfd, buf);
handle_control(cfd, buf);
}
+ gpsd_report(LOG_SPIN, "close(%d) of control socket\n", cfd);
(void)close(cfd);
FD_CLR(cfd, &all_fds);
FD_CLR(cfd, &control_fds);
@@ -1532,26 +1602,42 @@ int main(int argc, char *argv[])
continue;
/* pass the current RTCM correction to the GPS if new */
- if (device->device_type!=NULL)
+ if (device->device_type != NULL)
rtcm_relay(device);
/* get data from the device */
changed = 0;
- if (device->gpsdata.gps_fd >= 0 && FD_ISSET(device->gpsdata.gps_fd, &rfds))
- {
- gpsd_report(LOG_RAW+1, "polling %d\n", device->gpsdata.gps_fd);
+ if (device->gpsdata.gps_fd >= 0
+ && FD_ISSET(device->gpsdata.gps_fd, &rfds)) {
+ gpsd_report(LOG_RAW + 1, "polling %d\n",
+ device->gpsdata.gps_fd);
changed = gpsd_poll(device);
- /* must have a full packet to continue */
- if ((changed & PACKET_SET) == 0)
- continue;
+ if (changed == ERROR_IS) {
+ gpsd_report(LOG_WARN,
+ "packet sniffer failed sync with %s\n",
+ device->gpsdata.dev.path);
+ deactivate_device(device);
+ continue;
+ } else if ((changed & ONLINE_IS) == 0) {
+ gpsd_report(LOG_WARN,
+ "%s returned error or went offline\n",
+ device->gpsdata.dev.path);
+ deactivate_device(device);
+ continue;
+ }
+ /* must have a full packet to continue */
+ if ((changed & PACKET_IS) == 0)
+ continue;
/* raw hook and relaying functions */
- for (sub = subscribers; sub < subscribers + MAXSUBSCRIBERS; sub++) {
+ for (sub = subscribers; sub < subscribers + MAXSUBSCRIBERS;
+ sub++) {
if (sub->active == 0)
continue;
+ /* *INDENT-OFF* */
/*
* NMEA and other textual sentences are simply
* copied to all clients that are in raw or nmea
@@ -1559,8 +1645,11 @@ int main(int argc, char *argv[])
*/
if (TEXTUAL_PACKET_TYPE(device->packet.type)
&& (sub->policy.raw > 0 || sub->policy.nmea)) {
- (void)throttled_write(sub, (char *)device->packet.outbuffer, device->packet.outbuflen);
- continue;
+ (void)throttled_write(sub,
+ (char *)device->packet.
+ outbuffer,
+ device->packet.outbuflen);
+ continue;
}
/*
@@ -1568,51 +1657,45 @@ int main(int argc, char *argv[])
* super-raw mode.
*/
if (sub->policy.raw > 1) {
- (void)throttled_write(sub,
- (char *)device->packet.outbuffer,
- device->packet.outbuflen);
- continue;
+ (void)throttled_write(sub,
+ (char *)device->packet.
+ outbuffer,
+ device->packet.outbuflen);
+ continue;
}
#ifdef BINARY_ENABLE
/*
* Maybe the user wants a binary packet hexdumped.
*/
- if (sub->policy.raw==1) {
- char *hd = gpsd_hexdump((char*)device->packet.outbuffer,
- device->packet.outbuflen);
+ if (sub->policy.raw == 1) {
+ char *hd =
+ gpsd_hexdump((char *)device->packet.outbuffer,
+ device->packet.outbuflen);
/*
* Ugh...depends on knowing the length of gpsd_hexdump's
* buffer.
*/
- (void) strlcat(hd, "\r\n", MAX_PACKET_LENGTH*2+1);
- (void)throttled_write(sub,
- hd, strlen(hd));
+ (void)strlcat(hd, "\r\n", MAX_PACKET_LENGTH * 2 + 1);
+ (void)throttled_write(sub, hd, strlen(hd));
}
#endif /* BINARY_ENABLE */
+ /* *INDENT-ON* */
}
if (device->gpsdata.fix.mode == MODE_3D)
netgnss_report(device);
- if (changed == ERROR_SET) {
- gpsd_report(LOG_WARN, "packet sniffer failed to sync up\n");
- FD_CLR(device->gpsdata.gps_fd, &all_fds);
- adjust_max_fd(device->gpsdata.gps_fd, false);
- deactivate_device(device);
- } else if ((changed & ONLINE_SET) == 0) {
- FD_CLR(device->gpsdata.gps_fd, &all_fds);
- adjust_max_fd(device->gpsdata.gps_fd, false);
- deactivate_device(device);
- }
else {
/* we may need to add device to new-style watcher lists */
- if ((changed & DEVICE_SET) != 0) {
- for (sub = subscribers; sub < subscribers + MAXSUBSCRIBERS; sub++)
- if (sub->policy.watcher && sub->policy.devpath[0] == '\0')
+ if ((changed & DEVICE_IS) != 0) {
+ for (sub = subscribers;
+ sub < subscribers + MAXSUBSCRIBERS; sub++)
+ if (sub->policy.watcher
+ && sub->policy.devpath[0] == '\0')
(void)awaken(sub, device);
}
/* handle laggy response to a firmware version query */
- if ((changed & (DEVICEID_SET|DEVICE_SET)) != 0) {
+ if ((changed & (DEVICEID_IS | DEVICE_IS)) != 0) {
assert(device->device_type != NULL);
{
char id2[GPS_JSON_RESPONSE_MAX];
@@ -1621,13 +1704,21 @@ int main(int argc, char *argv[])
}
}
}
+ /* *INDENT-OFF* */
/* copy each RTCM-104 correction to all GPSes */
- if ((changed & RTCM2_SET) != 0 || (changed & RTCM3_SET) != 0) {
+ if ((changed & RTCM2_IS) != 0 || (changed & RTCM3_IS) != 0) {
struct gps_device_t *gps;
for (gps = devices; gps < devices + MAXDEVICES; gps++)
- if (gps->device_type != NULL && gps->device_type->rtcm_writer != NULL)
- (void)gps->device_type->rtcm_writer(gps, (char *)gps->packet.outbuffer, gps->packet.outbuflen);
+ if (gps->device_type != NULL
+ && gps->device_type->rtcm_writer != NULL)
+ (void)gps->device_type->rtcm_writer(gps,
+ (char *)gps->
+ packet.
+ outbuffer,
+ gps->packet.
+ outbuflen);
}
+ /* *INDENT-ON* */
}
/* watch all channels associated with this device */
@@ -1637,20 +1728,21 @@ int main(int argc, char *argv[])
/* some listeners may be in watcher mode */
/*@-nullderef@*/
if (sub != NULL && sub->policy.watcher) {
- char buf2[GPS_JSON_RESPONSE_MAX*4];
- if (changed & DATA_SET) {
+ char buf2[GPS_JSON_RESPONSE_MAX * 4];
+ if (changed & DATA_IS) {
bool report_fix = false;
gpsd_report(LOG_PROG,
- "Changed mask: %s with %sreliable cycle detection\n",
- gpsd_maskdump(changed), device->cycle_end_reliable ? "" : "un");
+ "Changed mask: %s with %sreliable cycle detection\n",
+ gpsd_maskdump(changed),
+ device->cycle_end_reliable ? "" : "un");
if (device->cycle_end_reliable) {
/*
* Driver returns reliable end of cycle,
* report only when that is signaled.
*/
- if ((changed & REPORT_SET)!=0)
+ if ((changed & REPORT_IS) != 0)
report_fix = true;
- } else if (changed & (LATLON_SET | MODE_SET))
+ } else if (changed & (LATLON_IS | MODE_IS))
/*
* No reliable end of cycle. Must report
* every time a sentence changes position
@@ -1666,55 +1758,70 @@ int main(int argc, char *argv[])
/* binary GPS packet, pseudo-NMEA dumping enabled */
if (sub->policy.nmea
- && GPS_PACKET_TYPE(device->packet.type)
- && !TEXTUAL_PACKET_TYPE(device->packet.type)) {
- char buf3[MAX_PACKET_LENGTH*3+2];
-
+ && GPS_PACKET_TYPE(device->packet.type)
+ && !TEXTUAL_PACKET_TYPE(device->packet.type)) {
+ char buf3[MAX_PACKET_LENGTH * 3 + 2];
+
gpsd_report(LOG_PROG, "data mask is %s\n",
gpsd_maskdump(device->gpsdata.set));
- if (report_fix) {
- nmea_tpv_dump(device,buf3,sizeof(buf3));
- gpsd_report(LOG_IO, "<= GPS (binary1) %s: %s",
+ if (report_fix) {
+ nmea_tpv_dump(device, buf3, sizeof(buf3));
+ gpsd_report(LOG_IO, "<= GPS (binary1) %s: %s",
device->gpsdata.dev.path, buf3);
- (void)throttled_write(sub, buf3, strlen(buf3));
- } else if ((changed & SATELLITE_SET)!=0) {
- nmea_sky_dump(device,buf3,sizeof(buf3));
- gpsd_report(LOG_IO, "<= GPS (binary2) %s: %s",
+ (void)throttled_write(sub, buf3,
+ strlen(buf3));
+ } else if ((changed & SATELLITE_IS) != 0) {
+ nmea_sky_dump(device, buf3, sizeof(buf3));
+ gpsd_report(LOG_IO, "<= GPS (binary2) %s: %s",
device->gpsdata.dev.path, buf3);
- (void)throttled_write(sub, buf3, strlen(buf3));
- }
- }
+ (void)throttled_write(sub, buf3,
+ strlen(buf3));
+ }
+ }
if (sub->policy.json) {
buf2[0] = '\0';
if (report_fix) {
json_tpv_dump(&device->gpsdata,
buf2, sizeof(buf2));
- (void)throttled_write(sub, buf2, strlen(buf2));
+ (void)throttled_write(sub, buf2,
+ strlen(buf2));
}
- if ((changed & SATELLITE_SET)!=0) {
+ if ((changed & SATELLITE_IS) != 0) {
json_sky_dump(&device->gpsdata,
buf2, sizeof(buf2));
- (void)throttled_write(sub, buf2, strlen(buf2));
+ (void)throttled_write(sub, buf2,
+ strlen(buf2));
}
+#ifdef COMPASS_ENABLE
+ if ((changed & ATT_IS) != 0) {
+ json_att_dump(&device->gpsdata,
+ buf2, sizeof(buf2));
+ (void)throttled_write(sub, buf2,
+ strlen(buf2));
+ }
+#endif /* COMPASS_ENABLE */
#ifdef RTCM104V2_ENABLE
- if ((changed & RTCM2_SET) != 0) {
- rtcm2_json_dump(&device->gpsdata.rtcm2, buf2, sizeof(buf2));
- (void)throttled_write(sub, buf2, strlen(buf2));
+ if ((changed & RTCM2_IS) != 0) {
+ rtcm2_json_dump(&device->gpsdata.rtcm2, buf2,
+ sizeof(buf2));
+ (void)throttled_write(sub, buf2,
+ strlen(buf2));
}
#endif /* RTCM104V2_ENABLE */
#ifdef AIVDM_ENABLE
- if ((changed & AIS_SET)!=0) {
- aivdm_json_dump(&device->gpsdata.ais,
- sub->policy.scaled,
+ if ((changed & AIS_IS) != 0) {
+ aivdm_json_dump(&device->gpsdata.ais,
+ sub->policy.scaled,
buf2, sizeof(buf2));
- (void)throttled_write(sub, buf2, strlen(buf2));
+ (void)throttled_write(sub, buf2,
+ strlen(buf2));
}
#endif /* AIVDM_ENABLE */
#ifdef TIMING_ENABLE
if (buf2[0] != '\0' && sub->policy.timing) {
- (void)snprintf(buf2, sizeof(buf2),
+ (void)snprintf(buf2, sizeof(buf2),
"{\"class\":\"TIMING\","
"\"tag\":\"%s\",\"len\":%d,"
"\"xmit\":%lf,\"recv\":%lf,"
@@ -1726,7 +1833,8 @@ int main(int argc, char *argv[])
device->d_recv_time,
device->d_decode_time,
timestamp());
- (void)throttled_write(sub, buf2, strlen(buf2));
+ (void)throttled_write(sub, buf2,
+ strlen(buf2));
}
#endif /* TIMING_ENABLE */
}
@@ -1739,11 +1847,11 @@ int main(int argc, char *argv[])
#ifdef NOT_FIXED
if (context.fixcnt > 0 && context.dsock == -1) {
- for (device=devices; device < devices+MAXDEVICES; device++) {
+ for (device = devices; device < devices + MAXDEVICES; device++) {
if (device->gpsdata.fix.mode > MODE_NO_FIX) {
netgnss_autoconnect(&context,
- device->gpsdata.fix.latitude,
- device->gpsdata.fix.longitude);
+ device->gpsdata.fix.latitude,
+ device->gpsdata.fix.longitude);
break;
}
}
@@ -1759,14 +1867,16 @@ int main(int argc, char *argv[])
char buf[BUFSIZ];
int buflen;
- gpsd_report(LOG_PROG, "checking client(%d)\n", sub_index(sub));
- if ((buflen = (int)recv(sub->fd, buf, sizeof(buf) - 1, 0)) <= 0) {
+ gpsd_report(LOG_PROG, "checking client(%d)\n",
+ sub_index(sub));
+ if ((buflen =
+ (int)recv(sub->fd, buf, sizeof(buf) - 1, 0)) <= 0) {
detach_client(sub);
} else {
- if (buf[buflen-1] != '\n')
+ if (buf[buflen - 1] != '\n')
buf[buflen++] = '\n';
buf[buflen] = '\0';
- gpsd_report(LOG_IO,
+ gpsd_report(LOG_IO,
"<= client(%d): %s", sub_index(sub), buf);
/*
@@ -1780,8 +1890,11 @@ int main(int argc, char *argv[])
detach_client(sub);
}
} else {
- if (!sub->policy.watcher && timestamp() - sub->active > COMMAND_TIMEOUT) {
- gpsd_report(LOG_WARN, "client(%d) timed out on command wait.\n", cfd);
+ if (!sub->policy.watcher
+ && timestamp() - sub->active > COMMAND_TIMEOUT) {
+ gpsd_report(LOG_WARN,
+ "client(%d) timed out on command wait.\n",
+ cfd);
detach_client(sub);
}
}
@@ -1793,12 +1906,13 @@ int main(int argc, char *argv[])
* See the explanation of RELEASE_TIME for the reasoning.
*/
if (!nowait)
- for (device=devices; device < devices+MAXDEVICES; device++) {
+ for (device = devices; device < devices + MAXDEVICES; device++) {
if (allocated_device(device)) {
if (device->packet.type != BAD_PACKET) {
bool device_needed = false;
- for (sub = subscribers; sub < subscribers + MAXSUBSCRIBERS; sub++) {
+ for (sub = subscribers;
+ sub < subscribers + MAXSUBSCRIBERS; sub++) {
if (sub->active == 0)
continue;
else if (subscribed(sub, device)) {
@@ -1810,12 +1924,17 @@ int main(int argc, char *argv[])
if (!device_needed && device->gpsdata.gps_fd > -1) {
if (device->releasetime == 0) {
device->releasetime = timestamp();
- gpsd_report(LOG_PROG, "device %d (fd %d) released\n", (int)(device-devices), device->gpsdata.gps_fd);
- } else if (timestamp() - device->releasetime > RELEASE_TIMEOUT) {
- gpsd_report(LOG_PROG, "device %d closed\n", (int)(device-devices));
- gpsd_report(LOG_RAW, "unflagging descriptor %d\n", device->gpsdata.gps_fd);
- FD_CLR(device->gpsdata.gps_fd, &all_fds);
- adjust_max_fd(device->gpsdata.gps_fd, false);
+ gpsd_report(LOG_PROG,
+ "device %d (fd %d) released\n",
+ (int)(device - devices),
+ device->gpsdata.gps_fd);
+ } else if (timestamp() - device->releasetime >
+ RELEASE_TIMEOUT) {
+ gpsd_report(LOG_PROG, "device %d closed\n",
+ (int)(device - devices));
+ gpsd_report(LOG_RAW,
+ "unflagging descriptor %d\n",
+ device->gpsdata.gps_fd);
deactivate_device(device);
}
}
@@ -1829,11 +1948,12 @@ int main(int argc, char *argv[])
if (SIGHUP == (int)signalled)
longjmp(restartbuf, 1);
- gpsd_report(LOG_WARN, "Received terminating signal %d. Exiting...\n",signalled);
+ gpsd_report(LOG_WARN, "Received terminating signal %d. Exiting...\n",
+ signalled);
/*
* A linger option was set on each client socket when it was
- * creaed. Now, shut them down gracefully, letting I/O drain.
+ * created. Now, shut them down gracefully, letting I/O drain.
* This is an attempt to avoid the sporadic race errors at the ends
* of our regression tests.
*/
@@ -1854,4 +1974,5 @@ int main(int argc, char *argv[])
(void)unlink(pid_file);
return 0;
}
+
/*@ +mustfreefresh @*/
diff --git a/gpsd.h-tail b/gpsd.h-tail
index d5c4908b..408a5a8e 100644
--- a/gpsd.h-tail
+++ b/gpsd.h-tail
@@ -23,6 +23,9 @@ typedef unsigned int speed_t;
#if defined(TRIPMATE_ENABLE) || defined(BINARY_ENABLE)
#define NON_NMEA_ENABLE
#endif
+#if defined(TNT_ENABLE) || defined(OCEANSERVER_ENABLE)
+#define COMPASS_ENABLE
+#endif
/* First, declarations for the packet layer... */
@@ -158,7 +161,7 @@ struct gps_context_t {
int fixcnt; /* count of good fixes seen */
socket_t dsock; /* socket to DGPSIP server/Ntrip caster */
void *netgnss_privdata; /* DGNSS service specific data */
- ssize_t rtcmbytes; /* byte count of last RTCM104 report */
+ size_t rtcmbytes; /* byte count of last RTCM104 report */
char rtcmbuf[RTCM_MAX]; /* last RTCM104 report */
double rtcmtime; /* timestamp of last RTCM104 report */
/* timekeeping */
@@ -200,6 +203,7 @@ struct gps_device_t;
typedef enum {ANY, GPS, RTCM2, RTCM3, AIS} gnss_type;
typedef enum {
event_wakeup,
+ event_triggermatch,
event_identified,
event_configure,
event_driver_switch,
@@ -207,6 +211,36 @@ typedef enum {
event_reactivate,
} event_t;
+#define ONLINE_IS 0x00000001u
+#define TIME_IS 0x00000002u
+#define TIMERR_IS 0x00000004u
+#define LATLON_IS 0x00000008u
+#define ALTITUDE_IS 0x00000010u
+#define SPEED_IS 0x00000020u
+#define TRACK_IS 0x00000040u
+#define CLIMB_IS 0x00000080u
+#define STATUS_IS 0x00000100u
+#define MODE_IS 0x00000200u
+#define DOP_IS 0x00000400u
+#define HERR_IS 0x00000800u
+#define VERR_IS 0x00001000u
+#define PERR_IS 0x00002000u
+#define SATELLITE_IS 0x00004000u
+#define RAW_IS 0x00008000u
+#define USED_IS 0x00010000u
+#define SPEEDERR_IS 0x00020000u
+#define DEVICE_IS 0x00040000u
+#define DEVICEID_IS 0x00100000u
+#define ERROR_IS 0x00200000u
+#define RTCM2_IS 0x00400000u
+#define RTCM3_IS 0x00800000u
+#define AIS_IS 0x01000000u
+#define ATT_IS 0x02000000u
+#define PACKET_IS 0x04000000u
+#define CLEAR_IS 0x08000000u /* sentence starts a reporting cycle */
+#define REPORT_IS 0x10000000u /* sentence ends a reporting cycle */
+#define DATA_IS ~(ONLINE_IS|PACKET_IS|CLEAR_IS|REPORT_IS)
+
struct gps_type_t {
/* GPS method table, describes how to talk to a particular GPS type */
/*@observer@*/char *type_name;
@@ -228,14 +262,26 @@ struct gps_type_t {
#ifdef ALLOW_CONTROLSEND
/*@null@*/ssize_t (*control_send)(struct gps_device_t *session, char *buf, size_t buflen);
#endif /* ALLOW_CONTROLSEND */
+#ifdef NTPSHM_ENABLE
+ /*@null@*/double (*ntp_offset)(struct gps_device_t *session);
+#endif /* NTPSHM_ENABLE */
};
+typedef enum {source_unknown,
+ source_blockdev,
+ source_rs232,
+ source_usb,
+ source_pty,
+ source_socket}
+ sourcetype_t;
+
struct gps_device_t {
/* session object, encapsulates all global state */
struct gps_data_t gpsdata;
/*@relnull@*/const struct gps_type_t *device_type;
struct gps_context_t *context;
bool is_serial;
+ sourcetype_t sourcetype;
double rtcmtime; /* timestamp of last RTCM104 correction to GPS */
#ifndef _WIN32
struct termios ttyset, ttyset_old;
@@ -244,6 +290,7 @@ struct gps_device_t {
int saved_baud;
struct gps_packet_t packet;
char subtype[64]; /* firmware version or subtype ID */
+ double opentime;
double releasetime;
#ifdef NTPSHM_ENABLE
int shmindex;
@@ -257,7 +304,7 @@ struct gps_device_t {
char msgbuf[MAX_PACKET_LENGTH*2+1]; /* command message buffer for sends */
size_t msgbuflen;
int observed; /* which packet type`s have we seen? */
- bool cycle_end_reliable; /* does driverr signal REPORT_SET */
+ bool cycle_end_reliable; /* does driver signal REPORT_MASK */
bool notify_clients; /* ship DEVICE notification on poll? */
struct gps_fix_t newdata; /* where clients put their data */
struct gps_fix_t oldfix; /* previous fix for error modeling */
@@ -293,6 +340,12 @@ struct gps_device_t {
#endif /* GPSCLOCK_ENABLE */
} nmea;
#endif /* NMEA_ENABLE */
+#ifdef GARMINTXT_ENABLE
+ struct {
+ struct tm date; /* date part of last sentence time */
+ double subseconds; /* subsec part of last sentence time */
+ } garmintxt;
+#endif /* NMEA_ENABLE */
#ifdef BINARY_ENABLE
#ifdef SIRF_ENABLE
struct {
@@ -425,7 +478,8 @@ struct gps_device_t {
#define LOG_DATA 3 /* log data management messages */
#define LOG_PROG 4 /* progress messages */
#define LOG_IO 5 /* IO to and from devices */
-#define LOG_RAW 6 /* raw low-level I/O */
+#define LOG_SPIN 6 /* logging for catching spin bugs */
+#define LOG_RAW 7 /* raw low-level I/O */
#define IS_HIGHEST_BIT(v,m) (v & ~((m<<1)-1))==0
@@ -529,11 +583,8 @@ extern void gpsd_wrap(struct gps_device_t *);
/* exceptional driver methods */
#ifdef UBX_ENABLE
-extern gps_mask_t ubx_parse(struct gps_device_t *, unsigned char *, size_t);
extern bool ubx_write(struct gps_device_t *, unsigned int, unsigned int,
/*@null@*/unsigned char *, unsigned short);
-extern void ubx_catch_model(struct gps_device_t *,
- unsigned char *, size_t);
#endif /* UBX_ENABLE */
#ifdef AIVDM_ENABLE
extern bool aivdm_decode(const char *, size_t, struct aivdm_context_t *, struct ais_t *);
diff --git a/gpsd.php b/gpsd.php
index cc717251..21bb9b9e 100644
--- a/gpsd.php
+++ b/gpsd.php
@@ -17,8 +17,23 @@
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
global $head, $blurb, $title, $googlemap, $autorefresh, $footer, $gmap_key;
-global $GPS, $server, $advertise, $port, $magic, $swap_ew, $magic;
-$magic = 1; # leave this set to 1
+global $server, $advertise, $port, $open, $swap_ew, $testmode;
+$testmode = 1; # leave this set to 1
+
+# Public script parameters:
+# host: host name or address where GPSd runs. Default: from config file
+# port: port of GPSd. Default: from config file
+# op=view: show just the skyview image instead of the whole HTML page
+# sz=small: used with op=view, display a small (240x240px) skyview
+# op=json: respond with the GPSd POLL JSON structure
+# jsonp=prefix: used with op=json, wrap the POLL JSON in parentheses
+# and prepend prefix
+
+# If you're running PHP with the Suhosin patch (like the Debian PHP5 package),
+# it may be necessary to increase the value of the
+# suhosin.get.max_value_length parameter to 2048. The imgdata parameter used
+# for displaying the skyview is longer than the default 512 allowed by Suhosin.
+# Debian has the config file at /etc/php5/conf.d/suhosin.ini.
# this script shouldn't take more than a few seconds to run
set_time_limit(3);
@@ -56,7 +71,8 @@ EOF;
# if we're passing in a query, let's unpack and use it
-if (isset($_GET['imgdata']) && isset($_GET['op']) && ($_GET['op'] == 'view')){
+$op = isset($_GET['op']) ? $_GET['op'] : '';
+if (isset($_GET['imgdata']) && $op == 'view'){
$resp = base64_decode($_GET['imgdata']);
if ($resp){
gen_image($resp);
@@ -71,7 +87,7 @@ if (isset($_GET['imgdata']) && isset($_GET['op']) && ($_GET['op'] == 'view')){
if (!preg_match('/\D/', $_GET['port']) && ($port>0) && ($port<65536))
$port = $_GET['port'];
- if ($magic){
+ if ($testmode){
$sock = @fsockopen($server, $port, $errno, $errstr, 2);
@fwrite($sock, "?POLL;\n");
for($tries = 0; $tries < 10; $tries++){
@@ -82,18 +98,17 @@ if (isset($_GET['imgdata']) && isset($_GET['op']) && ($_GET['op'] == 'view')){
}
}
@fclose($sock);
- }
- $GPS = json_decode($resp, true);
- if ($GPS === false){
- die("json_decode error...");
+ if (!$resp)
+ $resp = '{"class":"ERROR","message":"no response from GPS daemon"}';
}
}
-if (isset($_GET['op']) && ($_GET['op'] == 'view')){
+if ($op == 'view')
gen_image($resp);
-} else {
+else if ($op == 'json')
+ write_json($resp);
+else
write_html($resp);
-}
exit(0);
@@ -275,15 +290,13 @@ function skyview($im, $sz, $C){
}
function gen_image($resp){
- global $magic;
-
$sz = 600;
if (isset($_GET['sz']) && ($_GET['sz'] == 'small'))
$sz = 240;
$GPS = json_decode($resp, true);
if ($GPS['class'] != "POLL"){
- die("json_decode error...");
+ die("json_decode error: $resp");
}
$im = imageCreate($sz, $sz);
@@ -311,9 +324,14 @@ function dfix($x, $y, $z){
}
function write_html($resp){
- global $GPS, $sock, $errstr, $errno, $server, $port, $head, $body;
+ global $sock, $errstr, $errno, $server, $port, $head, $body, $open;
global $blurb, $title, $autorefresh, $googlemap, $gmap_key, $footer;
- global $magic;
+ global $testmode, $advertise;
+
+ $GPS = json_decode($resp, true);
+ if ($GPS['class'] != 'POLL'){
+ die("json_decode error: $resp");
+ }
header("Content-type: text/html; charset=UTF-8");
@@ -322,7 +340,6 @@ function write_html($resp){
$lon = (float)$GPS['fixes'][0]['lon'];
$x = $server; $y = $port;
$imgdata = base64_encode($resp);
- include("gpsd_config.inc"); # breaks things - XXX wtf?
$server = $x; $port = $y;
if ($autorefresh > 0)
@@ -337,7 +354,7 @@ function write_html($resp){
$gmap_code = gen_gmap_code();
}
$part1 = <<<EOF
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
@@ -346,7 +363,7 @@ function write_html($resp){
{$gmap_head}
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta http-equiv="Content-Language" content="en,en-us"/>
-<title>{$title} - GPSD Test Station {$GPS['loc']}</title>
+<title>{$title} - GPSD Test Station {$lat}, {$lon}</title>
{$autorefresh}
<style>
.warning {
@@ -380,7 +397,7 @@ EOF;
if (!strlen($advertise))
$advertise = $server;
- if ($magic && !$sock)
+ if ($testmode && !$sock)
$part2 = "";
else
$part2 = <<<EOF
@@ -393,15 +410,19 @@ width="600" height="600"/>
<p class="caption">A filled circle means the satellite was used in
the last fix. Green-yellow-red colors indicate signal strength in dB,
green=most and red=least. Diamonds indicate SBAS satellites.</p>
-</td>
+{$gmap_code}</td>
</tr>
EOF;
- $part3 = <<<EOF
+ if (!$open)
+ $part3 = '';
+ else
+ $part3 = <<<EOF
<!-- ------------------------------------------------------------ -->
<tr><td align="justify">To get real-time information, connect to
-<span class="fixed">telnet://{$advertise}:{$port}/</span> and type "R".<br/>
+<span class="fixed">telnet://{$advertise}:{$port}/</span> and type "?POLL;"
+or "?WATCH={"enable":true,"raw":true}".<br/>
Use a different server:<br/>
<form method=GET action="${_SERVER['SCRIPT_NAME']}">
<input name="host" value="{$advertise}">:
@@ -412,7 +433,7 @@ Use a different server:<br/>
</tr>
EOF;
- if ($magic && !$sock)
+ if ($testmode && !$sock)
$part4 = "<tr><td><font color='red'>The gpsd instance that this page monitors is not running.</font></td></tr>";
else {
$nsv = count($GPS['skyviews'][0]['satellites']);
@@ -454,6 +475,14 @@ print $part1 . $part2 . $part3 . $part4 . $part5;
}
+function write_json($resp){
+ header('Content-Type: text/javascript');
+ if (isset($_GET['jsonp']))
+ print "{$_GET['jsonp']}({$resp})";
+ else
+ print $resp;
+}
+
function write_config(){
$f = fopen("gpsd_config.inc", "a");
if (!$f)
@@ -469,6 +498,7 @@ function write_config(){
\$googlemap = 0; # set to 1 if you want to have a google map
\$gmap_key = 'GetYourOwnGoogleKey'; # your google API key goes here
\$swap_ew = 0; # set to 1 if you don't understand projections
+\$open = 0; # set to 1 to show the form to change the GPSd server
## You can read the header, footer and blurb from a file...
# \$head = file_get_contents('/path/to/header.inc');
diff --git a/gpsd.xml b/gpsd.xml
index df96f4bc..2ba19124 100644
--- a/gpsd.xml
+++ b/gpsd.xml
@@ -105,8 +105,8 @@ that speaks either the standard textual NMEA 0183 protocol, or the
OnCore, Sony CXD2951, and Ashtech/Thales devices. It can also
interpret the binary protocols used by EverMore, Garmin, Navcom,
Rockwell/Zodiac, SiRF, Trimble, and uBlox ANTARIS devices. It can read
-heading and attitude information from the Oceanserver 5000 digital
-compass.</para>
+heading and attitude information from the Oceanserver 5000 orv TNT
+Revolution digital compasses.</para>
<para>The GPS reporting formats supported by your instance of
<application>gpsd</application> may differ depending on how it was
@@ -147,12 +147,6 @@ this will be created as a Unix-domain socket to which you can write
commands that edit the daemon's internal device list.</para>
</listitem>
</varlistentry>
-<!-- varlistentry>
-<term>-R</term>
-<listitem><para>Set TCP/IP port on which to listen for DGPSIP clients
-(default is 2101). The option -R 0 will disable serving DGPSIP
-clients.</para></listitem>
-</varlistentry -->
<varlistentry>
<term>-S</term>
<listitem><para>Set TCP/IP port on which to listen for GPSD clients
@@ -189,18 +183,17 @@ control commands supported by that driver.</para>
</varlistentry>
<varlistentry>
<term>-n</term>
-<listitem><para>Don't wait for a client to connect before polling
-whatever GPS is associated with it. It is thought that some GPSes
-go to a standby mode (drawing less power) before the host machine
-asserts DTR, so waiting for the first actual request might save
-battery power on portable equipment.</para>
+<listitem>
+<para>Don't wait for a client to connect before polling
+whatever GPS is associated with it. Many GPSes go to a standby mode
+(drawing less power) before the host machine asserts DTR, so waiting
+for the first actual request saves battery power.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>-N</term>
<listitem><para>Don't daemonize; run in foreground. Also suppresses
-privilege-dropping. This switch is mainly useful for debugging.
-Its meaning may change in future versions.</para>
+privilege-dropping. This switch is mainly useful for debugging.</para>
</listitem>
</varlistentry>
<varlistentry>
@@ -281,7 +274,7 @@ to accept them.Example:
</varlistentry>
</variablelist>
-<para>Internally, the daemon maintains a device list holding the
+<para>Internally, the daemon maintains a device pool holding the
pathnames of devices and remote servers known to the
daemon. Initially, this list is the list of device-name arguments
specified on the command line. That list may be empty, in which case
@@ -463,7 +456,7 @@ depending on the fix quality.</para>
<para>When the C client library parses a response of this kind, it
will assert validity bits in the top-level set member for each
-field actrually received; see gps.h for bitmask names and values.</para>
+field actually received; see gps.h for bitmask names and values.</para>
<para>Here's an example:</para>
@@ -679,6 +672,247 @@ will assert the SATELLITE_SET bit in the top-level set member.</para>
</listitem>
</varlistentry>
+<varlistentry>
+<term>ATT</term>
+<listitem>
+<para>An ATT object is a vehicle-attitude report. It is returned by
+digital-compass and gyroscope sensors; depending on device, it may
+include: heading, pitch, roll, yaw, gyroscope, and magnetic-field
+readings. Because such sensors are often bundled as part of
+marine-navigation systems, the ATT response may also include
+water depth.</para>
+
+<para>The "class", "mode", and "tag" fields will reliably be present. Others
+may be reported or not depending on the specific device type.</para>
+
+<table frame="all" pgwide="0"><title>ATT object</title>
+<tgroup cols="3" align="left" colsep="1" rowsep="1">
+<thead>
+<row>
+ <entry>Name</entry>
+ <entry>Always?</entry>
+ <entry>Type</entry>
+ <entry>Description</entry>
+</row>
+</thead>
+<tbody>
+<row>
+ <entry>class</entry>
+ <entry>Yes</entry>
+ <entry>string</entry>
+ <entry>Fixed: "ATT"</entry>
+</row>
+<row>
+ <entry>tag</entry>
+ <entry>Yes</entry>
+ <entry>string</entry>
+ <entry>Type tag associated with this GPS sentence; from an NMEA
+ device this is just the NMEA sentence type..</entry>
+</row>
+<row>
+ <entry>device</entry>
+ <entry>Yes</entry>
+ <entry>string</entry>
+ <entry>Name of originating device</entry>
+</row>
+<row>
+ <entry>time</entry>
+ <entry>Yes</entry>
+ <entry>numeric</entry>
+ <entry>Seconds since the Unix epoch, UTC. May have a
+ fractional part of up to .01sec precision.</entry>
+</row>
+<row>
+ <entry>heading</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>Heading, degrees from true north.</entry>
+</row>
+<row>
+ <entry>mag_st</entry>
+ <entry>No</entry>
+ <entry>string</entry>
+ <entry>Magnetometer status.</entry>
+</row>
+<row>
+ <entry>pitch</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>Pitch in degrees.</entry>
+</row>
+<row>
+ <entry>pitch_st</entry>
+ <entry>No</entry>
+ <entry>string</entry>
+ <entry>Pitch sensor status.</entry>
+</row>
+<row>
+ <entry>yaw</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>Yaw in degrees</entry>
+</row>
+<row>
+ <entry>yaw_st</entry>
+ <entry>No</entry>
+ <entry>string</entry>
+ <entry>Yaw sensor status.</entry>
+</row>
+<row>
+ <entry>roll</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>Roll in degrees.</entry>
+</row>
+<row>
+ <entry>roll_st</entry>
+ <entry>No</entry>
+ <entry>string</entry>
+ <entry>Roll sensor status.</entry>
+</row>
+<row>
+ <entry>dip</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>Roll in degrees.</entry>
+</row>
+<row>
+ <entry>mag_len</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>Scalar magnetic field strength.</entry>
+</row>
+<row>
+ <entry>mag_x</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>X component of magnetic field strength.</entry>
+</row>
+<row>
+ <entry>mag_y</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>Y component of magnetic field strength..</entry>
+</row>
+<row>
+ <entry>mag_z</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>Z component of magnetic field strength..</entry>
+</row>
+<row>
+ <entry>mag_len</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>Scalar acceleration.</entry>
+</row>
+<row>
+ <entry>acc_x</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>X component of acceleration.</entry>
+</row>
+<row>
+ <entry>acc_y</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>Y component of acceleration.</entry>
+</row>
+<row>
+ <entry>acc_z</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>Z component of acceleration..</entry>
+</row>
+<row>
+ <entry>gyro_x</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>X component of acceleration.</entry>
+</row>
+<row>
+ <entry>gyro_y</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>Y component of acceleration.</entry>
+</row>
+<row>
+ <entry>depth</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>Water depth in meters.</entry>
+</row>
+<row>
+ <entry>temperature</entry>
+ <entry>No</entry>
+ <entry>numeric</entry>
+ <entry>Temperature at sensir, degrees centigrade.</entry>
+</row>
+
+
+</tbody>
+</tgroup>
+</table>
+
+<para>The heading, pitch, and roll status codes (if present) vary by device.
+For the TNT Revolution digital compasses, they are coded as follows: </para>
+
+<table frame="all" pgwide="0"><title>Device flags</title>
+<tgroup cols="2" align="left" colsep="1" rowsep="1">
+<thead>
+<row>
+ <entry>Code</entry>
+ <entry>Description</entry>
+</row>
+</thead>
+<tbody>
+<row>
+ <entry>C</entry>
+ <entry>magnetometer calibration alarm</entry>
+</row>
+<row>
+ <entry>L</entry>
+ <entry>low alarm</entry>
+</row>
+<row>
+ <entry>M</entry>
+ <entry>low warning</entry>
+</row>
+<row>
+ <entry>N</entry>
+ <entry>normal</entry>
+</row>
+<row>
+ <entry>O</entry>
+ <entry>high warning</entry>
+</row>
+<row>
+ <entry>P</entry>
+ <entry>high alarm</entry>
+</row>
+<row>
+ <entry>V</entry>
+ <entry>magnetometer voltage level alarm</entry>
+</row>
+</tbody>
+</tgroup>
+</table>
+
+
+<para>When the C client library parses a response of this kind, it
+will assert ATT_IS.</para>
+
+<para>Here's an example:</para>
+
+<programlisting>
+{"class":"ATT","tag":"PTNTHTM","time":1270938096.843,
+ "heading":14223.00,"mag_st":"N",
+ "pitch":169.00,"pitch_st":"N", "roll":-43.00,"roll_st":"N",
+ "dip":13641.000,"mag_x":2454.000,"temperature":0.000,"depth":0.000}
+</programlisting>
+</listitem>
+</varlistentry>
+
</variablelist>
<para>And here are the commands:</para>
@@ -1286,12 +1520,17 @@ specification for the members of the corresponding JSON object type.</para>
<refsect1 id='devices'><title>GPS DEVICE MANAGEMENT</title>
<para><application>gpsd</application> maintains an internal list of
-GPS devices. If you specify devices on the command line, the list is
-initialized with those pathnames; otherwise the list starts empty.
-Commands to add and remove GPS device paths from the daemon's device
-list must be written to a local Unix-domain socket which will be
-accessible only to programs running as root. This control socket will
-be located wherever the -F option specifies it.</para>
+GPS devices (the "device pool"). If you specify devices on the
+command line, the list is initialized with those pathnames; otherwise
+the list starts empty. Commands to add and remove GPS device paths
+from the daemon's device list must be written to a local Unix-domain
+socket which will be accessible only to programs running as root.
+This control socket will be located wherever the -F option specifies
+it.</para>
+
+<para>A device may will also be dropped from the pool if GPSD gets a zero
+length read from it. This end-of-file condition indicates that the'
+device has been disconnected.</para>
<para>When <application>gpsd</application> is properly installed along
with hotplug notifier scripts feeding it device-add commands over the
@@ -1326,7 +1565,7 @@ followed by the control string in paired hex digits.</para>
with either "OK" or "ERROR". An ERROR reponse to an add command means
the device did not emit data recognizable as GPS packets; an ERROR
response to a remove command means the specified device was not in
-<application>gpsd</application>'s device list. An ERROR response to a
+<application>gpsd</application>'s device pool. An ERROR response to a
! command means the daemon did not recognize the devicename
specified.</para>
@@ -1343,7 +1582,7 @@ spoofing attacks.</para>
or less at 66% confidence, 15 meters or less at 95% confidence. Actual
horizontal error will be UERE times a dilution factor dependent on current
satellite position. Altitude determination is more sensitive to
-variability to atmospheric signal lag than latitude/longitude, and is
+variability in ionospheric signal lag than latitude/longitude is, and is
also subject to errors in the estimation of local mean sea level; base
error is 12 meters at 66% confidence, 23 meters at 95% confidence.
Again, this will be multiplied by a vertical dilution of precision
@@ -1532,7 +1771,7 @@ longer timeout (15 minutes).</para>
<para>If multiple NMEA talkers are feeding RMC, GLL, and GGA sentences
to the same serial device (possible with an RS422 adapter hooked up to
-some marine-navigation systems), an 'O' response may mix an altitude
+some marine-navigation systems), a 'TPV' response may mix an altitude
from one device's GGA with latitude/longitude from another's RMC/GLL
after the second sentence has arrived.</para>
@@ -1631,6 +1870,13 @@ RTCM Paper 194-93/SC 104-STD. The applicable standard for RTCM-104 V3
is <citetitle>RTCM Standard 10403.1 for Differential GNSS Services -
Version 3</citetitle> RTCM Paper 177-2006-SC104-STD.</para>
+<para>AIS is defined by ITU Recommendation M.1371,
+<citetitle>Technical Characteristics for a Universal Shipborne
+Automatic Identification System Using Time Division Multiple
+Access</citetitle>. The AIVDM/AIVDO format understood by this progeam
+is defined by IEC-PAS 61162-100, <citetitle>Maritime navigation and
+radiocommunication equipment and systems</citetitle></para>
+
</refsect1>
<refsect1 id='see_also'><title>SEE ALSO</title>
<para>
diff --git a/gpsd_dbus.c b/gpsd_dbus.c
index f8ed9edc..21a29937 100644
--- a/gpsd_dbus.c
+++ b/gpsd_dbus.c
@@ -8,18 +8,19 @@
#ifdef DBUS_ENABLE
#include <gpsd_dbus.h>
-static DBusConnection* connection = NULL;
+static DBusConnection *connection = NULL;
/*
* Does what is required to initialize the dbus connection
* This is pretty basic at this point, as we don't receive commands via dbus.
* Returns 0 when everything is OK.
*/
-int initialize_dbus_connection(void) {
- DBusError error;
+int initialize_dbus_connection(void)
+{
+ DBusError error;
dbus_error_init(&error);
- connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
+ connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
if (connection == NULL) {
/* report error */
return 1;
@@ -27,19 +28,21 @@ int initialize_dbus_connection(void) {
return 0;
}
-void send_dbus_fix(struct gps_device_t* channel) {
+void send_dbus_fix(struct gps_device_t *channel)
+{
/* sends the current fix data for this channel via dbus */
- struct gps_data_t* gpsdata;
- struct gps_fix_t* gpsfix;
- DBusMessage* message;
- /*DBusMessageIter iter;*/
- dbus_uint32_t serial; /* collected, but not used */
- char* gpsd_devname;
+ struct gps_data_t *gpsdata;
+ struct gps_fix_t *gpsfix;
+ DBusMessage *message;
+ /*DBusMessageIter iter; */
+ dbus_uint32_t serial; /* collected, but not used */
+ char *gpsd_devname;
/* this packet format was designed before we split eph */
- double eph;
+ double eph;
/* if the connection is non existent, return without doing anything */
- if (connection == NULL) return;
+ if (connection == NULL)
+ return;
gpsdata = &(channel->gpsdata);
gpsfix = &(gpsdata->fix);
@@ -49,23 +52,23 @@ void send_dbus_fix(struct gps_device_t* channel) {
/* Send the named signel. */
message = dbus_message_new_signal("/org/gpsd", "org.gpsd", "fix");
- dbus_message_append_args (message,
- DBUS_TYPE_DOUBLE, &(gpsfix->time),
- DBUS_TYPE_INT32, &(gpsfix->mode),
- DBUS_TYPE_DOUBLE, &(gpsfix->ept),
- DBUS_TYPE_DOUBLE, &(gpsfix->latitude),
- DBUS_TYPE_DOUBLE, &(gpsfix->longitude),
- DBUS_TYPE_DOUBLE, &(eph),
- DBUS_TYPE_DOUBLE, &(gpsfix->altitude),
- DBUS_TYPE_DOUBLE, &(gpsfix->epv),
- DBUS_TYPE_DOUBLE, &(gpsfix->track),
- DBUS_TYPE_DOUBLE, &(gpsfix->epd),
- DBUS_TYPE_DOUBLE, &(gpsfix->speed),
- DBUS_TYPE_DOUBLE, &(gpsfix->eps),
- DBUS_TYPE_DOUBLE, &(gpsfix->climb),
- DBUS_TYPE_DOUBLE, &(gpsfix->epc),
- DBUS_TYPE_STRING, &gpsd_devname,
- DBUS_TYPE_INVALID);
+ dbus_message_append_args(message,
+ DBUS_TYPE_DOUBLE, &(gpsfix->time),
+ DBUS_TYPE_INT32, &(gpsfix->mode),
+ DBUS_TYPE_DOUBLE, &(gpsfix->ept),
+ DBUS_TYPE_DOUBLE, &(gpsfix->latitude),
+ DBUS_TYPE_DOUBLE, &(gpsfix->longitude),
+ DBUS_TYPE_DOUBLE, &(eph),
+ DBUS_TYPE_DOUBLE, &(gpsfix->altitude),
+ DBUS_TYPE_DOUBLE, &(gpsfix->epv),
+ DBUS_TYPE_DOUBLE, &(gpsfix->track),
+ DBUS_TYPE_DOUBLE, &(gpsfix->epd),
+ DBUS_TYPE_DOUBLE, &(gpsfix->speed),
+ DBUS_TYPE_DOUBLE, &(gpsfix->eps),
+ DBUS_TYPE_DOUBLE, &(gpsfix->climb),
+ DBUS_TYPE_DOUBLE, &(gpsfix->epc),
+ DBUS_TYPE_STRING, &gpsd_devname,
+ DBUS_TYPE_INVALID);
dbus_message_set_no_reply(message, TRUE);
dbus_connection_send(connection, message, &serial);
dbus_message_unref(message);
diff --git a/gpsd_json.c b/gpsd_json.c
index 343c2f39..126dea24 100644
--- a/gpsd_json.c
+++ b/gpsd_json.c
@@ -24,6 +24,7 @@ PERMISSIONS
#include "gps_json.h"
#include "revision.h"
+/* *INDENT-OFF* */
/*
* Manifest names for the gnss_type enum - must be kept synced with it.
* Also, masks so we can tell what packet types correspond to each class.
@@ -44,8 +45,11 @@ struct classmap_t classmap[CLASSMAP_NITEMS] = {
{"RTCM3", SEEN_RTCM3, PACKET_TYPEMASK(RTCM3_PACKET)},
{"AIS", SEEN_AIS, PACKET_TYPEMASK(AIVDM_PACKET)},
};
+/* *INDENT-ON* */
-char *json_stringify(/*@out@*/char *to, size_t len, /*@in@*/const char *from)
+char *json_stringify( /*@out@*/ char *to,
+ size_t len,
+ /*@in@*/ const char *from)
/* escape double quotes and control characters inside a JSON string */
{
/*@-temptrans@*/
@@ -58,7 +62,7 @@ char *json_stringify(/*@out@*/char *to, size_t len, /*@in@*/const char *from)
* each character to generate an up to 6-character Java-style
* escape
*/
- for (sp = from; *sp!='\0' && ((tp - to) < ((int)len-5)); sp++) {
+ for (sp = from; *sp != '\0' && ((tp - to) < ((int)len - 5)); sp++) {
if (iscntrl(*sp)) {
*tp++ = '\\';
switch (*sp) {
@@ -94,37 +98,34 @@ char *json_stringify(/*@out@*/char *to, size_t len, /*@in@*/const char *from)
/*@+temptrans@*/
}
-void json_version_dump(/*@out@*/char *reply, size_t replylen)
+void json_version_dump( /*@out@*/ char *reply, size_t replylen)
{
(void)snprintf(reply, replylen,
- "{\"class\":\"VERSION\",\"release\":\"%s\",\"rev\":\"%s\",\"proto_major\":%d,\"proto_minor\":%d}\r\n",
- VERSION, REVISION,
+ "{\"class\":\"VERSION\",\"release\":\"%s\",\"rev\":\"%s\",\"proto_major\":%d,\"proto_minor\":%d}\r\n",
+ VERSION, REVISION,
GPSD_PROTO_MAJOR_VERSION, GPSD_PROTO_MINOR_VERSION);
}
void json_tpv_dump(const struct gps_data_t *gpsdata,
- /*@out@*/char *reply, size_t replylen)
+ /*@out@*/ char *reply, size_t replylen)
{
assert(replylen > 2);
(void)strlcpy(reply, "{\"class\":\"TPV\",", replylen);
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
"\"tag\":\"%s\",",
- gpsdata->tag[0]!='\0' ? gpsdata->tag : "-");
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
- "\"device\":\"%s\",",
- gpsdata->dev.path);
- if (isnan(gpsdata->fix.time)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
- "\"time\":%.3f,",
- gpsdata->fix.time);
- if (isnan(gpsdata->fix.ept)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
- "\"ept\":%.3f,",
- gpsdata->fix.ept);
+ gpsdata->tag[0] != '\0' ? gpsdata->tag : "-");
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"device\":\"%s\",", gpsdata->dev.path);
+ if (isnan(gpsdata->fix.time) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"time\":%.3f,", gpsdata->fix.time);
+ if (isnan(gpsdata->fix.ept) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"ept\":%.3f,", gpsdata->fix.ept);
/*
* Suppressing TPV fields that would be invalid because the fix
* quality doesn't support them is nice for cutting down on the
@@ -136,119 +137,107 @@ void json_tpv_dump(const struct gps_data_t *gpsdata,
* chips, which are quite common.
*/
if (gpsdata->fix.mode >= MODE_2D) {
- if (isnan(gpsdata->fix.latitude)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
- "\"lat\":%.9f,",
- gpsdata->fix.latitude);
- if (isnan(gpsdata->fix.longitude)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
- "\"lon\":%.9f,",
- gpsdata->fix.longitude);
- if (gpsdata->fix.mode >= MODE_3D && isnan(gpsdata->fix.altitude)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
- "\"alt\":%.3f,",
- gpsdata->fix.altitude);
- if (isnan(gpsdata->fix.epx)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
- "\"epx\":%.3f,",
- gpsdata->fix.epx);
- if (isnan(gpsdata->fix.epy)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
- "\"epy\":%.3f,",
- gpsdata->fix.epy);
- if ((gpsdata->fix.mode >= MODE_3D) && isnan(gpsdata->fix.epv)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
- "\"epv\":%.3f,",
- gpsdata->fix.epv);
- if (isnan(gpsdata->fix.track)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
- "\"track\":%.4f,",
- gpsdata->fix.track);
- if (isnan(gpsdata->fix.speed)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
- "\"speed\":%.3f,",
- gpsdata->fix.speed);
- if ((gpsdata->fix.mode >= MODE_3D) && isnan(gpsdata->fix.climb)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
- "\"climb\":%.3f,",
- gpsdata->fix.climb);
- if (isnan(gpsdata->fix.epd)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
- "\"epd\":%.4f,",
- gpsdata->fix.epd);
- if (isnan(gpsdata->fix.eps)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
+ if (isnan(gpsdata->fix.latitude) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"lat\":%.9f,", gpsdata->fix.latitude);
+ if (isnan(gpsdata->fix.longitude) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"lon\":%.9f,", gpsdata->fix.longitude);
+ if (gpsdata->fix.mode >= MODE_3D && isnan(gpsdata->fix.altitude) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"alt\":%.3f,", gpsdata->fix.altitude);
+ if (isnan(gpsdata->fix.epx) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"epx\":%.3f,", gpsdata->fix.epx);
+ if (isnan(gpsdata->fix.epy) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"epy\":%.3f,", gpsdata->fix.epy);
+ if ((gpsdata->fix.mode >= MODE_3D) && isnan(gpsdata->fix.epv) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"epv\":%.3f,", gpsdata->fix.epv);
+ if (isnan(gpsdata->fix.track) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"track\":%.4f,", gpsdata->fix.track);
+ if (isnan(gpsdata->fix.speed) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"speed\":%.3f,", gpsdata->fix.speed);
+ if ((gpsdata->fix.mode >= MODE_3D) && isnan(gpsdata->fix.climb) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"climb\":%.3f,", gpsdata->fix.climb);
+ if (isnan(gpsdata->fix.epd) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"epd\":%.4f,", gpsdata->fix.epd);
+ if (isnan(gpsdata->fix.eps) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
"\"eps\":%.2f,", gpsdata->fix.eps);
- if ((gpsdata->fix.mode >= MODE_3D) && isnan(gpsdata->fix.epc)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
+ if ((gpsdata->fix.mode >= MODE_3D) && isnan(gpsdata->fix.epc) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
"\"epc\":%.2f,", gpsdata->fix.epc);
}
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
"\"mode\":%d,", gpsdata->fix.mode);
- if (reply[strlen(reply)-1] == ',')
- reply[strlen(reply)-1] = '\0'; /* trim trailing comma */
- (void)strlcat(reply, "}\r\n", sizeof(reply)-strlen(reply));
+ if (reply[strlen(reply) - 1] == ',')
+ reply[strlen(reply) - 1] = '\0'; /* trim trailing comma */
+ (void)strlcat(reply, "}\r\n", sizeof(reply) - strlen(reply));
}
-void json_sky_dump(const struct gps_data_t *datap,
- /*@out@*/char *reply, size_t replylen)
+void json_sky_dump(const struct gps_data_t *datap,
+ /*@out@*/ char *reply, size_t replylen)
{
int i, j, used, reported = 0;
assert(replylen > 2);
(void)strlcpy(reply, "{\"class\":\"SKY\",", replylen);
- (void)snprintf(reply+strlen(reply),
- replylen- strlen(reply),
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
"\"tag\":\"%s\",",
- datap->tag[0]!='\0' ? datap->tag : "-");
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
- "\"device\":\"%s\",",
- datap->dev.path);
- if (isnan(datap->skyview_time)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
- "\"time\":%.3f,",
- datap->skyview_time);
- if (isnan(datap->dop.xdop)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
+ datap->tag[0] != '\0' ? datap->tag : "-");
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"device\":\"%s\",", datap->dev.path);
+ if (isnan(datap->skyview_time) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"time\":%.3f,", datap->skyview_time);
+ if (isnan(datap->dop.xdop) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
"\"xdop\":%.2f,", datap->dop.xdop);
- if (isnan(datap->dop.ydop)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
+ if (isnan(datap->dop.ydop) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
"\"ydop\":%.2f,", datap->dop.ydop);
- if (isnan(datap->dop.vdop)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
+ if (isnan(datap->dop.vdop) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
"\"vdop\":%.2f,", datap->dop.vdop);
- if (isnan(datap->dop.tdop)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
+ if (isnan(datap->dop.tdop) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
"\"tdop\":%.2f,", datap->dop.tdop);
- if (isnan(datap->dop.hdop)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
+ if (isnan(datap->dop.hdop) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
"\"hdop\":%.2f,", datap->dop.hdop);
- if (isnan(datap->dop.gdop)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
+ if (isnan(datap->dop.gdop) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
"\"gdop\":%.2f,", datap->dop.gdop);
- if (isnan(datap->dop.pdop)==0)
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
+ if (isnan(datap->dop.pdop) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
"\"pdop\":%.2f,", datap->dop.pdop);
/* insurance against flaky drivers */
for (i = 0; i < datap->satellites_visible; i++)
@@ -264,65 +253,65 @@ void json_sky_dump(const struct gps_data_t *datap,
break;
}
if (datap->PRN[i]) {
- (void)snprintf(reply+strlen(reply),
- replylen-strlen(reply),
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
"{\"PRN\":%d,\"el\":%d,\"az\":%d,\"ss\":%.0f,\"used\":%s},",
datap->PRN[i],
- datap->elevation[i],datap->azimuth[i],
- datap->ss[i],
- used ? "true" : "false");
+ datap->elevation[i], datap->azimuth[i],
+ datap->ss[i], used ? "true" : "false");
}
}
- if (reply[strlen(reply)-1] == ',')
- reply[strlen(reply)-1] = '\0'; /* trim trailing comma */
- (void)strlcat(reply, "]", replylen-strlen(reply));
}
- if (reply[strlen(reply)-1] == ',')
- reply[strlen(reply)-1] = '\0'; /* trim trailing comma */
- (void)strlcat(reply, "}\r\n", replylen-strlen(reply));
+ if (reported) {
+ if (reply[strlen(reply) - 1] == ',')
+ reply[strlen(reply) - 1] = '\0'; /* trim trailing comma */
+ (void)strlcat(reply, "]", replylen - strlen(reply));
+ }
+ if (reply[strlen(reply) - 1] == ',')
+ reply[strlen(reply) - 1] = '\0'; /* trim trailing comma */
+ (void)strlcat(reply, "}\r\n", replylen - strlen(reply));
if (datap->satellites_visible != reported)
- gpsd_report(LOG_WARN,"Satellite count %d != PRN count %d\n",
+ gpsd_report(LOG_WARN, "Satellite count %d != PRN count %d\n",
datap->satellites_visible, reported);
}
void json_device_dump(const struct gps_device_t *device,
- /*@out@*/char *reply, size_t replylen)
+ /*@out@*/ char *reply, size_t replylen)
{
- char buf1[JSON_VAL_MAX*2+1];
+ char buf1[JSON_VAL_MAX * 2 + 1];
struct classmap_t *cmp;
(void)strlcpy(reply, "{\"class\":\"DEVICE\",\"path\":\"", replylen);
(void)strlcat(reply, device->gpsdata.dev.path, replylen);
(void)strlcat(reply, "\",", replylen);
if (device->gpsdata.online > 0) {
- (void)snprintf(reply+strlen(reply), replylen-strlen(reply),
+ (void)snprintf(reply + strlen(reply), replylen - strlen(reply),
"\"activated\":%2.2f,", device->gpsdata.online);
if (device->observed != 0) {
int mask = 0;
- for (cmp = classmap; cmp < classmap+NITEMS(classmap); cmp++)
- if ((device->observed & cmp->packetmask) != 0)
+ for (cmp = classmap; cmp < classmap + NITEMS(classmap); cmp++)
+ if ((device->observed & cmp->packetmask) != 0)
mask |= cmp->typemask;
if (mask != 0)
- (void)snprintf(reply+strlen(reply), replylen-strlen(reply),
- "\"flags\":%d,", mask);
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply), "\"flags\":%d,",
+ mask);
}
if (device->device_type != NULL) {
(void)strlcat(reply, "\"driver\":\"", replylen);
- (void)strlcat(reply,
- device->device_type->type_name,
- replylen);
+ (void)strlcat(reply, device->device_type->type_name, replylen);
(void)strlcat(reply, "\",", replylen);
}
/*@-mustfreefresh@*/
if (device->subtype[0] != '\0') {
(void)strlcat(reply, "\"subtype\":\"", replylen);
- (void)strlcat(reply,
+ (void)strlcat(reply,
json_stringify(buf1, sizeof(buf1), device->subtype),
replylen);
(void)strlcat(reply, "\",", replylen);
}
/*@+mustfreefresh@*/
if (device->is_serial) {
- (void)snprintf(reply+strlen(reply), replylen-strlen(reply),
+ (void)snprintf(reply + strlen(reply), replylen - strlen(reply),
"\"native\":%d,\"bps\":%d,\"parity\":\"%c\",\"stopbits\":%u,\"cycle\":%2.2f",
device->gpsdata.dev.driver_mode,
(int)gpsd_get_speed(&device->ttyset),
@@ -330,20 +319,22 @@ void json_device_dump(const struct gps_device_t *device,
device->gpsdata.dev.stopbits,
device->gpsdata.dev.cycle);
#ifdef ALLOW_RECONFIGURE
- if (device->device_type != NULL && device->device_type->rate_switcher != NULL)
- (void)snprintf(reply+strlen(reply), replylen-strlen(reply),
+ if (device->device_type != NULL
+ && device->device_type->rate_switcher != NULL)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
",\"mincycle\":%2.2f",
device->device_type->min_cycle);
#endif /* ALLOW_RECONFIGURE */
}
}
- if (reply[strlen(reply)-1] == ',')
- reply[strlen(reply)-1] = '\0'; /* trim trailing comma */
+ if (reply[strlen(reply) - 1] == ',')
+ reply[strlen(reply) - 1] = '\0'; /* trim trailing comma */
(void)strlcat(reply, "}\r\n", replylen);
}
-void json_watch_dump(const struct policy_t *ccp,
- /*@out@*/char *reply, size_t replylen)
+void json_watch_dump(const struct policy_t *ccp,
+ /*@out@*/ char *reply, size_t replylen)
{
/*@-compdef@*/
(void)snprintf(reply, replylen,
@@ -351,40 +342,38 @@ void json_watch_dump(const struct policy_t *ccp,
ccp->watcher ? "true" : "false",
ccp->json ? "true" : "false",
ccp->nmea ? "true" : "false",
- ccp->raw,
+ ccp->raw,
ccp->scaled ? "true" : "false",
ccp->timing ? "true" : "false");
if (ccp->devpath[0] != '\0')
- (void)snprintf(reply+strlen(reply), replylen-strlen(reply),
+ (void)snprintf(reply + strlen(reply), replylen - strlen(reply),
"\"device\":%s,", ccp->devpath);
- if (reply[strlen(reply)-1] == ',')
- reply[strlen(reply)-1] = '\0';
- (void)strlcat(reply, "}\r\n", replylen-strlen(reply));
+ if (reply[strlen(reply) - 1] == ',')
+ reply[strlen(reply) - 1] = '\0';
+ (void)strlcat(reply, "}\r\n", replylen - strlen(reply));
/*@+compdef@*/
}
#if defined(RTCM104V2_ENABLE)
-void rtcm2_json_dump(const struct rtcm2_t *rtcm, /*@out@*/char buf[], size_t buflen)
+void rtcm2_json_dump(const struct rtcm2_t *rtcm, /*@out@*/ char buf[],
+ size_t buflen)
/* dump the contents of a parsed RTCM104 message as JSON */
{
/*@-mustfreefresh@*/
- char buf1[JSON_VAL_MAX*2+1];
+ char buf1[JSON_VAL_MAX * 2 + 1];
/*
* Beware! Needs to stay synchronized with a JSON enumeration map in
* the parser. This interpretation of NAVSYSTEM_GALILEO is assumed
* from RTCM3, it's not actually documented in RTCM 2.1.
*/
- static char *navsysnames[] = {"GPS", "GLONASS", "GALILEO"};
+ static char *navsysnames[] = { "GPS", "GLONASS", "GALILEO" };
unsigned int n;
- (void)snprintf(buf, buflen, "{\"class\":\"RTCM2\",\"type\":%u,\"station_id\":%u,\"zcount\":%0.1f,\"seqnum\":%u,\"length\":%u,\"station_health\":%u,",
- rtcm->type,
- rtcm->refstaid,
- rtcm->zcount,
- rtcm->seqnum,
- rtcm->length,
- rtcm->stathlth);
+ (void)snprintf(buf, buflen,
+ "{\"class\":\"RTCM2\",\"type\":%u,\"station_id\":%u,\"zcount\":%0.1f,\"seqnum\":%u,\"length\":%u,\"station_health\":%u,",
+ rtcm->type, rtcm->refstaid, rtcm->zcount, rtcm->seqnum,
+ rtcm->length, rtcm->stathlth);
switch (rtcm->type) {
case 1:
@@ -396,12 +385,10 @@ void rtcm2_json_dump(const struct rtcm2_t *rtcm, /*@out@*/char buf[], size_t buf
"{\"ident\":%u,\"udre\":%u,\"issuedata\":%u,\"rangerr\":%0.3f,\"rangerate\":%0.3f},",
rsp->ident,
rsp->udre,
- rsp->issuedata,
- rsp->rangerr,
- rsp->rangerate);
+ rsp->issuedata, rsp->rangerr, rsp->rangerate);
}
- if (buf[strlen(buf)-1] == ',')
- buf[strlen(buf)-1] = '\0';
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
(void)strlcat(buf, "]", buflen);
break;
@@ -409,49 +396,45 @@ void rtcm2_json_dump(const struct rtcm2_t *rtcm, /*@out@*/char buf[], size_t buf
if (rtcm->ecef.valid)
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"x\":%.2f,\"y\":%.2f,\"z\":%.2f,",
- rtcm->ecef.x,
- rtcm->ecef.y,
- rtcm->ecef.z);
+ rtcm->ecef.x, rtcm->ecef.y, rtcm->ecef.z);
break;
case 4:
if (rtcm->reference.valid) {
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"system\":\"%s\",\"sense\":%1d,\"datum\":\"%s\",\"dx\":%.1f,\"dy\":%.1f,\"dz\":%.1f,",
- rtcm->reference.system >= NITEMS(navsysnames)
+ rtcm->reference.system >= NITEMS(navsysnames)
? "UNKNOWN"
: navsysnames[rtcm->reference.system],
rtcm->reference.sense,
rtcm->reference.datum,
rtcm->reference.dx,
- rtcm->reference.dy,
- rtcm->reference.dz);
+ rtcm->reference.dy, rtcm->reference.dz);
}
break;
case 5:
#define JSON_BOOL(x) ((x)?"true":"false")
(void)strlcat(buf, "\"satellites\":[", buflen);
- for (n = 0; n < rtcm->conhealth.nentries; n++) {
- const struct consat_t *csp = &rtcm->conhealth.sat[n];
- (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "{\"ident\":%u,\"iodl\":%s,\"health\":%1u,\"snr\":%d,\"health_en\":%s,\"new_data\":%s,\"los_warning\":%s,\"tou\":%u},",
- csp->ident,
- JSON_BOOL(csp->iodl),
- (unsigned)csp->health,
- csp->snr,
- JSON_BOOL(csp->health_en),
- JSON_BOOL(csp->new_data),
- JSON_BOOL(csp->los_warning),
- csp->tou);
- }
+ for (n = 0; n < rtcm->conhealth.nentries; n++) {
+ const struct consat_t *csp = &rtcm->conhealth.sat[n];
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "{\"ident\":%u,\"iodl\":%s,\"health\":%1u,\"snr\":%d,\"health_en\":%s,\"new_data\":%s,\"los_warning\":%s,\"tou\":%u},",
+ csp->ident,
+ JSON_BOOL(csp->iodl),
+ (unsigned)csp->health,
+ csp->snr,
+ JSON_BOOL(csp->health_en),
+ JSON_BOOL(csp->new_data),
+ JSON_BOOL(csp->los_warning), csp->tou);
+ }
#undef JSON_BOOL
- if (buf[strlen(buf)-1] == ',')
- buf[strlen(buf)-1] = '\0';
- (void)strlcat(buf, "]", buflen);
- break;
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
+ (void)strlcat(buf, "]", buflen);
+ break;
- case 6: /* NOP msg */
+ case 6: /* NOP msg */
break;
case 7:
@@ -464,17 +447,17 @@ void rtcm2_json_dump(const struct rtcm2_t *rtcm, /*@out@*/char buf[], size_t buf
ssp->longitude,
ssp->range,
ssp->frequency,
- ssp->health,
- ssp->station_id,
- ssp->bitrate);
+ ssp->health, ssp->station_id, ssp->bitrate);
}
- if (buf[strlen(buf)-1] == ',')
- buf[strlen(buf)-1] = '\0';
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
(void)strlcat(buf, "]", buflen);
break;
case 16:
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "\"message\":\"%s\"", json_stringify(buf1, sizeof(buf1), rtcm->message));
+ "\"message\":\"%s\"", json_stringify(buf1,
+ sizeof(buf1),
+ rtcm->message));
break;
default:
@@ -482,14 +465,14 @@ void rtcm2_json_dump(const struct rtcm2_t *rtcm, /*@out@*/char buf[], size_t buf
for (n = 0; n < rtcm->length; n++)
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"0x%08x\",", rtcm->words[n]);
- if (buf[strlen(buf)-1] == ',')
- buf[strlen(buf)-1] = '\0';
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
(void)strlcat(buf, "]", buflen);
break;
}
- if (buf[strlen(buf)-1] == ',')
- buf[strlen(buf)-1] = '\0';
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
(void)strlcat(buf, "}\r\n", buflen);
/*@+mustfreefresh@*/
}
@@ -497,11 +480,12 @@ void rtcm2_json_dump(const struct rtcm2_t *rtcm, /*@out@*/char buf[], size_t buf
#if defined(AIVDM_ENABLE)
-void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, size_t buflen)
+void aivdm_json_dump(const struct ais_t *ais, bool scaled,
+ /*@out@*/ char *buf, size_t buflen)
{
- char buf1[JSON_VAL_MAX*2+1];
- char buf2[JSON_VAL_MAX*2+1];
- char buf3[JSON_VAL_MAX*2+1];
+ char buf1[JSON_VAL_MAX * 2 + 1];
+ char buf2[JSON_VAL_MAX * 2 + 1];
+ char buf3[JSON_VAL_MAX * 2 + 1];
static char *nav_legends[] = {
"Under way using engine",
@@ -697,13 +681,13 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
#define NAVAIDTYPE_DISPLAY(n) (((n) < (unsigned int)NITEMS(navaid_type_legends[0])) ? navaid_type_legends[n] : "INVALID NAVAID TYPE")
#define JSON_BOOL(x) ((x)?"true":"false")
- (void)snprintf(buf, buflen,
+ (void)snprintf(buf, buflen,
"{\"class\":\"AIS\",\"type\":%u,\"repeat\":%u,"
- "\"mmsi\":%u,\"scaled\":%s,",
+ "\"mmsi\":%u,\"scaled\":%s,",
ais->type, ais->repeat, ais->mmsi, JSON_BOOL(scaled));
/*@ -formatcode -mustfreefresh @*/
switch (ais->type) {
- case 1: /* Position Report */
+ case 1: /* Position Report */
case 2:
case 3:
if (scaled) {
@@ -715,11 +699,12 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
* "fastleft"/"fastright" for fast turns.
*/
if (ais->type1.turn == -128)
- (void) strlcpy(turnlegend, "\"nan\"", sizeof(turnlegend));
+ (void)strlcpy(turnlegend, "\"nan\"", sizeof(turnlegend));
else if (ais->type1.turn == -127)
- (void) strlcpy(turnlegend, "\"fastleft\"", sizeof(turnlegend));
+ (void)strlcpy(turnlegend, "\"fastleft\"", sizeof(turnlegend));
else if (ais->type1.turn == 127)
- (void) strlcpy(turnlegend, "\"fastright\"", sizeof(turnlegend));
+ (void)strlcpy(turnlegend, "\"fastright\"",
+ sizeof(turnlegend));
else
(void)snprintf(turnlegend, sizeof(turnlegend),
"%.0f",
@@ -730,14 +715,14 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
* "fast" for fast movers.
*/
if (ais->type1.speed == AIS_SPEED_NOT_AVAILABLE)
- (void) strlcpy(speedlegend, "\"nan\"", sizeof(speedlegend));
+ (void)strlcpy(speedlegend, "\"nan\"", sizeof(speedlegend));
else if (ais->type1.speed == AIS_SPEED_FAST_MOVER)
- (void) strlcpy(speedlegend, "\"fast\"", sizeof(speedlegend));
+ (void)strlcpy(speedlegend, "\"fast\"", sizeof(speedlegend));
else
(void)snprintf(speedlegend, sizeof(speedlegend),
"%.1f", ais->type1.speed / 10.0);
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"status\":\"%s\",\"turn\":%s,\"speed\":%s,"
"\"accuracy\":%s,\"lon\":%.4f,\"lat\":%.4f,"
"\"course\":%u,\"heading\":%u,\"second\":%u,"
@@ -752,10 +737,9 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
ais->type1.heading,
ais->type1.second,
ais->type1.maneuver,
- JSON_BOOL(ais->type1.raim),
- ais->type1.radio);
+ JSON_BOOL(ais->type1.raim), ais->type1.radio);
} else {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"status\":%u,\"turn\":%d,\"speed\":%u,"
"\"accuracy\":%s,\"lon\":%d,\"lat\":%d,"
"\"course\":%u,\"heading\":%u,\"second\":%u,"
@@ -770,14 +754,13 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
ais->type1.heading,
ais->type1.second,
ais->type1.maneuver,
- JSON_BOOL(ais->type1.raim),
- ais->type1.radio);
+ JSON_BOOL(ais->type1.raim), ais->type1.radio);
}
break;
- case 4: /* Base Station Report */
- case 11: /* UTC/Date Response */
+ case 4: /* Base Station Report */
+ case 11: /* UTC/Date Response */
if (scaled) {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"timestamp\":\"%4u:%02u:%02uT%02u:%02u:%02uZ\","
"\"accuracy\":%s,\"lon\":%.4f,\"lat\":%.4f,"
"\"epfd\":\"%s\",\"raim\":%s,\"radio\":%u}\r\n",
@@ -791,10 +774,9 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
ais->type4.lon / AIS_LATLON_SCALE,
ais->type4.lat / AIS_LATLON_SCALE,
epfd_legends[ais->type4.epfd],
- JSON_BOOL(ais->type4.raim),
- ais->type4.radio);
+ JSON_BOOL(ais->type4.raim), ais->type4.radio);
} else {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"timestamp\":\"%04u-%02u-%02uT%02u:%02u:%02uZ\","
"\"accuracy\":%s,\"lon\":%d,\"lat\":%d,"
"\"epfd\":%u,\"raim\":%s,\"radio\":%u}\r\n",
@@ -808,13 +790,13 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
ais->type4.lon,
ais->type4.lat,
ais->type4.epfd,
- JSON_BOOL(ais->type4.raim),
- ais->type4.radio);
+ JSON_BOOL(ais->type4.raim), ais->type4.radio);
}
break;
- case 5: /* Ship static and voyage related data */
+ case 5: /* Ship static and voyage related data */
if (scaled) {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ /* *INDENT-OFF* */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"imo\":%u,\"ais_version\":%u,\"callsign\":\"%s\","
"\"shipname\":\"%s\",\"shiptype\":\"%s\","
"\"to_bow\":%u,\"to_stern\":%u,\"to_port\":%u,"
@@ -824,23 +806,22 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
"\"dte\":%u}\r\n",
ais->type5.imo,
ais->type5.ais_version,
- json_stringify(buf1, sizeof(buf1), ais->type5.callsign),
- json_stringify(buf2, sizeof(buf2), ais->type5.shipname),
+ json_stringify(buf1, sizeof(buf1),
+ ais->type5.callsign),
+ json_stringify(buf2, sizeof(buf2),
+ ais->type5.shipname),
SHIPTYPE_DISPLAY(ais->type5.shiptype),
- ais->type5.to_bow,
- ais->type5.to_stern,
- ais->type5.to_port,
- ais->type5.to_starboard,
- epfd_legends[ais->type5.epfd],
- ais->type5.month,
- ais->type5.day,
- ais->type5.hour,
- ais->type5.minute,
- ais->type5.draught / 10.0,
- json_stringify(buf3, sizeof(buf3), ais->type5.destination),
+ ais->type5.to_bow, ais->type5.to_stern,
+ ais->type5.to_port, ais->type5.to_starboard,
+ epfd_legends[ais->type5.epfd], ais->type5.month,
+ ais->type5.day, ais->type5.hour, ais->type5.minute,
+ ais->type5.draught / 10.0,
+ json_stringify(buf3, sizeof(buf3),
+ ais->type5.destination),
ais->type5.dte);
+ /* *INDENT-ON* */
} else {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"imo\":%u,\"ais_version\":%u,\"callsign\":\"%s\","
"\"shipname\":\"%s\",\"shiptype\":%u,"
"\"to_bow\":%u,\"to_stern\":%u,\"to_port\":%u,"
@@ -850,25 +831,22 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
"\"dte\":%u}\r\n",
ais->type5.imo,
ais->type5.ais_version,
- json_stringify(buf1, sizeof(buf1), ais->type5.callsign),
- json_stringify(buf2, sizeof(buf2), ais->type5.shipname),
- ais->type5.shiptype,
- ais->type5.to_bow,
- ais->type5.to_stern,
- ais->type5.to_port,
- ais->type5.to_starboard,
- ais->type5.epfd,
- ais->type5.month,
- ais->type5.day,
- ais->type5.hour,
- ais->type5.minute,
- ais->type5.draught,
- json_stringify(buf3, sizeof(buf3), ais->type5.destination),
+ json_stringify(buf1, sizeof(buf1),
+ ais->type5.callsign),
+ json_stringify(buf2, sizeof(buf2),
+ ais->type5.shipname),
+ ais->type5.shiptype, ais->type5.to_bow,
+ ais->type5.to_stern, ais->type5.to_port,
+ ais->type5.to_starboard, ais->type5.epfd,
+ ais->type5.month, ais->type5.day, ais->type5.hour,
+ ais->type5.minute, ais->type5.draught,
+ json_stringify(buf3, sizeof(buf3),
+ ais->type5.destination),
ais->type5.dte);
}
break;
- case 6: /* Binary Message */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 6: /* Binary Message */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"seqno\":%u,\"dest_mmsi\":%u,"
"\"retransmit\":%s,\"app_id\":%u,"
"\"data\":\"%zd:%s\"}\r\n",
@@ -878,26 +856,24 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
ais->type6.app_id,
ais->type6.bitcount,
gpsd_hexdump(ais->type6.bitdata,
- (ais->type6.bitcount+7)/8));
+ (ais->type6.bitcount + 7) / 8));
break;
- case 7: /* Binary Acknowledge */
- case 13: /* Safety Related Acknowledge */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
- "\"mmsi1\":%u,\"mmsi2\":%u,\"mmsi3\":%u,\"mmsi4\":%u}\r\n",
+ case 7: /* Binary Acknowledge */
+ case 13: /* Safety Related Acknowledge */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"mmsi1\":%u,\"mmsi2\":%u,\"mmsi3\":%u,\"mmsi4\":%u}\r\n",
ais->type7.mmsi1,
- ais->type7.mmsi2,
- ais->type7.mmsi3,
- ais->type7.mmsi4);
+ ais->type7.mmsi2, ais->type7.mmsi3, ais->type7.mmsi4);
break;
- case 8: /* Binary Broadcast Message */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
- "\"app_id\":%u,\"data\":\"%zd:%s\"}\r\n",
- ais->type8.app_id,
- ais->type8.bitcount,
- gpsd_hexdump(ais->type8.bitdata,
- (ais->type8.bitcount+7)/8));
+ case 8: /* Binary Broadcast Message */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"app_id\":%u,\"data\":\"%zd:%s\"}\r\n",
+ ais->type8.app_id,
+ ais->type8.bitcount,
+ gpsd_hexdump(ais->type8.bitdata,
+ (ais->type8.bitcount + 7) / 8));
break;
- case 9: /* Standard SAR Aircraft Position Report */
+ case 9: /* Standard SAR Aircraft Position Report */
if (scaled) {
char altlegend[20];
char speedlegend[20];
@@ -907,9 +883,9 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
* "high" for above the reporting ceiling.
*/
if (ais->type9.alt == AIS_ALT_NOT_AVAILABLE)
- (void) strlcpy(altlegend, "\"nan\"", sizeof(altlegend));
+ (void)strlcpy(altlegend, "\"nan\"", sizeof(altlegend));
else if (ais->type9.alt == AIS_ALT_HIGH)
- (void) strlcpy(altlegend, "\"high\"", sizeof(altlegend));
+ (void)strlcpy(altlegend, "\"high\"", sizeof(altlegend));
else
(void)snprintf(altlegend, sizeof(altlegend),
"%.1f", ais->type9.alt / 10.0);
@@ -919,14 +895,14 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
* "high" for above the reporting ceiling.
*/
if (ais->type9.speed == AIS_SAR_SPEED_NOT_AVAILABLE)
- (void) strlcpy(speedlegend, "\"nan\"", sizeof(speedlegend));
+ (void)strlcpy(speedlegend, "\"nan\"", sizeof(speedlegend));
else if (ais->type9.speed == AIS_SAR_FAST_MOVER)
- (void) strlcpy(speedlegend, "\"fast\"", sizeof(speedlegend));
+ (void)strlcpy(speedlegend, "\"fast\"", sizeof(speedlegend));
else
(void)snprintf(speedlegend, sizeof(speedlegend),
"%.1f", ais->type1.speed / 10.0);
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"alt\":%s,\"speed\":%s,\"accuracy\":%s,"
"\"lon\":%.4f,\"lat\":%.4f,\"course\":%.1f,"
"\"second\":%u,\"regional\":%u,\"dte\":%u,"
@@ -940,10 +916,9 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
ais->type9.second,
ais->type9.regional,
ais->type9.dte,
- JSON_BOOL(ais->type9.raim),
- ais->type9.radio);
+ JSON_BOOL(ais->type9.raim), ais->type9.radio);
} else {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"alt\":%u,\"speed\":%u,\"accuracy\":%s,"
"\"lon\":%d,\"lat\":%d,\"course\":%u,"
"\"second\":%u,\"regional\":%u,\"dte\":%u,"
@@ -957,75 +932,71 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
ais->type9.second,
ais->type9.regional,
ais->type9.dte,
- JSON_BOOL(ais->type9.raim),
- ais->type9.radio);
+ JSON_BOOL(ais->type9.raim), ais->type9.radio);
}
break;
- case 10: /* UTC/Date Inquiry */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
- "\"dest_mmsi\":%u}\r\n",
- ais->type10.dest_mmsi);
+ case 10: /* UTC/Date Inquiry */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"dest_mmsi\":%u}\r\n", ais->type10.dest_mmsi);
break;
- case 12: /* Safety Related Message */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
- "\"seqno\":%u,\"dest_mmsi\":%u,\"retransmit\":%s,\"text\":\"%s\"}\r\n",
- ais->type12.seqno,
- ais->type12.dest_mmsi,
- JSON_BOOL(ais->type12.retransmit),
- json_stringify(buf1, sizeof(buf1), ais->type12.text));
+ case 12: /* Safety Related Message */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"seqno\":%u,\"dest_mmsi\":%u,\"retransmit\":%s,\"text\":\"%s\"}\r\n",
+ ais->type12.seqno,
+ ais->type12.dest_mmsi,
+ JSON_BOOL(ais->type12.retransmit),
+ json_stringify(buf1, sizeof(buf1), ais->type12.text));
break;
- case 14: /* Safety Related Broadcast Message */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 14: /* Safety Related Broadcast Message */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"text\":\"%s\"}\r\n",
json_stringify(buf1, sizeof(buf1), ais->type14.text));
break;
- case 15: /* Interrogation */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 15: /* Interrogation */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"mmsi1\":%u,\"type1_1\":%u,\"offset1_1\":%u,"
"\"type1_2\":%u,\"offset1_2\":%u,\"mmsi2\":%u,"
"\"type2_1\":%u,\"offset2_1\":%u}\r\n",
- ais->type15.mmsi1,
- ais->type15.type1_1,
- ais->type15.offset1_1,
- ais->type15.type1_2,
- ais->type15.offset1_2,
- ais->type15.mmsi2,
- ais->type15.type2_1,
- ais->type15.offset2_1);
+ ais->type15.mmsi1,
+ ais->type15.type1_1,
+ ais->type15.offset1_1,
+ ais->type15.type1_2,
+ ais->type15.offset1_2,
+ ais->type15.mmsi2,
+ ais->type15.type2_1, ais->type15.offset2_1);
break;
case 16:
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"mmsi1\":%u,\"offset1\":%u,\"increment1\":%u,"
"\"mmsi2\":%u,\"offset2\":%u,\"increment2\":%u}\r\n",
ais->type16.mmsi1,
ais->type16.offset1,
ais->type16.increment1,
ais->type16.mmsi2,
- ais->type16.offset2,
- ais->type16.increment2);
+ ais->type16.offset2, ais->type16.increment2);
break;
case 17:
if (scaled) {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"lon\":%.1f,\"lat\":%.1f,\"data\":\"%zd:%s\"}\r\n",
- ais->type17.lon / AIS_GNSS_LATLON_SCALE,
- ais->type17.lat / AIS_GNSS_LATLON_SCALE,
- ais->type17.bitcount,
- gpsd_hexdump(ais->type17.bitdata,
- (ais->type17.bitcount+7)/8));
+ ais->type17.lon / AIS_GNSS_LATLON_SCALE,
+ ais->type17.lat / AIS_GNSS_LATLON_SCALE,
+ ais->type17.bitcount,
+ gpsd_hexdump(ais->type17.bitdata,
+ (ais->type17.bitcount + 7) / 8));
} else {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"lon\":%d,\"lat\":%d,\"data\":\"%zd:%s\"}\r\n",
- ais->type17.lon,
- ais->type17.lat,
- ais->type17.bitcount,
- gpsd_hexdump(ais->type17.bitdata,
- (ais->type17.bitcount+7)/8));
+ ais->type17.lon,
+ ais->type17.lat,
+ ais->type17.bitcount,
+ gpsd_hexdump(ais->type17.bitdata,
+ (ais->type17.bitcount + 7) / 8));
}
break;
case 18:
if (scaled) {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"reserved\":%u,\"speed\":%.1f,\"accuracy\":%s,"
"\"lon\":%.4f,\"lat\":%.4f,\"course\":%.1f,"
"\"heading\":%u,\"second\":%u,\"regional\":%u,"
@@ -1045,10 +1016,9 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
JSON_BOOL(ais->type18.dsc),
JSON_BOOL(ais->type18.band),
JSON_BOOL(ais->type18.msg22),
- JSON_BOOL(ais->type18.raim),
- ais->type18.radio);
+ JSON_BOOL(ais->type18.raim), ais->type18.radio);
} else {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"reserved\":%u,\"speed\":%u,\"accuracy\":%s,"
"\"lon\":%d,\"lat\":%d,\"course\":%u,"
"\"heading\":%u,\"second\":%u,\"regional\":%u,"
@@ -1068,13 +1038,12 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
JSON_BOOL(ais->type18.dsc),
JSON_BOOL(ais->type18.band),
JSON_BOOL(ais->type18.msg22),
- JSON_BOOL(ais->type18.raim),
- ais->type18.radio);
+ JSON_BOOL(ais->type18.raim), ais->type18.radio);
}
break;
case 19:
if (scaled) {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"reserved\":%u,\"speed\":%.1f,\"accuracy\":%s,"
"\"lon\":%.4f,\"lat\":%.4f,\"course\":%.1f,"
"\"heading\":%u,\"second\":%u,\"regional\":%u,"
@@ -1099,10 +1068,9 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
ais->type19.to_starboard,
epfd_legends[ais->type19.epfd],
JSON_BOOL(ais->type19.raim),
- ais->type19.dte,
- JSON_BOOL(ais->type19.assigned));
+ ais->type19.dte, JSON_BOOL(ais->type19.assigned));
} else {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"reserved\":%u,\"speed\":%u,\"accuracy\":%s,"
"\"lon\":%d,\"lat\":%d,\"course\":%u,"
"\"heading\":%u,\"second\":%u,\"regional\":%u,"
@@ -1127,12 +1095,11 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
ais->type19.to_starboard,
ais->type19.epfd,
JSON_BOOL(ais->type19.raim),
- ais->type19.dte,
- JSON_BOOL(ais->type19.assigned));
+ ais->type19.dte, JSON_BOOL(ais->type19.assigned));
}
break;
- case 20: /* Data Link Management Message */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 20: /* Data Link Management Message */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"offset1\":%u,\"number1\":%u,"
"\"timeout1\":%u,\"increment1\":%u,"
"\"offset2\":%u,\"number2\":%u,"
@@ -1155,12 +1122,11 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
ais->type20.increment3,
ais->type20.offset4,
ais->type20.number4,
- ais->type20.timeout4,
- ais->type20.increment4);
+ ais->type20.timeout4, ais->type20.increment4);
break;
- case 21: /* Aid to Navigation */
+ case 21: /* Aid to Navigation */
if (scaled) {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"aid_type\":\"%s\",\"name\":\"%s\",\"lon\":%.4f,"
"\"lat\":%.4f,\"accuracy\":%s,\"to_bow\":%u,"
"\"to_stern\":%u,\"to_port\":%u,"
@@ -1169,22 +1135,20 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
"\"off_position\":%s,\"raim\":%s,"
"\"virtual_aid\":%s}\r\n",
NAVAIDTYPE_DISPLAY(ais->type21.aid_type),
- json_stringify(buf1, sizeof(buf1), ais->type21.name),
+ json_stringify(buf1, sizeof(buf1),
+ ais->type21.name),
ais->type21.lon / AIS_LATLON_SCALE,
ais->type21.lat / AIS_LATLON_SCALE,
JSON_BOOL(ais->type21.accuracy),
- ais->type21.to_bow,
- ais->type21.to_stern,
- ais->type21.to_port,
- ais->type21.to_starboard,
- epfd_legends[ais->type21.epfd],
- ais->type21.second,
+ ais->type21.to_bow, ais->type21.to_stern,
+ ais->type21.to_port, ais->type21.to_starboard,
+ epfd_legends[ais->type21.epfd], ais->type21.second,
ais->type21.regional,
JSON_BOOL(ais->type21.off_position),
JSON_BOOL(ais->type21.raim),
JSON_BOOL(ais->type21.virtual_aid));
} else {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"aid_type\":%u,\"name\":\"%s\",\"accuracy\":%s,"
"\"lon\":%d,\"lat\":%d,\"to_bow\":%u,"
"\"to_stern\":%u,\"to_port\":%u,\"to_starboard\":%u,"
@@ -1208,46 +1172,44 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
JSON_BOOL(ais->type21.virtual_aid));
}
break;
- case 22: /* Channel Management */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 22: /* Channel Management */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"channel_a\":%u,\"channel_b\":%u,"
"\"txrx\":%u,\"power\":%s,",
ais->type22.channel_a,
ais->type22.channel_b,
- ais->type22.txrx,
- JSON_BOOL(ais->type22.power));
+ ais->type22.txrx, JSON_BOOL(ais->type22.power));
if (ais->type22.addressed) {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"dest1\":%u,\"dest2\":%u",
ais->type22.mmsi.dest1, ais->type22.mmsi.dest2);
} else if (scaled) {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"ne_lon\":\"%f\",\"ne_lat\":\"%f\","
"\"sw_lon\":\"%f\",\"sw_lat\":\"%f\",",
ais->type22.area.ne_lon / AIS_CHANNEL_LATLON_SCALE,
ais->type22.area.ne_lat / AIS_CHANNEL_LATLON_SCALE,
ais->type22.area.sw_lon / AIS_CHANNEL_LATLON_SCALE,
- ais->type22.area.sw_lat / AIS_CHANNEL_LATLON_SCALE);
+ ais->type22.area.sw_lat /
+ AIS_CHANNEL_LATLON_SCALE);
} else {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"ne_lon\":%d,\"ne_lat\":%d,"
"\"sw_lon\":%d,\"sw_lat\":%d,",
ais->type22.area.ne_lon,
ais->type22.area.ne_lat,
- ais->type22.area.sw_lon,
- ais->type22.area.sw_lat);
+ ais->type22.area.sw_lon, ais->type22.area.sw_lat);
}
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"addressed\":%s,\"band_a\":%s,"
"\"band_b\":%s,\"zonesize\":%u}\r\n",
JSON_BOOL(ais->type22.addressed),
JSON_BOOL(ais->type22.band_a),
- JSON_BOOL(ais->type22.band_b),
- ais->type22.zonesize);
+ JSON_BOOL(ais->type22.band_b), ais->type22.zonesize);
break;
- case 23: /* Group Assignment Command */
+ case 23: /* Group Assignment Command */
if (scaled) {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"ne_lon\":\"%f\",\"ne_lat\":\"%f\","
"\"sw_lon\":\"%f\",\"sw_lat\":\"%f\","
"\"stationtype\":\"%s\",\"shiptype\":\"%s\","
@@ -1258,10 +1220,9 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
ais->type23.sw_lat / AIS_CHANNEL_LATLON_SCALE,
STATIONTYPE_DISPLAY(ais->type23.stationtype),
SHIPTYPE_DISPLAY(ais->type23.shiptype),
- ais->type23.interval,
- ais->type23.quiet);
+ ais->type23.interval, ais->type23.quiet);
} else {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"ne_lon\":%d,\"ne_lat\":%d,"
"\"sw_lon\":%d,\"sw_lat\":%d,"
"\"stationtype\":%u,\"shiptype\":%u,"
@@ -1272,43 +1233,41 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
ais->type23.sw_lat,
ais->type23.stationtype,
ais->type23.shiptype,
- ais->type23.interval,
- ais->type23.quiet);
+ ais->type23.interval, ais->type23.quiet);
}
break;
- case 24: /* Class B CS Static Data Report */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 24: /* Class B CS Static Data Report */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"shipname\":\"%s\",",
- json_stringify(buf1,sizeof(buf1), ais->type24.shipname));
+ json_stringify(buf1, sizeof(buf1),
+ ais->type24.shipname));
if (scaled) {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
- "\"shiptype\":\"%s\",",
- SHIPTYPE_DISPLAY(ais->type24.shiptype));
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"shiptype\":\"%s\",",
+ SHIPTYPE_DISPLAY(ais->type24.shiptype));
} else {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
- "\"shiptype\":%u,",
- ais->type24.shiptype);
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"shiptype\":%u,", ais->type24.shiptype);
}
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
- "\"vendorid\":\"%s\",\"callsign\":\"%s\",",
- ais->type24.vendorid,
- ais->type24.callsign);
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"vendorid\":\"%s\",\"callsign\":\"%s\",",
+ ais->type24.vendorid, ais->type24.callsign);
if (AIS_AUXILIARY_MMSI(ais->mmsi)) {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
- "mothership_\"mmsi\":%u}\r\n",
- ais->type24.mothership_mmsi);
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "mothership_\"mmsi\":%u}\r\n",
+ ais->type24.mothership_mmsi);
} else {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
- "\"to_bow\":%u,\"to_stern\":%u,"
- "\"to_port\":%u,\"to_starboard\":%u}\r\n",
- ais->type24.dim.to_bow,
- ais->type24.dim.to_stern,
- ais->type24.dim.to_port,
- ais->type24.dim.to_starboard);
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"to_bow\":%u,\"to_stern\":%u,"
+ "\"to_port\":%u,\"to_starboard\":%u}\r\n",
+ ais->type24.dim.to_bow,
+ ais->type24.dim.to_stern,
+ ais->type24.dim.to_port,
+ ais->type24.dim.to_starboard);
}
break;
- case 25: /* Binary Message, Single Slot */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 25: /* Binary Message, Single Slot */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"addressed\":%s,\"structured\":%s,\"dest_mmsi\":%u,"
"\"app_id\":%u,\"data\":\"%zd:%s\"}\r\n",
JSON_BOOL(ais->type25.addressed),
@@ -1317,10 +1276,10 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
ais->type25.app_id,
ais->type25.bitcount,
gpsd_hexdump(ais->type25.bitdata,
- (ais->type25.bitcount+7)/8));
+ (ais->type25.bitcount + 7) / 8));
break;
- case 26: /* Binary Message, Multiple Slot */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 26: /* Binary Message, Multiple Slot */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"addressed\":%s,\"structured\":%s,\"dest_mmsi\":%u,"
"\"app_id\":%u,\"data\":\"%zd:%s\"\"radio\":%u}\r\n",
JSON_BOOL(ais->type26.addressed),
@@ -1329,19 +1288,147 @@ void aivdm_json_dump(const struct ais_t *ais, bool scaled, /*@out@*/char *buf, s
ais->type26.app_id,
ais->type26.bitcount,
gpsd_hexdump(ais->type26.bitdata,
- (ais->type26.bitcount+7)/8),
+ (ais->type26.bitcount + 7) / 8),
ais->type26.radio);
break;
default:
- if (buf[strlen(buf)-1] == ',')
- buf[strlen(buf)-1] = '\0';
- (void) strlcat(buf, "}\r\n", buflen);
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
+ (void)strlcat(buf, "}\r\n", buflen);
break;
}
/*@ +formatcode +mustfreefresh @*/
#undef SHOW_BOOL
}
-
#endif /* defined(AIVDM_ENABLE) */
+#ifdef COMPASS_ENABLE
+void json_att_dump(const struct gps_data_t *gpsdata,
+ /*@out@*/ char *reply, size_t replylen)
+/* dump the contents of an attitude_t structure as JSON */
+{
+ assert(replylen > 2);
+ (void)strlcpy(reply, "{\"class\":\"ATT\",", replylen);
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"tag\":\"%s\",",
+ gpsdata->tag[0] != '\0' ? gpsdata->tag : "-");
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"device\":\"%s\",", gpsdata->dev.path);
+ if (isnan(gpsdata->attitude.heading) == 0) {
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"heading\":%.2f,", gpsdata->attitude.heading);
+ if (gpsdata->attitude.mag_st != '\0')
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"mag_st\":\"%c\",", gpsdata->attitude.mag_st);
+
+ }
+ if (isnan(gpsdata->attitude.pitch) == 0) {
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"pitch\":%.2f,", gpsdata->attitude.pitch);
+ if (gpsdata->attitude.pitch_st != '\0')
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"pitch_st\":\"%c\",",
+ gpsdata->attitude.pitch_st);
+
+ }
+ if (isnan(gpsdata->attitude.yaw) == 0) {
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"yaw\":%.2f,", gpsdata->attitude.yaw);
+ if (gpsdata->attitude.yaw_st != '\0')
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"yaw_st\":\"%c\",", gpsdata->attitude.yaw_st);
+
+ }
+ if (isnan(gpsdata->attitude.roll) == 0) {
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"roll\":%.2f,", gpsdata->attitude.roll);
+ if (gpsdata->attitude.roll_st != '\0')
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"roll_st\":\"%c\",", gpsdata->attitude.roll_st);
+
+ }
+ if (isnan(gpsdata->attitude.yaw) == 0) {
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"yaw\":%.2f,", gpsdata->attitude.yaw);
+ if (gpsdata->attitude.yaw_st != '\0')
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"yaw_st\":\"%c\",", gpsdata->attitude.yaw_st);
+
+ }
+ if (isnan(gpsdata->attitude.dip) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"dip\":%.3f,", gpsdata->attitude.dip);
+
+ if (isnan(gpsdata->attitude.mag_len) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"mag_len\":%.3f,", gpsdata->attitude.mag_len);
+ if (isnan(gpsdata->attitude.mag_x) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"mag_x\":%.3f,", gpsdata->attitude.mag_x);
+ if (isnan(gpsdata->attitude.mag_y) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"mag_y\":%.3f,", gpsdata->attitude.mag_y);
+ if (isnan(gpsdata->attitude.mag_z) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"mag_z\":%.3f,", gpsdata->attitude.mag_z);
+
+ if (isnan(gpsdata->attitude.acc_len) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"acc_len\":%.3f,", gpsdata->attitude.acc_len);
+ if (isnan(gpsdata->attitude.acc_x) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"acc_x\":%.3f,", gpsdata->attitude.acc_x);
+ if (isnan(gpsdata->attitude.acc_y) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"acc_y\":%.3f,", gpsdata->attitude.acc_y);
+ if (isnan(gpsdata->attitude.acc_z) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"acc_z\":%.3f,", gpsdata->attitude.acc_z);
+
+ if (isnan(gpsdata->attitude.gyro_x) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"gyro_x\":%.3f,", gpsdata->attitude.gyro_x);
+ if (isnan(gpsdata->attitude.gyro_y) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"gyro_y\":%.3f,", gpsdata->attitude.gyro_y);
+
+ if (isnan(gpsdata->attitude.temp) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"temp\":%.3f,", gpsdata->attitude.temp);
+ if (isnan(gpsdata->attitude.depth) == 0)
+ (void)snprintf(reply + strlen(reply),
+ replylen - strlen(reply),
+ "\"depth\":%.3f,", gpsdata->attitude.depth);
+
+ if (reply[strlen(reply) - 1] == ',')
+ reply[strlen(reply) - 1] = '\0'; /* trim trailing comma */
+ (void)strlcat(reply, "}\r\n", replylen);
+}
+#endif /* COMPASS_ENABLE */
+
+
/* gpsd_json.c ends here */
diff --git a/gpsd_report.c b/gpsd_report.c
index 94081aa9..956b5f0b 100644
--- a/gpsd_report.c
+++ b/gpsd_report.c
@@ -9,10 +9,11 @@
# if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
-void gpsd_report(int errlevel UNUSED, const char *fmt, ... ) __attribute__ ((weak));
+void gpsd_report(int errlevel UNUSED, const char *fmt, ...)
+ __attribute__ ((weak));
#endif
-void gpsd_report(int errlevel UNUSED, const char *fmt, ... )
+void gpsd_report(int errlevel UNUSED, const char *fmt, ...)
/* stub logger for clients that don't supply one */
{
va_list ap;
diff --git a/gpsdclient.c b/gpsdclient.c
index 4da9495f..4e991232 100644
--- a/gpsdclient.c
+++ b/gpsdclient.c
@@ -32,41 +32,42 @@
* deg_ddmmss : return DD MM' SS.sss"
*
*/
-/*@observer@*/char *deg_to_str( enum deg_str_type type, double f)
+/*@observer@*/ char *deg_to_str(enum deg_str_type type, double f)
{
static char str[40];
int dsec, sec, deg, min;
long frac_deg;
double fdsec, fsec, fdeg, fmin;
- if ( f < 0 || f > 360 ) {
- (void)strlcpy( str, "nan", 40);
+ if (f < 0 || f > 360) {
+ (void)strlcpy(str, "nan", 40);
return str;
}
- fmin = modf( f, &fdeg);
+ fmin = modf(f, &fdeg);
deg = (int)fdeg;
frac_deg = (long)(fmin * 1000000);
- if ( deg_dd == type ) {
+ if (deg_dd == type) {
/* DD.dddddd */
- (void)snprintf(str, sizeof(str), "%3d.%06ld", deg,frac_deg);
+ (void)snprintf(str, sizeof(str), "%3d.%06ld", deg, frac_deg);
return str;
}
- fsec = modf( fmin * 60, &fmin);
+ fsec = modf(fmin * 60, &fmin);
min = (int)fmin;
sec = (int)(fsec * 10000.0);
- if ( deg_ddmm == type ) {
+ if (deg_ddmm == type) {
/* DD MM.mmmm */
- (void)snprintf(str,sizeof(str), "%3d %02d.%04d'", deg,min,sec);
+ (void)snprintf(str, sizeof(str), "%3d %02d.%04d'", deg, min, sec);
return str;
}
/* else DD MM SS.sss */
- fdsec = modf( fsec * 60, &fsec);
+ fdsec = modf(fsec * 60, &fsec);
sec = (int)fsec;
dsec = (int)(fdsec * 1000.0);
- (void)snprintf(str,sizeof(str), "%3d %02d' %02d.%03d\"", deg,min,sec,dsec);
+ (void)snprintf(str, sizeof(str), "%3d %02d' %02d.%03d\"", deg, min, sec,
+ dsec);
return str;
}
@@ -102,35 +103,34 @@
*/
enum unit gpsd_units(void)
{
- char *envu = NULL;
+ char *envu = NULL;
#ifdef HAVE_SETLOCALE
- (void)setlocale(LC_NUMERIC, "C");
+ (void)setlocale(LC_NUMERIC, "C");
#endif
- if ((envu = getenv("GPSD_UNITS")) != NULL && *envu != '\0') {
- if (0 == strcasecmp(envu, "imperial")) {
- return imperial;
- }
- if (0 == strcasecmp(envu, "nautical")) {
- return nautical;
- }
- if (0 == strcasecmp(envu, "metric")) {
- return metric;
- }
- /* unrecognized, ignore it */
+ if ((envu = getenv("GPSD_UNITS")) != NULL && *envu != '\0') {
+ if (0 == strcasecmp(envu, "imperial")) {
+ return imperial;
}
- if (((envu = getenv("LC_MEASUREMENT")) != NULL && *envu != '\0')
- || ((envu = getenv("LANG")) != NULL && *envu != '\0')) {
- if (strncasecmp(envu, "en_US", 5)==0
- || strcasecmp(envu, "C")==0
- || strcasecmp(envu, "POSIX")==0) {
- return imperial;
- }
- /* Other, must be metric */
- return metric;
+ if (0 == strcasecmp(envu, "nautical")) {
+ return nautical;
}
- /* TODO: allow a compile time default here */
- return unspecified;
+ if (0 == strcasecmp(envu, "metric")) {
+ return metric;
+ }
+ /* unrecognized, ignore it */
+ }
+ if (((envu = getenv("LC_MEASUREMENT")) != NULL && *envu != '\0')
+ || ((envu = getenv("LANG")) != NULL && *envu != '\0')) {
+ if (strncasecmp(envu, "en_US", 5) == 0
+ || strcasecmp(envu, "C") == 0 || strcasecmp(envu, "POSIX") == 0) {
+ return imperial;
+ }
+ /* Other, must be metric */
+ return metric;
+ }
+ /* TODO: allow a compile time default here */
+ return unspecified;
}
/*@ -observertrans -statictrans -mustfreeonly -branchstate -kepttrans @*/
@@ -141,14 +141,14 @@ void gpsd_source_spec(const char *arg, struct fixsource_t *source)
source->port = DEFAULT_GPSD_PORT;
source->device = NULL;
- /*@-usedef@ Sigh, splint is buggy*/
+ /*@-usedef@ Sigh, splint is buggy */
if (arg != NULL) {
char *colon1, *skipto, *rbrk;
source->spec = strdup(arg);
assert(source->spec != NULL);
skipto = source->spec;
- if (*skipto == '[' && (rbrk = strchr(skipto, ']'))!=NULL) {
+ if (*skipto == '[' && (rbrk = strchr(skipto, ']')) != NULL) {
skipto = rbrk;
}
colon1 = strchr(skipto, ':');
@@ -182,8 +182,7 @@ void gpsd_source_spec(const char *arg, struct fixsource_t *source)
/*@+modobserver@*/
/*@+usedef@*/
}
+
/*@ +observertrans -statictrans +mustfreeonly +branchstate +kepttrans @*/
/* gpsclient.c ends here */
-
-
diff --git a/gpsdecode.c b/gpsdecode.c
index 9105c662..a52a876f 100644
--- a/gpsdecode.c
+++ b/gpsdecode.c
@@ -27,7 +27,7 @@ static bool json = false;
*
**************************************************************************/
-void gpsd_report(int errlevel, const char *fmt, ... )
+void gpsd_report(int errlevel, const char *fmt, ...)
/* assemble command in printf(3) style, use stderr or syslog */
{
if (errlevel <= verbose) {
@@ -35,8 +35,9 @@ void gpsd_report(int errlevel, const char *fmt, ... )
va_list ap;
(void)strlcpy(buf, "gpsdecode: ", BUFSIZ);
- va_start(ap, fmt) ;
- (void)vsnprintf(buf + strlen(buf), sizeof(buf)-strlen(buf), fmt, ap);
+ va_start(ap, fmt);
+ (void)vsnprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), fmt,
+ ap);
va_end(ap);
(void)fputs(buf, stdout);
}
@@ -44,30 +45,30 @@ void gpsd_report(int errlevel, const char *fmt, ... )
static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
{
- (void)snprintf(buf, buflen, "%u,%u,%09u,", ais->type,ais->repeat,ais->mmsi);
+ (void)snprintf(buf, buflen, "%u,%u,%09u,", ais->type, ais->repeat,
+ ais->mmsi);
/*@ -formatcode @*/
switch (ais->type) {
- case 1: /* Position Report */
+ case 1: /* Position Report */
case 2:
case 3:
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%d,%u,%u,%d,%d,%u,%u,%u,0x%x,%u,0x%x",
ais->type1.status,
ais->type1.turn,
ais->type1.speed,
- (uint)ais->type1.accuracy,
+ (uint) ais->type1.accuracy,
ais->type1.lon,
ais->type1.lat,
ais->type1.course,
ais->type1.heading,
ais->type1.second,
ais->type1.maneuver,
- (uint)ais->type1.raim,
- ais->type1.radio);
+ (uint) ais->type1.raim, ais->type1.radio);
break;
- case 4: /* Base Station Report */
- case 11: /* UTC/Date Response */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 4: /* Base Station Report */
+ case 11: /* UTC/Date Response */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%04u:%02u:%02uT%02u:%02u:%02uZ,%u,%d,%d,%u,%u,0x%x",
ais->type4.year,
ais->type4.month,
@@ -75,15 +76,14 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
ais->type4.hour,
ais->type4.minute,
ais->type4.second,
- (uint)ais->type4.accuracy,
+ (uint) ais->type4.accuracy,
ais->type4.lon,
ais->type4.lat,
ais->type4.epfd,
- (uint)ais->type4.raim,
- ais->type4.radio);
+ (uint) ais->type4.raim, ais->type4.radio);
break;
- case 5: /* Ship static and voyage related data */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 5: /* Ship static and voyage related data */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%u,%s,%s,%u,%u,%u,%u,%u,%u,%02u-%02uT%02u:%02uZ,%u,%s,%u",
ais->type5.imo,
ais->type5.ais_version,
@@ -100,72 +100,65 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
ais->type5.hour,
ais->type5.minute,
ais->type5.draught,
- ais->type5.destination,
- ais->type5.dte);
+ ais->type5.destination, ais->type5.dte);
break;
- case 6: /* Binary Message */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 6: /* Binary Message */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%u,%u,%u,%zd:%s",
ais->type6.seqno,
ais->type6.dest_mmsi,
- (uint)ais->type6.retransmit,
+ (uint) ais->type6.retransmit,
ais->type6.app_id,
ais->type6.bitcount,
gpsd_hexdump(ais->type6.bitdata,
- (ais->type6.bitcount+7)/8));
+ (ais->type6.bitcount + 7) / 8));
break;
- case 7: /* Binary Acknowledge */
- case 13: /* Safety Related Acknowledge */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 7: /* Binary Acknowledge */
+ case 13: /* Safety Related Acknowledge */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%u,%u,%u",
ais->type7.mmsi1,
- ais->type7.mmsi2,
- ais->type7.mmsi3,
- ais->type7.mmsi4);
+ ais->type7.mmsi2, ais->type7.mmsi3, ais->type7.mmsi4);
break;
- case 8: /* Binary Broadcast Message */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 8: /* Binary Broadcast Message */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%zd:%s",
ais->type8.app_id,
ais->type8.bitcount,
gpsd_hexdump(ais->type8.bitdata,
- (ais->type8.bitcount+7)/8));
+ (ais->type8.bitcount + 7) / 8));
break;
case 9:
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%u,%u,%d,%d,%u,%u,0x%x,%u,%u,0x%x",
ais->type9.alt,
ais->type9.speed,
- (uint)ais->type9.accuracy,
+ (uint) ais->type9.accuracy,
ais->type9.lon,
ais->type9.lat,
ais->type9.course,
ais->type9.second,
ais->type9.regional,
ais->type9.dte,
- (uint)ais->type9.raim,
- ais->type9.radio);
+ (uint) ais->type9.raim, ais->type9.radio);
break;
- case 10: /* UTC/Date Inquiry */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
- "%u",
- ais->type10.dest_mmsi);
+ case 10: /* UTC/Date Inquiry */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "%u", ais->type10.dest_mmsi);
break;
- case 12: /* Safety Related Message */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 12: /* Safety Related Message */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%u,%u,%s",
ais->type12.seqno,
ais->type12.dest_mmsi,
- (uint)ais->type12.retransmit,
- ais->type12.text);
+ (uint) ais->type12.retransmit, ais->type12.text);
break;
- case 14: /* Safety Related Broadcast Message */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
- "%s",
- ais->type14.text);
+ case 14: /* Safety Related Broadcast Message */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "%s", ais->type14.text);
break;
case 15:
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%u,%u,%u,%u,%u,%u,%u",
ais->type15.mmsi1,
ais->type15.type1_1,
@@ -173,54 +166,51 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
ais->type15.type1_2,
ais->type15.offset1_2,
ais->type15.mmsi2,
- ais->type15.type2_1,
- ais->type15.offset2_1);
+ ais->type15.type2_1, ais->type15.offset2_1);
break;
case 16:
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%u,%u,%u,%u,%u",
ais->type16.mmsi1,
ais->type16.offset1,
ais->type16.increment1,
ais->type16.mmsi2,
- ais->type16.offset2,
- ais->type16.increment2);
+ ais->type16.offset2, ais->type16.increment2);
break;
case 17:
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%d,%d,%zd:%s",
ais->type17.lon,
ais->type17.lat,
ais->type17.bitcount,
gpsd_hexdump(ais->type17.bitdata,
- (ais->type17.bitcount+7)/8));
+ (ais->type17.bitcount + 7) / 8));
break;
case 18:
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%u,%u,%d,%d,%u,%u,%u,0x%x,%u,%u,%u,%u,%u,%u,0x%x",
ais->type18.reserved,
ais->type18.speed,
- (uint)ais->type18.accuracy,
+ (uint) ais->type18.accuracy,
ais->type18.lon,
ais->type18.lat,
ais->type18.course,
ais->type18.heading,
ais->type18.second,
ais->type18.regional,
- (uint)ais->type18.cs,
- (uint)ais->type18.display,
- (uint)ais->type18.dsc,
- (uint)ais->type18.band,
- (uint)ais->type18.msg22,
- (uint)ais->type18.raim,
- ais->type18.radio);
+ (uint) ais->type18.cs,
+ (uint) ais->type18.display,
+ (uint) ais->type18.dsc,
+ (uint) ais->type18.band,
+ (uint) ais->type18.msg22,
+ (uint) ais->type18.raim, ais->type18.radio);
break;
case 19:
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%u,%u,%d,%d,%u,%u,%u,0x%x,%s,%u,%u,%u,%u,%u,%u,%u,%u,%u",
ais->type19.reserved,
ais->type19.speed,
- (uint)ais->type19.accuracy,
+ (uint) ais->type19.accuracy,
ais->type19.lon,
ais->type19.lat,
ais->type19.course,
@@ -234,12 +224,11 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
ais->type19.to_port,
ais->type19.to_starboard,
ais->type19.epfd,
- (uint)ais->type19.raim,
- ais->type19.dte,
- (uint)ais->type19.assigned);
+ (uint) ais->type19.raim,
+ ais->type19.dte, (uint) ais->type19.assigned);
break;
- case 20: /* Data Link Management Message */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 20: /* Data Link Management Message */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u",
ais->type20.offset1,
ais->type20.number1,
@@ -255,15 +244,14 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
ais->type20.increment3,
ais->type20.offset4,
ais->type20.number4,
- ais->type20.timeout4,
- ais->type20.increment4);
+ ais->type20.timeout4, ais->type20.increment4);
break;
- case 21: /* Aid to Navigation */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 21: /* Aid to Navigation */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%s,%u,%d,%d,%u,%u,%u,%u,%u,%u,%u,0x%x,%u,%u",
ais->type21.aid_type,
ais->type21.name,
- (uint)ais->type21.accuracy,
+ (uint) ais->type21.accuracy,
ais->type21.lon,
ais->type21.lat,
ais->type21.to_bow,
@@ -273,42 +261,40 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
ais->type21.epfd,
ais->type21.second,
ais->type21.regional,
- (uint)ais->type21.off_position,
- (uint)ais->type21.raim,
- (uint)ais->type21.virtual_aid);
+ (uint) ais->type21.off_position,
+ (uint) ais->type21.raim,
+ (uint) ais->type21.virtual_aid);
break;
- case 22: /* Channel Management */
+ case 22: /* Channel Management */
if (!ais->type22.addressed)
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%u,%u,%u,%d,%d,%d,%d,%u,%u,%u,%u",
ais->type22.channel_a,
ais->type22.channel_b,
ais->type22.txrx,
- (uint)ais->type22.power,
+ (uint) ais->type22.power,
ais->type22.area.ne_lon,
ais->type22.area.ne_lat,
ais->type22.area.sw_lon,
ais->type22.area.sw_lat,
- (uint)ais->type22.addressed,
- (uint)ais->type22.band_a,
- (uint)ais->type22.band_b,
- ais->type22.zonesize);
+ (uint) ais->type22.addressed,
+ (uint) ais->type22.band_a,
+ (uint) ais->type22.band_b, ais->type22.zonesize);
else
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%u,%u,%u,%u,%u,%u,%u,%u,%u",
ais->type22.channel_a,
ais->type22.channel_b,
ais->type22.txrx,
- (uint)ais->type22.power,
+ (uint) ais->type22.power,
ais->type22.mmsi.dest1,
ais->type22.mmsi.dest2,
- (uint)ais->type22.addressed,
- (uint)ais->type22.band_a,
- (uint)ais->type22.band_b,
- ais->type22.zonesize);
+ (uint) ais->type22.addressed,
+ (uint) ais->type22.band_a,
+ (uint) ais->type22.band_b, ais->type22.zonesize);
break;
- case 23: /* Group Management Command*/
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 23: /* Group Management Command */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%d,%d,%d,%d,%u,%u,%u,%u,%u",
ais->type23.ne_lon,
ais->type23.ne_lat,
@@ -317,26 +303,20 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
ais->type23.stationtype,
ais->type23.shiptype,
ais->type23.txrx,
- ais->type23.interval,
- ais->type23.quiet);
+ ais->type23.interval, ais->type23.quiet);
break;
- case 24: /* Class B CS Static Data Report */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
- "%s,",
- ais->type24.shipname);
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
- "%u,",
- ais->type24.shiptype);
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
- "%s,%s,",
- ais->type24.vendorid,
- ais->type24.callsign);
+ case 24: /* Class B CS Static Data Report */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "%s,", ais->type24.shipname);
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "%u,", ais->type24.shiptype);
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "%s,%s,", ais->type24.vendorid, ais->type24.callsign);
if (AIS_AUXILIARY_MMSI(ais->mmsi)) {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
- "%u",
- ais->type24.mothership_mmsi);
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "%u", ais->type24.mothership_mmsi);
} else {
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%u,%u,%u",
ais->type24.dim.to_bow,
ais->type24.dim.to_stern,
@@ -344,32 +324,33 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
ais->type24.dim.to_starboard);
}
break;
- case 25: /* Binary Message, Single Slot */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 25: /* Binary Message, Single Slot */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%u,%u,%u,%zd:%s\r\n",
- (uint)ais->type25.addressed,
- (uint)ais->type25.structured,
+ (uint) ais->type25.addressed,
+ (uint) ais->type25.structured,
ais->type25.dest_mmsi,
ais->type25.app_id,
ais->type25.bitcount,
gpsd_hexdump(ais->type25.bitdata,
- (ais->type25.bitcount+7)/8));
+ (ais->type25.bitcount + 7) / 8));
break;
- case 26: /* Binary Message, Multiple Slot */
- (void)snprintf(buf+strlen(buf), buflen-strlen(buf),
+ case 26: /* Binary Message, Multiple Slot */
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"%u,%u,%u,%u,%zd:%s:%u\r\n",
- (uint)ais->type26.addressed,
- (uint)ais->type26.structured,
+ (uint) ais->type26.addressed,
+ (uint) ais->type26.structured,
ais->type26.dest_mmsi,
ais->type26.app_id,
ais->type26.bitcount,
gpsd_hexdump(ais->type26.bitdata,
- (ais->type26.bitcount+7)/8),
+ (ais->type26.bitcount + 7) / 8),
ais->type26.radio);
break;
default:
- (void)snprintf(buf+strlen(buf),
- buflen-strlen(buf), "unknown AIVDM message content.");
+ (void)snprintf(buf + strlen(buf),
+ buflen - strlen(buf),
+ "unknown AIVDM message content.");
break;
}
/*@ +formatcode @*/
@@ -377,7 +358,7 @@ static void aivdm_csv_dump(struct ais_t *ais, char *buf, size_t buflen)
}
/*@ -compdestroy -compdef -usedef @*/
-static void decode(FILE *fpin, FILE *fpout)
+static void decode(FILE * fpin, FILE * fpout)
/* RTCM or AIS packets on fpin to dump format on fpout */
{
struct gps_packet_t lexer;
@@ -409,25 +390,27 @@ static void decode(FILE *fpin, FILE *fpout)
}
#endif
else if (lexer.type == AIVDM_PACKET) {
- if (verbose >=1 )
+ if (verbose >= 1)
(void)fputs((char *)lexer.outbuffer, stdout);
/*@ -uniondef */
- if (aivdm_decode((char *)lexer.outbuffer, lexer.outbuflen, &aivdm, &ais)) {
+ if (aivdm_decode
+ ((char *)lexer.outbuffer, lexer.outbuflen, &aivdm, &ais)) {
if (!json)
aivdm_csv_dump(&ais, buf, sizeof(buf));
else
aivdm_json_dump(&ais, scaled, buf, sizeof(buf));
(void)fputs(buf, fpout);
}
-
+
/*@ +uniondef */
}
}
}
+
/*@ +compdestroy +compdef +usedef @*/
/*@ -compdestroy @*/
-static void encode(FILE *fpin, bool repack, FILE *fpout)
+static void encode(FILE * fpin, bool repack, FILE * fpout)
/* dump format on fpin to RTCM-104 on fpout */
{
char inbuf[BUFSIZ];
@@ -443,18 +426,23 @@ static void encode(FILE *fpin, bool repack, FILE *fpout)
continue;
status = libgps_json_unpack(inbuf, &gpsdata, NULL);
if (status != 0) {
- (void) fprintf(stderr, "gpsdecode: bailing out with status %d (%s) on line %d\n", status, json_error_string(status), lineno);
+ (void)fprintf(stderr,
+ "gpsdecode: bailing out with status %d (%s) on line %d\n",
+ status, json_error_string(status), lineno);
exit(1);
- } if ((gpsdata.set & RTCM2_SET) != 0) {
+ }
+ if ((gpsdata.set & RTCM2_SET) != 0) {
if (repack) {
// FIXME: This code is presently broken
struct gps_packet_t lexer;
(void)memset(lexer.isgps.buf, 0, sizeof(lexer.isgps.buf));
- (void)rtcm2_repack(&gpsdata.rtcm2, lexer.isgps.buf);
- if (fwrite(lexer.isgps.buf,
- sizeof(isgps30bits_t),
- (size_t)gpsdata.rtcm2.length, fpout) != (size_t)gpsdata.rtcm2.length)
- (void) fprintf(stderr, "gpsdecode: report write failed.\n");
+ (void)rtcm2_repack(&gpsdata.rtcm2, lexer.isgps.buf);
+ if (fwrite(lexer.isgps.buf,
+ sizeof(isgps30bits_t),
+ (size_t) gpsdata.rtcm2.length,
+ fpout) != (size_t) gpsdata.rtcm2.length)
+ (void)fprintf(stderr,
+ "gpsdecode: report write failed.\n");
memset(&lexer, 0, sizeof(lexer));
} else {
/* this works */
@@ -462,19 +450,22 @@ static void encode(FILE *fpin, bool repack, FILE *fpout)
rtcm2_json_dump(&gpsdata.rtcm2, outbuf, sizeof(outbuf));
(void)fputs(outbuf, fpout);
}
- } if ((gpsdata.set & AIS_SET) != 0) {
+ }
+ if ((gpsdata.set & AIS_SET) != 0) {
char outbuf[BUFSIZ];
aivdm_json_dump(&gpsdata.ais, false, outbuf, sizeof(outbuf));
(void)fputs(outbuf, fpout);
}
}
}
+
/*@ +compdestroy @*/
int main(int argc, char **argv)
{
int c;
- enum {doencode, dodecode} mode = dodecode;
+ enum
+ { doencode, dodecode } mode = dodecode;
while ((c = getopt(argc, argv, "cdejpuVD:")) != EOF) {
switch (c) {
diff --git a/gpsmon.c b/gpsmon.c
index 051c32c5..17718e74 100644
--- a/gpsmon.c
+++ b/gpsmon.c
@@ -22,11 +22,12 @@
#endif /* defined(__CYGWIN__) */
#include <time.h>
#include <termios.h>
-#include <fcntl.h> /* for O_RDWR */
+#include <fcntl.h> /* for O_RDWR */
#include <stdarg.h>
#include <stdbool.h>
#include <errno.h>
-#include <sys/ioctl.h> /* for O_RDWR */
+#include <sys/ioctl.h> /* for O_RDWR */
+#include <setjmp.h>
#include "gpsd_config.h"
@@ -51,7 +52,7 @@
#include "revision.h"
#ifdef S_SPLINT_S
-extern struct tm *localtime_r(const time_t *,/*@out@*/struct tm *tp)/*@modifies tp@*/;
+extern struct tm *localtime_r(const time_t *, /*@out@*/ struct tm *tp);
#endif /* S_SPLINT_S */
#define BUFLEN 2048
@@ -60,20 +61,20 @@ extern struct tm *localtime_r(const time_t *,/*@out@*/struct tm *tp)/*@modifies
extern struct monitor_object_t nmea_mmt, sirf_mmt, garmin_mmt, ashtech_mmt;
extern struct monitor_object_t italk_mmt, ubx_mmt, superstar2_mmt;
extern struct monitor_object_t fv18_mmt, gpsclock_mmt, mtk3301_mmt;
-extern struct monitor_object_t oncore_mmt;
+extern struct monitor_object_t oncore_mmt, tnt_mmt;
/* These are public */
-struct gps_device_t session;
+struct gps_device_t session;
WINDOW *devicewin;
int gmt_offset;
/* These are private */
-static struct gps_context_t context;
+static struct gps_context_t context;
static int controlfd = -1;
static bool serial, curses_active;
static int debuglevel = 0;
static WINDOW *statwin, *cmdwin;
-/*@null@*/static WINDOW *packetwin;
+/*@null@*/ static WINDOW *packetwin;
static FILE *logfile;
static char *type_name;
/*@ -nullassign @*/
@@ -111,21 +112,33 @@ static const struct monitor_object_t *monitor_objects[] = {
#if defined(ONCORE_ENABLE) && defined(BINARY_ENABLE)
&oncore_mmt,
#endif /* defined(ONCORE_ENABLE) && defined(BINARY_ENABLE) */
+#ifdef TNT_ENABLE
+ &tnt_mmt,
+#endif /* TNT_ENABLE */
NULL,
};
+
static const struct monitor_object_t **active;
/*@ +nullassign @*/
+static jmp_buf terminate;
+
#define display (void)mvwprintw
-void monitor_fixframe(WINDOW *win)
+/* ternination codes */
+#define TERM_SELECT_FAILED 1
+#define TERM_DRIVER_SWITCH 2
+#define TERM_EMPTY_READ 3
+#define TERM_READ_ERROR 4
+
+void monitor_fixframe(WINDOW * win)
{
int ymax, xmax, ycur, xcur;
- assert(win!= NULL);
+ assert(win != NULL);
getyx(win, ycur, xcur);
getmaxyx(win, ymax, xmax);
- (void)mvwaddch(win, ycur, xmax-1, ACS_VLINE);
+ (void)mvwaddch(win, ycur, xmax - 1, ACS_VLINE);
}
/******************************************************************************
@@ -134,10 +147,10 @@ void monitor_fixframe(WINDOW *win)
*
******************************************************************************/
-void gpsd_report(int errlevel UNUSED, const char *fmt, ... )
+void gpsd_report(int errlevel UNUSED, const char *fmt, ...)
/* our version of the logger */
{
- if (errlevel <= debuglevel && packetwin!=NULL) {
+ if (errlevel <= debuglevel && packetwin != NULL) {
va_list ap;
va_start(ap, fmt);
if (!curses_active)
@@ -157,30 +170,36 @@ static ssize_t readpkt(void)
gps_mask_t changed;
FD_ZERO(&select_set);
- FD_SET(session.gpsdata.gps_fd,&select_set);
+ FD_SET(session.gpsdata.gps_fd, &select_set);
if (controlfd > -1)
- FD_SET(controlfd,&select_set);
+ FD_SET(controlfd, &select_set);
timeval.tv_sec = 0;
timeval.tv_usec = 500000;
- if (select(session.gpsdata.gps_fd + 1,&select_set,NULL,NULL,&timeval) == -1)
- return EOF;
+ if (select(session.gpsdata.gps_fd + 1, &select_set, NULL, NULL, &timeval)
+ == -1)
+ longjmp(terminate, TERM_SELECT_FAILED);
- if (!FD_ISSET(session.gpsdata.gps_fd,&select_set))
- return EOF;
+ if (!FD_ISSET(session.gpsdata.gps_fd, &select_set))
+ longjmp(terminate, TERM_SELECT_FAILED);
changed = gpsd_poll(&session);
- if (changed & ERROR_SET)
- return EOF;
+ if (changed == 0)
+ longjmp(terminate, TERM_EMPTY_READ);
+
+ if ((changed & ERROR_IS) != 0)
+ longjmp(terminate, TERM_READ_ERROR);
if (logfile != NULL) {
/*@ -shiftimplementation -sefparams +charint @*/
- assert(fwrite(session.packet.outbuffer, sizeof(char), session.packet.outbuflen,
- logfile) >= 1);
+ assert(fwrite
+ (session.packet.outbuffer, sizeof(char),
+ session.packet.outbuflen, logfile) >= 1);
/*@ +shiftimplementation +sefparams -charint @*/
}
return session.packet.outbuflen;
/*@ +type +shiftnegative +compdef +nullpass @*/
}
+
/*@ +globstate @*/
static void packet_dump(char *buf, size_t buflen)
@@ -194,9 +213,10 @@ static void packet_dump(char *buf, size_t buflen)
if (printable) {
for (i = 0; i < buflen; i++)
if (isprint(buf[i]))
- (void)waddch(packetwin, (chtype)buf[i]);
+ (void)waddch(packetwin, (chtype) buf[i]);
else
- (void)wprintw(packetwin, "\\x%02x", (unsigned char)buf[i]);
+ (void)wprintw(packetwin, "\\x%02x",
+ (unsigned char)buf[i]);
} else {
for (i = 0; i < buflen; i++)
(void)wprintw(packetwin, "%02x", (unsigned char)buf[i]);
@@ -218,7 +238,7 @@ static void monitor_dump_send(void)
#endif /* defined(ALLOW_CONTROLSEND) || defined(ALLOW_RECONFIGURE) */
#ifdef ALLOW_CONTROLSEND
-bool monitor_control_send(/*@in@*/unsigned char *buf, size_t len)
+bool monitor_control_send( /*@in@*/ unsigned char *buf, size_t len)
{
if (controlfd == -1)
return false;
@@ -229,7 +249,9 @@ bool monitor_control_send(/*@in@*/unsigned char *buf, size_t len)
if (!serial) {
/*@ -sefparams @*/
assert(write(controlfd, "!", 1) != -1);
- assert(write(controlfd, session.gpsdata.dev.path, strlen(session.gpsdata.dev.path)) != -1);
+ assert(write
+ (controlfd, session.gpsdata.dev.path,
+ strlen(session.gpsdata.dev.path)) != -1);
assert(write(controlfd, "=", 1) != -1);
/*@ +sefparams @*/
/*
@@ -255,7 +277,7 @@ bool monitor_control_send(/*@in@*/unsigned char *buf, size_t len)
}
}
-static bool monitor_raw_send(/*@in@*/unsigned char *buf, size_t len)
+static bool monitor_raw_send( /*@in@*/ unsigned char *buf, size_t len)
{
if (controlfd == -1)
return false;
@@ -282,7 +304,7 @@ static bool monitor_raw_send(/*@in@*/unsigned char *buf, size_t len)
(void)memcpy(session.msgbuf, buf, len);
session.msgbuflen = len;
monitor_dump_send();
- return (st > 0 && (size_t)st == len);
+ return (st > 0 && (size_t) st == len);
}
}
#endif /* ALLOW_CONTROLSEND */
@@ -318,10 +340,10 @@ static long tzoffset(void)
void monitor_complain(const char *fmt, ...)
{
va_list ap;
- (void)wmove(cmdwin, 0, (int)strlen(type_name)+2);
+ (void)wmove(cmdwin, 0, (int)strlen(type_name) + 2);
(void)wclrtoeol(cmdwin);
(void)wattrset(cmdwin, A_BOLD | A_BLINK);
- va_start(ap, fmt) ;
+ va_start(ap, fmt);
(void)vwprintw(cmdwin, (char *)fmt, ap);
va_end(ap);
(void)wattrset(cmdwin, A_NORMAL);
@@ -358,8 +380,7 @@ static bool switch_type(const struct gps_type_t *devtype)
(void)delwin(devicewin);
}
active = newobject;
- devicewin = newwin((*active)->min_y,
- (*active)->min_x,1,0);
+ devicewin = newwin((*active)->min_y, (*active)->min_x, 1, 0);
if ((devicewin == NULL) || !(*active)->initialize()) {
monitor_complain("Internal initialization failure - screen "
"must be at least 80x24. aborting.");
@@ -367,19 +388,19 @@ static bool switch_type(const struct gps_type_t *devtype)
}
/*@ -onlytrans @*/
- leftover = LINES-1-(*active)->min_y;
+ leftover = LINES - 1 - (*active)->min_y;
if (leftover <= 0) {
if (packetwin != NULL)
(void)delwin(packetwin);
packetwin = NULL;
} else if (packetwin == NULL) {
- packetwin = newwin(leftover, COLS, (*active)->min_y+1, 0);
+ packetwin = newwin(leftover, COLS, (*active)->min_y + 1, 0);
(void)scrollok(packetwin, true);
- (void)wsetscrreg(packetwin, 0, leftover-1);
+ (void)wsetscrreg(packetwin, 0, leftover - 1);
} else {
(void)wresize(packetwin, leftover, COLS);
- (void)mvwin(packetwin, (*active)->min_y+1, 0);
- (void)wsetscrreg(packetwin, 0, leftover-1);
+ (void)mvwin(packetwin, (*active)->min_y + 1, 0);
+ (void)wsetscrreg(packetwin, 0, leftover - 1);
}
/*@ +onlytrans @*/
}
@@ -397,7 +418,7 @@ static void onsig(int sig UNUSED)
longjmp(assertbuf, 1);
}
-int main (int argc, char **argv)
+int main(int argc, char **argv)
{
#if defined(ALLOW_CONTROLSEND) || defined(ALLOW_RECONFIGURE)
unsigned int v;
@@ -408,11 +429,12 @@ int main (int argc, char **argv)
char *p, *controlsock = "/var/run/gpsd.sock";
fd_set select_set;
unsigned char buf[BUFLEN];
- char line[80];
+ char line[80], *explanation;
+ int bailout = 0;
gmt_offset = (int)tzoffset();
/*@ -observertrans @*/
- (void)putenv("TZ=GMT"); // for ctime()
+ (void)putenv("TZ=GMT"); // for ctime()
/*@ +observertrans @*/
/*@ -branchstate @*/
while ((option = getopt(argc, argv, "D:F:LVhl:")) != -1) {
@@ -427,7 +449,10 @@ int main (int argc, char **argv)
(void)printf("gpsmon: %s (revision %s)\n", VERSION, REVISION);
exit(0);
case 'L': /* list known device types */
- (void) fputs("General commands available per type. '+' means there are private commands.\n", stdout);
+ (void)
+ fputs
+ ("General commands available per type. '+' means there are private commands.\n",
+ stdout);
for (active = monitor_objects; *active; active++) {
(void)fputs("i l q ^S ^Q", stdout);
(void)fputc(' ', stdout);
@@ -471,8 +496,13 @@ int main (int argc, char **argv)
exit(1);
}
break;
- case 'h': case '?': default:
- (void)fputs("usage: gpsmon [-?hVl] [-D debuglevel] [-F controlsock] [server[:port:[device]]]\n", stderr);
+ case 'h':
+ case '?':
+ default:
+ (void)
+ fputs
+ ("usage: gpsmon [-?hVl] [-D debuglevel] [-F controlsock] [server[:port:[device]]]\n",
+ stderr);
exit(1);
}
}
@@ -486,26 +516,32 @@ int main (int argc, char **argv)
gpsd_init(&session, &context, NULL);
/*@ -boolops */
- if (optind>=argc||source.device==NULL||strchr(argv[optind], ':')!=NULL) {
+ if (optind >= argc || source.device == NULL
+ || strchr(argv[optind], ':') != NULL) {
(void)gps_open_r(source.server, source.port, &session.gpsdata);
if (session.gpsdata.gps_fd < 0) {
(void)fprintf(stderr,
"%s: connection failure on %s:%s, error %d = %s.\n",
- argv[0], source.server, source.port, session.gpsdata.gps_fd, netlib_errstr(session.gpsdata.gps_fd));
+ argv[0], source.server, source.port,
+ session.gpsdata.gps_fd,
+ netlib_errstr(session.gpsdata.gps_fd));
exit(1);
}
controlfd = open(controlsock, O_RDWR);
if (source.device != NULL)
- (void)gps_send(&session.gpsdata, "?WATCH={\"raw\":2,\"device\":\"%s\"}\r\n", source.device);
+ (void)gps_send(&session.gpsdata,
+ "?WATCH={\"raw\":2,\"device\":\"%s\"}\r\n",
+ source.device);
else
(void)gps_send(&session.gpsdata, "?WATCH={\"raw\":2}\r\n");
serial = false;
} else {
- (void)strlcpy(session.gpsdata.dev.path, argv[optind], sizeof(session.gpsdata.dev.path));
+ (void)strlcpy(session.gpsdata.dev.path, argv[optind],
+ sizeof(session.gpsdata.dev.path));
if (gpsd_activate(&session) == -1) {
gpsd_report(LOG_ERROR,
- "activation of device %s failed, errno=%d\n",
- session.gpsdata.dev.path, errno);
+ "activation of device %s failed, errno=%d\n",
+ session.gpsdata.dev.path, errno);
exit(2);
}
@@ -528,7 +564,8 @@ int main (int argc, char **argv)
if (logfile)
(void)fclose(logfile);
(void)endwin();
- (void)fputs("gpsmon: assertion failure, probable I/O error\n", stderr);
+ (void)fputs("gpsmon: assertion failure, probable I/O error\n",
+ stderr);
exit(1);
}
@@ -542,339 +579,402 @@ int main (int argc, char **argv)
#define CMDWINHEIGHT 1
/*@ -onlytrans @*/
- statwin = newwin(CMDWINHEIGHT, 30, 0, 0);
- cmdwin = newwin(CMDWINHEIGHT, 0, 0, 30);
- packetwin = newwin(0, 0, CMDWINHEIGHT, 0);
- if (statwin==NULL || cmdwin==NULL || packetwin==NULL)
+ statwin = newwin(CMDWINHEIGHT, 30, 0, 0);
+ cmdwin = newwin(CMDWINHEIGHT, 0, 0, 30);
+ packetwin = newwin(0, 0, CMDWINHEIGHT, 0);
+ if (statwin == NULL || cmdwin == NULL || packetwin == NULL)
goto quit;
(void)scrollok(packetwin, true);
- (void)wsetscrreg(packetwin, 0, LINES-CMDWINHEIGHT);
+ (void)wsetscrreg(packetwin, 0, LINES - CMDWINHEIGHT);
/*@ +onlytrans @*/
- (void)wmove(packetwin,0, 0);
+ (void)wmove(packetwin, 0, 0);
FD_ZERO(&select_set);
- /*@ -observertrans @*/
- for (;;) {
- type_name = session.device_type ? session.device_type->type_name : "Unknown device";
- (void)wattrset(statwin, A_BOLD);
- if (serial)
- display(statwin, 0, 0, "%s %4d %c %d",
- session.gpsdata.dev.path,
- gpsd_get_speed(&session.ttyset),
- session.gpsdata.dev.parity,
- session.gpsdata.dev.stopbits);
- else
- /*@ -nullpass @*/
- display(statwin, 0, 0, "%s:%s:%s",
- source.server, source.port, session.gpsdata.dev.path);
+
+ if ((bailout = setjmp(terminate)) == 0) {
+ /*@ -observertrans @*/
+ for (;;) {
+ /* *INDENT-OFF* */
+ type_name =
+ session.device_type ? session.device_type->type_name : "Unknown device";
+ /* *INDENT-ON* */
+ (void)wattrset(statwin, A_BOLD);
+ if (serial)
+ display(statwin, 0, 0, "%s %4d %c %d",
+ session.gpsdata.dev.path,
+ gpsd_get_speed(&session.ttyset),
+ session.gpsdata.dev.parity,
+ session.gpsdata.dev.stopbits);
+ else
+ /*@ -nullpass @*/
+ display(statwin, 0, 0, "%s:%s:%s",
+ source.server, source.port, session.gpsdata.dev.path);
/*@ +nullpass @*/
- (void)wattrset(statwin, A_NORMAL);
- (void)wmove(cmdwin, 0,0);
-
- /* get a packet -- calls gpsd_poll() */
- if ((len = readpkt()) > 0 && session.packet.outbuflen > 0) {
- /* switch types on packet receipt */
- /*@ -nullpass */
- if (session.packet.type != last_type) {
- last_type = session.packet.type;
- if (!switch_type(session.device_type))
- goto quit;
+ (void)wattrset(statwin, A_NORMAL);
+ (void)wmove(cmdwin, 0, 0);
+
+ /* get a packet -- calls gpsd_poll() */
+ if ((len = readpkt()) > 0 && session.packet.outbuflen > 0) {
+ /* switch types on packet receipt */
+ /*@ -nullpass */
+ if (session.packet.type != last_type) {
+ last_type = session.packet.type;
+ if (!switch_type(session.device_type))
+ longjmp(terminate, TERM_DRIVER_SWITCH);
+ }
+ /*@ +nullpass */
+
+ /* refresh all windows */
+ (void)wprintw(cmdwin, type_name);
+ (void)wprintw(cmdwin, "> ");
+ (void)wclrtoeol(cmdwin);
+ if (active != NULL && len > 0 && session.packet.outbuflen > 0)
+ (*active)->update();
+ (void)wprintw(packetwin, "(%d) ", session.packet.outbuflen);
+ packet_dump((char *)session.packet.outbuffer,
+ session.packet.outbuflen);
+ (void)wnoutrefresh(statwin);
+ (void)wnoutrefresh(cmdwin);
+ if (devicewin != NULL)
+ (void)wnoutrefresh(devicewin);
+ if (packetwin != NULL)
+ (void)wnoutrefresh(packetwin);
+ (void)doupdate();
}
- /*@ +nullpass */
-
- /* refresh all windows */
- (void)wprintw(cmdwin, type_name);
- (void)wprintw(cmdwin, "> ");
- (void)wclrtoeol(cmdwin);
- if (active != NULL && len > 0 && session.packet.outbuflen > 0)
- (*active)->update();
- (void)wprintw(packetwin, "(%d) ", session.packet.outbuflen);
- packet_dump((char *)session.packet.outbuffer,session.packet.outbuflen);
- (void)wnoutrefresh(statwin);
- (void)wnoutrefresh(cmdwin);
- if (devicewin != NULL)
- (void)wnoutrefresh(devicewin);
- if (packetwin != NULL)
- (void)wnoutrefresh(packetwin);
- (void)doupdate();
- }
- /* rest of this invoked only if user has pressed a key */
- FD_SET(0,&select_set);
- FD_SET(session.gpsdata.gps_fd,&select_set);
+ /* rest of this invoked only if user has pressed a key */
+ FD_SET(0, &select_set);
+ FD_SET(session.gpsdata.gps_fd, &select_set);
- if (select(FD_SETSIZE, &select_set, NULL, NULL, NULL) == -1)
- break;
+ if (select(FD_SETSIZE, &select_set, NULL, NULL, NULL) == -1)
+ break;
- if (FD_ISSET(0,&select_set)) {
- char *arg;
- (void)wmove(cmdwin, 0,(int)strlen(type_name)+2);
- (void)wrefresh(cmdwin);
- (void)echo();
- /*@ -usedef -compdef @*/
- (void)wgetnstr(cmdwin, line, 80);
- (void)noecho();
- if (packetwin != NULL)
- (void)wrefresh(packetwin);
- (void)wrefresh(cmdwin);
-
- if ((p = strchr(line,'\r')) != NULL)
- *p = '\0';
-
- if (line[0] == '\0')
- continue;
- /*@ +usedef +compdef @*/
-
- arg = line;
- if (isspace(line[1])) {
- for (arg = line+2; *arg != '\0' && isspace(*arg); arg++)
- arg++;
- arg++;
- } else
- arg = line + 1;
+ if (FD_ISSET(0, &select_set)) {
+ char *arg;
+ (void)wmove(cmdwin, 0, (int)strlen(type_name) + 2);
+ (void)wrefresh(cmdwin);
+ (void)echo();
+ /*@ -usedef -compdef @*/
+ (void)wgetnstr(cmdwin, line, 80);
+ (void)noecho();
+ if (packetwin != NULL)
+ (void)wrefresh(packetwin);
+ (void)wrefresh(cmdwin);
- if (active != NULL && (*active)->command != NULL) {
- status = (*active)->command(line);
- if (status == COMMAND_TERMINATE)
- goto quit;
- else if (status == COMMAND_MATCH)
+ if ((p = strchr(line, '\r')) != NULL)
+ *p = '\0';
+
+ if (line[0] == '\0')
continue;
- assert(status == COMMAND_UNKNOWN);
- }
- switch (line[0])
- {
+ /*@ +usedef +compdef @*/
+
+ arg = line;
+ if (isspace(line[1])) {
+ for (arg = line + 2; *arg != '\0' && isspace(*arg); arg++)
+ arg++;
+ arg++;
+ } else
+ arg = line + 1;
+
+ if (active != NULL && (*active)->command != NULL) {
+ status = (*active)->command(line);
+ if (status == COMMAND_TERMINATE)
+ goto quit;
+ else if (status == COMMAND_MATCH)
+ continue;
+ assert(status == COMMAND_UNKNOWN);
+ }
+ switch (line[0]) {
#ifdef ALLOW_RECONFIGURE
- case 'c': /* change cycle time */
- if (active == NULL)
- monitor_complain("No device defined yet");
- else if (serial) {
- double rate = strtod(arg, NULL);
- /* Ugh...should have a controlfd slot
- * in the session structure, really
- */
- if ((*active)->driver->rate_switcher) {
- int dfd = session.gpsdata.gps_fd;
- session.gpsdata.gps_fd = controlfd;
- if ((*active)->driver->rate_switcher(&session, rate)) {
- monitor_dump_send();
+ case 'c': /* change cycle time */
+ if (active == NULL)
+ monitor_complain("No device defined yet");
+ else if (serial) {
+ double rate = strtod(arg, NULL);
+ /* Ugh...should have a controlfd slot
+ * in the session structure, really
+ */
+ if ((*active)->driver->rate_switcher) {
+ int dfd = session.gpsdata.gps_fd;
+ session.gpsdata.gps_fd = controlfd;
+ /* *INDENT-OFF* */
+ if ((*active)->driver->rate_switcher(&session, rate)) {
+ monitor_dump_send();
+ } else
+ monitor_complain("Rate not supported.");
+ /* *INDENT-ON* */
+ session.gpsdata.gps_fd = dfd;
} else
- monitor_complain("Rate not supported.");
- session.gpsdata.gps_fd = dfd;
- } else
- monitor_complain("Device type has no rate switcher");
- } else {
- line[0] = 'c';
- /*@ -sefparams @*/
- assert(write(session.gpsdata.gps_fd, line, strlen(line)) != -1);
- /* discard response */
- assert(read(session.gpsdata.gps_fd, buf, sizeof(buf)) != -1);
- /*@ +sefparams @*/
- }
- break;
+ monitor_complain
+ ("Device type has no rate switcher");
+ } else {
+ line[0] = 'c';
+ /*@ -sefparams @*/
+ assert(write
+ (session.gpsdata.gps_fd, line,
+ strlen(line)) != -1);
+ /* discard response */
+ assert(read(session.gpsdata.gps_fd, buf, sizeof(buf))
+ != -1);
+ /*@ +sefparams @*/
+ }
+ break;
#endif /* ALLOW_RECONFIGURE */
- case 'i': /* start probing for subtype */
- if (active == NULL)
- monitor_complain("No GPS type detected.");
- else {
- if (strcspn(line, "01") == strlen(line))
- context.readonly = !context.readonly;
- else
- context.readonly = (atoi(line+1) == 0);
- (void)gpsd_switch_driver(&session,
- (*active)->driver->type_name);
- }
- break;
-
- case 'l': /* open logfile */
- if (logfile != NULL) {
- if (packetwin != NULL)
- (void)wprintw(packetwin, ">>> Logging to %s off", logfile);
- (void)fclose(logfile);
- }
+ case 'i': /* start probing for subtype */
+ if (active == NULL)
+ monitor_complain("No GPS type detected.");
+ else {
+ if (strcspn(line, "01") == strlen(line))
+ context.readonly = !context.readonly;
+ else
+ context.readonly = (atoi(line + 1) == 0);
+ /* *INDENT-OFF* */
+ (void)gpsd_switch_driver(&session,
+ (*active)->driver->type_name);
+ /* *INDENT-ON* */
+ }
+ break;
+
+ case 'l': /* open logfile */
+ if (logfile != NULL) {
+ if (packetwin != NULL)
+ (void)wprintw(packetwin,
+ ">>> Logging to %s off", logfile);
+ (void)fclose(logfile);
+ }
- if ((logfile = fopen(line+1,"a")) != NULL)
- if (packetwin != NULL)
- (void)wprintw(packetwin, ">>> Logging to %s on", logfile);
- break;
+ if ((logfile = fopen(line + 1, "a")) != NULL)
+ if (packetwin != NULL)
+ (void)wprintw(packetwin,
+ ">>> Logging to %s on", logfile);
+ break;
#ifdef ALLOW_RECONFIGURE
- case 'n': /* change mode */
- /* if argument not specified, toggle */
- if (strcspn(line, "01") == strlen(line))
- v = (unsigned int)TEXTUAL_PACKET_TYPE(session.packet.type);
- else
- v = (unsigned)atoi(line+1);
- if (active == NULL)
- monitor_complain("No device defined yet");
- else if (serial) {
- // FIXME: some sort of debug window display here?
- /* Ugh...should have a controlfd slot
- * in the session structure, really
- */
- if ((*active)->driver->mode_switcher) {
- int dfd = session.gpsdata.gps_fd;
- session.gpsdata.gps_fd = controlfd;
- (*active)->driver->mode_switcher(&session, (int)v);
- monitor_dump_send();
- (void)tcdrain(session.gpsdata.gps_fd);
- (void)usleep(50000);
- session.gpsdata.gps_fd = dfd;
+ case 'n': /* change mode */
+ /* if argument not specified, toggle */
+ if (strcspn(line, "01") == strlen(line)) {
+ /* *INDENT-OFF* */
+ v = (unsigned int)TEXTUAL_PACKET_TYPE(
+ session.packet.type);
+ /* *INDENT-ON* */
} else
- monitor_complain("Device type has no mode switcher");
- } else {
- line[0] = 'n';
- line[1] = ' ';
- line[2] = '0' + v;
- /*@ -sefparams @*/
- assert(write(session.gpsdata.gps_fd, line, strlen(line)) != -1);
- /* discard response */
- assert(read(session.gpsdata.gps_fd, buf, sizeof(buf)) != -1);
- /*@ +sefparams @*/
- }
- break;
+ v = (unsigned)atoi(line + 1);
+ if (active == NULL)
+ monitor_complain("No device defined yet");
+ else if (serial) {
+ // FIXME: some sort of debug window display here?
+ /* Ugh...should have a controlfd slot
+ * in the session structure, really
+ */
+ if ((*active)->driver->mode_switcher) {
+ int dfd = session.gpsdata.gps_fd;
+ session.gpsdata.gps_fd = controlfd;
+ (*active)->driver->mode_switcher(&session,
+ (int)v);
+ monitor_dump_send();
+ (void)tcdrain(session.gpsdata.gps_fd);
+ (void)usleep(50000);
+ session.gpsdata.gps_fd = dfd;
+ } else
+ monitor_complain
+ ("Device type has no mode switcher");
+ } else {
+ line[0] = 'n';
+ line[1] = ' ';
+ line[2] = '0' + v;
+ /*@ -sefparams @*/
+ assert(write
+ (session.gpsdata.gps_fd, line,
+ strlen(line)) != -1);
+ /* discard response */
+ assert(read(session.gpsdata.gps_fd, buf, sizeof(buf))
+ != -1);
+ /*@ +sefparams @*/
+ }
+ break;
#endif /* ALLOW_RECONFIGURE */
- case 'q': /* quit */
- goto quit;
+ case 'q': /* quit */
+ goto quit;
#ifdef ALLOW_RECONFIGURE
- case 's': /* change speed */
- if (active == NULL)
- monitor_complain("No device defined yet");
- else if (serial) {
- speed_t speed;
- char parity = session.gpsdata.dev.parity;
- unsigned int stopbits = (unsigned int)session.gpsdata.dev.stopbits;
- char *modespec;
-
- modespec = strchr(arg, ':');
- /*@ +charint @*/
- if (modespec!=NULL) {
- if (strchr("78", *++modespec) == NULL) {
- monitor_complain("No support for that word length.");
- break;
- }
- parity = *++modespec;
- if (strchr("NOE", parity) == NULL) {
- monitor_complain("What parity is '%c'?.", parity);
- break;
- }
- stopbits = (unsigned int)*++modespec;
- if (strchr("12", (char)stopbits) == NULL) {
- monitor_complain("Stop bits must be 1 or 2.");
- break;
+ case 's': /* change speed */
+ if (active == NULL)
+ monitor_complain("No device defined yet");
+ else if (serial) {
+ speed_t speed;
+ char parity = session.gpsdata.dev.parity;
+ unsigned int stopbits =
+ (unsigned int)session.gpsdata.dev.stopbits;
+ char *modespec;
+
+ modespec = strchr(arg, ':');
+ /*@ +charint @*/
+ if (modespec != NULL) {
+ if (strchr("78", *++modespec) == NULL) {
+ monitor_complain
+ ("No support for that word length.");
+ break;
+ }
+ parity = *++modespec;
+ if (strchr("NOE", parity) == NULL) {
+ monitor_complain("What parity is '%c'?.",
+ parity);
+ break;
+ }
+ stopbits = (unsigned int)*++modespec;
+ if (strchr("12", (char)stopbits) == NULL) {
+ monitor_complain("Stop bits must be 1 or 2.");
+ break;
+ }
+ stopbits = (unsigned int)(stopbits - '0');
}
- stopbits = (unsigned int)(stopbits-'0');
- }
- /*@ -charint @*/
- speed = (unsigned)atoi(arg);
- /* Ugh...should have a controlfd slot
- * in the session structure, really
- */
- if ((*active)->driver->speed_switcher) {
- int dfd = session.gpsdata.gps_fd;
- session.gpsdata.gps_fd = controlfd;
- if ((*active)->driver->speed_switcher(&session,
- speed,
- parity,
- (int)stopbits)) {
- monitor_dump_send();
- /*
- * See the comment attached to the 'B'
- * command in gpsd. Allow the control
- * string time to register at the GPS
- * before we do the baud rate switch,
- * which effectively trashes the UART's
- * buffer.
- */
- (void)tcdrain(session.gpsdata.gps_fd);
- (void)usleep(50000);
- (void)gpsd_set_speed(&session, speed,
- parity,
- stopbits);
+ /*@ -charint @*/
+ speed = (unsigned)atoi(arg);
+ /* Ugh...should have a controlfd slot
+ * in the session structure, really
+ */
+ /* *INDENT-OFF* */
+ if ((*active)->driver->speed_switcher) {
+ int dfd = session.gpsdata.gps_fd;
+ session.gpsdata.gps_fd = controlfd;
+ if ((*active)->
+ driver->speed_switcher(&session, speed,
+ parity, (int)
+ stopbits)) {
+ monitor_dump_send();
+ /*
+ * See the comment attached to the 'B'
+ * command in gpsd. Allow the control
+ * string time to register at the GPS
+ * before we do the baud rate switch,
+ * which effectively trashes the UART's
+ * buffer.
+ */
+ (void)tcdrain(session.gpsdata.gps_fd);
+ (void)usleep(50000);
+ (void)gpsd_set_speed(&session, speed,
+ parity, stopbits);
+ } else
+ monitor_complain
+ ("Speed/mode combination not supported.");
+ session.gpsdata.gps_fd = dfd;
} else
- monitor_complain("Speed/mode cobination not supported.");
- session.gpsdata.gps_fd = dfd;
- } else
- monitor_complain("Device type has no speed switcher");
- } else {
- line[0] = 'b';
- /*@ -sefparams @*/
- assert(write(session.gpsdata.gps_fd, line, strlen(line)) != -1);
- /* discard response */
- assert(read(session.gpsdata.gps_fd, buf, sizeof(buf)) != -1);
- /*@ +sefparams @*/
- }
- break;
+ monitor_complain
+ ("Device type has no speed switcher");
+ /* *INDENT-ON* */
+ } else {
+ line[0] = 'b';
+ /*@ -sefparams @*/
+ assert(write
+ (session.gpsdata.gps_fd, line,
+ strlen(line)) != -1);
+ /* discard response */
+ assert(read(session.gpsdata.gps_fd, buf, sizeof(buf))
+ != -1);
+ /*@ +sefparams @*/
+ }
+ break;
#endif /* ALLOW_RECONFIGURE */
- case 't': /* force device type */
- if (strlen(arg) > 0) {
- int matchcount = 0;
- const struct gps_type_t **dp, *forcetype = NULL;
- for (dp = gpsd_drivers; *dp; dp++) {
- if (strstr((*dp)->type_name, arg) != NULL) {
- forcetype = *dp;
- matchcount++;
+ case 't': /* force device type */
+ if (strlen(arg) > 0) {
+ int matchcount = 0;
+ const struct gps_type_t **dp, *forcetype = NULL;
+ for (dp = gpsd_drivers; *dp; dp++) {
+ if (strstr((*dp)->type_name, arg) != NULL) {
+ forcetype = *dp;
+ matchcount++;
+ }
+ }
+ if (matchcount == 0) {
+ monitor_complain
+ ("No driver type matches '%s'.", arg);
+ } else if (matchcount == 1) {
+ assert(forcetype != NULL);
+ /* *INDENT-OFF* */
+ if (switch_type(forcetype))
+ (void)gpsd_switch_driver(&session,
+ forcetype->type_name);
+ /* *INDENT-ON* */
+ } else {
+ monitor_complain
+ ("Multiple driver type names match '%s'.",
+ arg);
}
}
- if (matchcount == 0) {
- monitor_complain("No driver type matches '%s'.", arg);
- } else if (matchcount == 1) {
- assert(forcetype != NULL);
- if (switch_type(forcetype))
- (void)gpsd_switch_driver(&session, forcetype->type_name);
- } else {
- monitor_complain("Multiple driver type names match '%s'.", arg);
- }
- }
- break;
+ break;
#ifdef ALLOW_CONTROLSEND
- case 'x': /* send control packet */
- if (active == NULL)
- monitor_complain("No device defined yet");
- else {
- /*@ -compdef @*/
- int st = gpsd_hexpack(arg, (char*)buf, strlen(arg));
- if (st < 0)
- monitor_complain("Invalid hex string (error %d)", st);
- else if ((*active)->driver->control_send == NULL)
- monitor_complain("Device type has no control-send method.");
- else if (!monitor_control_send(buf, (size_t)st))
- monitor_complain("Control send failed.");
- }
+ case 'x': /* send control packet */
+ if (active == NULL)
+ monitor_complain("No device defined yet");
+ else {
+ /*@ -compdef @*/
+ int st = gpsd_hexpack(arg, (char *)buf, strlen(arg));
+ if (st < 0)
+ monitor_complain
+ ("Invalid hex string (error %d)", st);
+ else if ((*active)->driver->control_send == NULL)
+ monitor_complain
+ ("Device type has no control-send method.");
+ else if (!monitor_control_send(buf, (size_t) st))
+ monitor_complain("Control send failed.");
+ }
/*@ +compdef @*/
- break;
+ break;
- case 'X': /* send raw packet */
- /*@ -compdef @*/
- len = (ssize_t)gpsd_hexpack(arg, (char*)buf, strlen(arg));
- if (len < 0)
- monitor_complain("Invalid hex string (error %d)", len);
- else if (!monitor_raw_send(buf, (size_t)len))
- monitor_complain("Raw send failed.");
- /*@ +compdef @*/
- break;
+ case 'X': /* send raw packet */
+ /*@ -compdef @*/
+ len =
+ (ssize_t) gpsd_hexpack(arg, (char *)buf, strlen(arg));
+ if (len < 0)
+ monitor_complain("Invalid hex string (error %d)",
+ len);
+ else if (!monitor_raw_send(buf, (size_t) len))
+ monitor_complain("Raw send failed.");
+ /*@ +compdef @*/
+ break;
#endif /* ALLOW_CONTROLSEND */
- default:
- monitor_complain("Unknown command");
- break;
+ default:
+ monitor_complain("Unknown command");
+ break;
+ }
}
}
+ /*@ +nullpass @*/
+ /*@ +observertrans @*/
}
- /*@ +nullpass @*/
- /*@ +observertrans @*/
- quit:
+ quit:
+ /* we'll fall through to here on longjmp() */
gpsd_close(&session);
if (logfile)
(void)fclose(logfile);
(void)endwin();
+
+ explanation = NULL;
+ switch (bailout) {
+ case TERM_SELECT_FAILED:
+ explanation = "select(2) failed\n";
+ break;
+ case TERM_DRIVER_SWITCH:
+ explanation = "Driver type switch failed\n";
+ break;
+ case TERM_EMPTY_READ:
+ explanation = "Device went offline\n";
+ break;
+ case TERM_READ_ERROR:
+ explanation = "Read error from device\n";
+ break;
+ }
+
+ if (explanation != NULL)
+ (void)fputs(explanation, stderr);
exit(0);
}
diff --git a/gpspipe.c b/gpspipe.c
index cd481080..3b6b2e09 100644
--- a/gpspipe.c
+++ b/gpspipe.c
@@ -28,9 +28,9 @@
#include <sys/types.h>
#include <sys/stat.h>
#ifndef S_SPLINT_S
- #if HAVE_SYS_SOCKET_H
- #include <sys/socket.h>
- #endif /* HAVE_SYS_SOCKET_H */
+#if HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif /* HAVE_SYS_SOCKET_H */
#include <unistd.h>
#endif /* S_SPLINT_S */
#include <errno.h>
@@ -39,7 +39,7 @@
#include <stdbool.h>
#include <fcntl.h>
#if HAVE_TERMIOS
- #include <termios.h>
+#include <termios.h>
#endif /* HAVE_TERMIOS */
#include <assert.h>
#include "gpsd.h"
@@ -54,33 +54,35 @@ static void spinner(unsigned int, unsigned int);
/* Serial port variables */
static struct termios oldtio, newtio;
-static int fd_out = 1; /* output initially goes to standard output */
+static int fd_out = 1; /* output initially goes to standard output */
static char serbuf[255];
static int debug;
-static void daemonize(void)
+static void daemonize(void)
/* Daemonize me. */
{
int i;
pid_t pid;
/* Run as my child. */
- pid=fork();
- if (pid == -1) exit(1); /* fork error */
- if (pid>0) exit(0); /* parent exits */
+ pid = fork();
+ if (pid == -1)
+ exit(1); /* fork error */
+ if (pid > 0)
+ exit(0); /* parent exits */
/* Obtain a new process group. */
(void)setsid();
/* Close all open descriptors. */
- for(i=getdtablesize();i>=0;--i)
+ for (i = getdtablesize(); i >= 0; --i)
(void)close(i);
/* Reopen STDIN, STDOUT, STDERR to /dev/null. */
- i=open("/dev/null",O_RDWR); /* STDIN */
+ i = open("/dev/null", O_RDWR); /* STDIN */
/*@ -sefparams @*/
- assert(dup(i) != -1); /* STDOUT */
- assert(dup(i) != -1); /* STDERR */
+ assert(dup(i) != -1); /* STDOUT */
+ assert(dup(i) != -1); /* STDERR */
/* Know thy mask. */
(void)umask(0x033);
@@ -90,22 +92,22 @@ static void daemonize(void)
/*@ +sefparams @*/
/* Catch child sig */
- (void)signal(SIGCHLD,SIG_IGN);
+ (void)signal(SIGCHLD, SIG_IGN);
/* Ignore tty signals */
- (void)signal(SIGTSTP,SIG_IGN);
- (void)signal(SIGTTOU,SIG_IGN);
- (void)signal(SIGTTIN,SIG_IGN);
+ (void)signal(SIGTSTP, SIG_IGN);
+ (void)signal(SIGTTOU, SIG_IGN);
+ (void)signal(SIGTTIN, SIG_IGN);
}
-static void open_serial(char* device)
+static void open_serial(char *device)
/* open the serial port and set it up */
{
/*
* Open modem device for reading and writing and not as controlling
* tty.
*/
- if ((fd_out = open(device, O_RDWR|O_NOCTTY)) == -1) {
+ if ((fd_out = open(device, O_RDWR | O_NOCTTY)) == -1) {
fprintf(stderr, "gpspipe: error opening serial port\n");
exit(1);
}
@@ -117,16 +119,16 @@ static void open_serial(char* device)
}
/* Clear struct for new port settings. */
- /*@i@*/bzero(&newtio, sizeof(newtio));
+ /*@i@*/ bzero(&newtio, sizeof(newtio));
/* make it raw */
(void)cfmakeraw(&newtio);
/* set speed */
- /*@i@*/(void)cfsetospeed(&newtio, BAUDRATE);
+ /*@i@*/ (void)cfsetospeed(&newtio, BAUDRATE);
/* Clear the modem line and activate the settings for the port. */
- (void)tcflush(fd_out,TCIFLUSH);
- if (tcsetattr(fd_out,TCSANOW,&newtio) != 0) {
+ (void)tcflush(fd_out, TCIFLUSH);
+ if (tcsetattr(fd_out, TCSANOW, &newtio) != 0) {
(void)fprintf(stderr, "gpspipe: error configuring serial port\n");
exit(1);
}
@@ -134,11 +136,10 @@ static void open_serial(char* device)
static void usage(void)
{
- (void)fprintf(stderr, "Usage: gpspipe [OPTIONS] [server[:port[:device]]]\n\n"
- "-d Run as a daemon.\n"
- "-f [file] Write output to file.\n"
- "-h Show this help.\n"
- "-r Dump raw NMEA.\n"
+ (void)fprintf(stderr,
+ "Usage: gpspipe [OPTIONS] [server[:port[:device]]]\n\n"
+ "-d Run as a daemon.\n" "-f [file] Write output to file.\n"
+ "-h Show this help.\n" "-r Dump raw NMEA.\n"
"-R Dump super-raw mode (GPS binary).\n"
"-w Dump gpsd native data.\n"
"-l Sleep for ten seconds before connecting to gpsd.\n"
@@ -148,12 +149,11 @@ static void usage(void)
"-v Print a little spinner.\n"
"-V Print version and exit.\n\n"
"You must specify one, or both, of -r/-w.\n"
- "You must use -f if you use -d.\n"
- );
+ "You must use -f if you use -d.\n");
}
/*@ -compdestroy @*/
-int main( int argc, char **argv)
+int main(int argc, char **argv)
{
char buf[4096];
bool timestamp = false;
@@ -166,7 +166,7 @@ int main( int argc, char **argv)
long count = -1;
int option;
unsigned int vflag = 0, l = 0;
- FILE * fp;
+ FILE *fp;
unsigned int flags;
struct fixsource_t source;
@@ -195,7 +195,7 @@ int main( int argc, char **argv)
break;
case 'R':
flags |= WATCH_RAW;
- binary=true;
+ binary = true;
break;
case 'd':
daemon = true;
@@ -214,7 +214,7 @@ int main( int argc, char **argv)
watch = true;
break;
case 'V':
- (void)fprintf(stderr, "%s: %s (revision %s)\n",
+ (void)fprintf(stderr, "%s: %s (revision %s)\n",
argv[0], VERSION, REVISION);
exit(0);
case 's':
@@ -237,46 +237,47 @@ int main( int argc, char **argv)
} else
gpsd_source_spec(NULL, &source);
- if (serialport!=NULL && !raw) {
+ if (serialport != NULL && !raw) {
(void)fprintf(stderr, "gpspipe: use of '-s' requires '-r'.\n");
exit(1);
}
- if (outfile==NULL && daemon) {
+ if (outfile == NULL && daemon) {
(void)fprintf(stderr, "gpspipe: use of '-d' requires '-f'.\n");
exit(1);
}
if (!raw && !watch && !binary) {
- (void)fprintf(stderr, "gpspipe: one of '-R', '-r' or '-w' is required.\n");
+ (void)fprintf(stderr,
+ "gpspipe: one of '-R', '-r' or '-w' is required.\n");
exit(1);
}
/* Daemonize if the user requested it. */
if (daemon)
- daemonize();
+ daemonize();
/* Sleep for ten seconds if the user requested it. */
if (sleepy)
(void)sleep(10);
/* Open the output file if the user requested it. If the user
- requested '-R', we use the 'b' flag in fopen() to "do the right
- thing" in non-linux/unix OSes. */
- if (outfile==NULL) {
- fp = stdout;
+ * requested '-R', we use the 'b' flag in fopen() to "do the right
+ * thing" in non-linux/unix OSes. */
+ if (outfile == NULL) {
+ fp = stdout;
} else {
- if (binary)
- fp = fopen(outfile,"wb");
- else
- fp = fopen(outfile,"w");
-
- if (fp == NULL) {
- (void)fprintf(stderr,
- "gpspipe: unable to open output file: %s\n",
- outfile);
- exit(1);
- }
+ if (binary)
+ fp = fopen(outfile, "wb");
+ else
+ fp = fopen(outfile, "w");
+
+ if (fp == NULL) {
+ (void)fprintf(stderr,
+ "gpspipe: unable to open output file: %s\n",
+ outfile);
+ exit(1);
+ }
}
/* Open the serial port and set it up. */
@@ -300,7 +301,7 @@ int main( int argc, char **argv)
if ((isatty(STDERR_FILENO) == 0) || daemon)
vflag = 0;
- for(;;) {
+ for (;;) {
int i = 0;
int j = 0;
int readbytes = 0;
@@ -311,7 +312,7 @@ int main( int argc, char **argv)
/* reading directly from the socket avoides decode overhead */
readbytes = (int)read(gpsdata->gps_fd, buf, sizeof(buf));
if (readbytes > 0) {
- for (i = 0 ; i < readbytes ; i++) {
+ for (i = 0; i < readbytes; i++) {
char c = buf[i];
if (j < (int)(sizeof(serbuf) - 1)) {
serbuf[j++] = buf[i];
@@ -328,17 +329,17 @@ int main( int argc, char **argv)
}
}
if (fputc(c, fp) == EOF) {
- fprintf( stderr, "gpspipe: Write Error, %s(%d)\n",
- strerror(errno), errno);
+ fprintf(stderr, "gpspipe: Write Error, %s(%d)\n",
+ strerror(errno), errno);
exit(1);
}
if (c == '\n') {
if (serialport != NULL) {
- if (write(fd_out, serbuf, (size_t)j) == -1) {
+ if (write(fd_out, serbuf, (size_t) j) == -1) {
fprintf(stderr,
"gpspipe: Serial port write Error, %s(%d)\n",
- strerror(errno), errno);
+ strerror(errno), errno);
exit(1);
}
j = 0;
@@ -347,8 +348,9 @@ int main( int argc, char **argv)
new_line = true;
/* flush after every good line */
if (fflush(fp)) {
- (void)fprintf(stderr, "gpspipe: fflush Error, %s(%d)\n",
- strerror(errno), errno);
+ (void)fprintf(stderr,
+ "gpspipe: fflush Error, %s(%d)\n",
+ strerror(errno), errno);
exit(1);
}
if (count > 0) {
@@ -361,8 +363,8 @@ int main( int argc, char **argv)
}
} else {
if (readbytes == -1) {
- (void) fprintf(stderr, "gpspipe: read error %s(%d)\n",
- strerror(errno), errno);
+ (void)fprintf(stderr, "gpspipe: read error %s(%d)\n",
+ strerror(errno), errno);
exit(1);
} else {
exit(0);
@@ -380,14 +382,16 @@ int main( int argc, char **argv)
}
#endif /* __UNUSED__ */
- /*@i1@*/exit(0);
+ /*@i1@*/ exit(0);
}
+
/*@ +compdestroy @*/
-static void spinner (unsigned int v, unsigned int num) {
+static void spinner(unsigned int v, unsigned int num)
+{
char *spin = "|/-\\";
- (void)fprintf(stderr, "\010%c", spin[(num/(1<<(v-1))) % 4]);
+ (void)fprintf(stderr, "\010%c", spin[(num / (1 << (v - 1))) % 4]);
(void)fflush(stderr);
return;
}
diff --git a/gpsutils.c b/gpsutils.c
index 6b89ced5..6b94de0e 100644
--- a/gpsutils.c
+++ b/gpsutils.c
@@ -21,9 +21,9 @@
#include <QStringList>
#endif
-#define MONTHSPERYEAR 12 /* months per calendar year */
+#define MONTHSPERYEAR 12 /* months per calendar year */
-void gps_clear_fix(/*@out@*/struct gps_fix_t *fixp)
+void gps_clear_fix( /*@out@*/ struct gps_fix_t *fixp)
/* stuff a fix structure with recognizable out-of-band values */
{
fixp->time = NAN;
@@ -42,92 +42,55 @@ void gps_clear_fix(/*@out@*/struct gps_fix_t *fixp)
fixp->epc = NAN;
}
-#ifdef __UNUSED__
-unsigned int gps_valid_fields(/*@in@*/struct gps_fix_t *fixp)
-{
- unsigned int valid = 0;
-
- if (isnan(fixp->time) == 0)
- valid |= TIME_SET;
- if (fixp->mode != MODE_NOT_SEEN)
- valid |= MODE_SET;
- if (isnan(fixp->latitude) == 0 && isnan(fixp->longitude) == 0)
- valid |= LATLON_SET;
- if (isnan(fixp->altitude) == 0)
- valid |= ALTITUDE_SET;
- if (isnan(fixp->track) == 0)
- valid |= TRACK_SET;
- if (isnan(fixp->speed) == 0)
- valid |= SPEED_SET;
- if (isnan(fixp->climb) == 0)
- valid |= CLIMB_SET;
- if (isnan(fixp->ept) == 0)
- valid |= TIMERR_SET;
- if (isnan(fixp->epx) == 0 && isnan(fixp->epy) == 0)
- valid |= HERR_SET;
- if (isnan(fixp->epv) == 0)
- valid |= VERR_SET;
- if (isnan(fixp->epd) == 0)
- valid |= TRACKERR_SET;
- if (isnan(fixp->eps) == 0)
- valid |= SPEEDERR_SET;
- if (isnan(fixp->epc) == 0)
- valid |= CLIMBERR_SET;
- return valid;
-}
-#endif /* __UNUSED__ */
-
-void gps_merge_fix(/*@ out @*/struct gps_fix_t *to,
+void gps_merge_fix( /*@ out @*/ struct gps_fix_t *to,
gps_mask_t transfer,
- /*@ in @*/struct gps_fix_t *from)
+ /*@ in @*/ struct gps_fix_t *from)
/* merge new data into an old fix */
{
if ((NULL == to) || (NULL == from))
return;
- if ((transfer & TIME_SET)!=0)
+ if ((transfer & TIME_IS) != 0)
to->time = from->time;
- if ((transfer & LATLON_SET)!=0) {
+ if ((transfer & LATLON_IS) != 0) {
to->latitude = from->latitude;
to->longitude = from->longitude;
}
- if ((transfer & MODE_SET)!=0)
+ if ((transfer & MODE_IS) != 0)
to->mode = from->mode;
- if ((transfer & ALTITUDE_SET)!=0)
+ if ((transfer & ALTITUDE_IS) != 0)
to->altitude = from->altitude;
- if ((transfer & TRACK_SET)!=0)
+ if ((transfer & TRACK_IS) != 0)
to->track = from->track;
- if ((transfer & SPEED_SET)!=0)
+ if ((transfer & SPEED_IS) != 0)
to->speed = from->speed;
- if ((transfer & CLIMB_SET)!=0)
+ if ((transfer & CLIMB_IS) != 0)
to->climb = from->climb;
- if ((transfer & TIMERR_SET)!=0)
+ if ((transfer & TIMERR_IS) != 0)
to->ept = from->ept;
- if ((transfer & HERR_SET)!=0) {
+ if ((transfer & HERR_IS) != 0) {
to->epx = from->epx;
to->epy = from->epy;
}
- if ((transfer & VERR_SET)!=0)
+ if ((transfer & VERR_IS) != 0)
to->epv = from->epv;
- if ((transfer & SPEEDERR_SET)!=0)
+ if ((transfer & SPEEDERR_IS) != 0)
to->eps = from->eps;
- if ((transfer & CLIMBERR_SET)!=0)
- to->epc = from->epc;
}
double timestamp(void)
{
struct timeval tv;
(void)gettimeofday(&tv, NULL);
- /*@i1@*/return(tv.tv_sec + tv.tv_usec*1e-6);
+ /*@i1@*/ return (tv.tv_sec + tv.tv_usec * 1e-6);
}
-time_t mkgmtime(register struct tm *t)
+time_t mkgmtime(register struct tm * t)
/* struct tm to seconds since Unix epoch */
{
register int year;
register time_t result;
static const int cumdays[MONTHSPERYEAR] =
- {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
+ { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
/*@ +matchanyintegral @*/
year = 1900 + t->tm_year + t->tm_mon / MONTHSPERYEAR;
@@ -137,7 +100,7 @@ time_t mkgmtime(register struct tm *t)
result += (year - 1600) / 400;
if ((year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0) &&
(t->tm_mon % MONTHSPERYEAR) < 2)
- result--;
+ result--;
result += t->tm_mday - 1;
result *= 24;
result += t->tm_hour;
@@ -149,7 +112,7 @@ time_t mkgmtime(register struct tm *t)
return (result);
}
-double iso8601_to_unix(/*@in@*/char *isotime)
+double iso8601_to_unix( /*@in@*/ char *isotime)
/* ISO8601 UTC to Unix UTC */
{
#ifndef USE_QT
@@ -157,7 +120,7 @@ double iso8601_to_unix(/*@in@*/char *isotime)
double usec;
struct tm tm;
- /*@i1@*/dp = strptime(isotime, "%Y-%m-%dT%H:%M:%S", &tm);
+ /*@i1@*/ dp = strptime(isotime, "%Y-%m-%dT%H:%M:%S", &tm);
if (dp != NULL && *dp == '.')
usec = strtod(dp, NULL);
else
@@ -170,12 +133,14 @@ double iso8601_to_unix(/*@in@*/char *isotime)
QDateTime d = QDateTime::fromString(isotime, Qt::ISODate);
QStringList sl = t.split(".");
if (sl.size() > 1)
- usec = sl[1].toInt() / pow(10., (double)sl[1].size());
+ usec = sl[1].toInt() / pow(10., (double)sl[1].size());
return d.toTime_t() + usec;
#endif
}
-/*@observer@*/char *unix_to_iso8601(double fixtime, /*@ out @*/char isotime[], size_t len)
+/* *INDENT-OFF* */
+/*@observer@*/char *unix_to_iso8601(double fixtime, /*@ out @*/
+ char isotime[], size_t len)
/* Unix UTC time to ISO8601, no timezone adjustment */
/* example: 2007-12-11T23:38:51.0Z */
{
@@ -186,15 +151,16 @@ double iso8601_to_unix(/*@in@*/char *isotime)
char fractstr[10];
fractional = modf(fixtime, &integral);
- intfixtime = (time_t)integral;
+ intfixtime = (time_t) integral;
(void)gmtime_r(&intfixtime, &when);
(void)strftime(timestr, sizeof(timestr), "%Y-%m-%dT%H:%M:%S", &when);
(void)snprintf(fractstr, sizeof(fractstr), "%.1f", fractional);
/* add fractional part, ignore leading 0; "0.2" -> ".2" */
- (void)snprintf(isotime, len, "%s%sZ", timestr, fractstr+1);
+ (void)snprintf(isotime, len, "%s%sZ", timestr, fractstr + 1);
return isotime;
}
+/* *INDENT-ON* */
/*
* The 'week' part of GPS dates are specified in weeks since 0000 on 06
@@ -210,8 +176,8 @@ double iso8601_to_unix(/*@in@*/char *isotime)
*
* Note: This time will need to be corrected for leap seconds.
*/
-#define GPS_EPOCH 315964800 /* GPS epoch in Unix time */
-#define SECS_PER_WEEK (60*60*24*7) /* seconds per week */
+#define GPS_EPOCH 315964800 /* GPS epoch in Unix time */
+#define SECS_PER_WEEK (60*60*24*7) /* seconds per week */
#define GPS_ROLLOVER (1024*SECS_PER_WEEK) /* rollover period */
double gpstime_to_unix(int week, double tow)
@@ -223,13 +189,16 @@ double gpstime_to_unix(int week, double tow)
else {
time_t now, last_rollover;
(void)time(&now);
- last_rollover = GPS_EPOCH+((now-GPS_EPOCH)/GPS_ROLLOVER)*GPS_ROLLOVER;
- /*@i@*/fixtime = last_rollover + (week * SECS_PER_WEEK) + tow;
+ last_rollover =
+ GPS_EPOCH + ((now - GPS_EPOCH) / GPS_ROLLOVER) * GPS_ROLLOVER;
+ /*@i@*/ fixtime = last_rollover + (week * SECS_PER_WEEK) + tow;
}
return fixtime;
}
-void unix_to_gpstime(double unixtime, /*@out@*/int *week, /*@out@*/double *tow)
+void unix_to_gpstime(double unixtime,
+ /*@out@*/ int *week,
+ /*@out@*/ double *tow)
{
unixtime -= GPS_EPOCH;
*week = (int)(unixtime / SECS_PER_WEEK);
@@ -241,66 +210,66 @@ void unix_to_gpstime(double unixtime, /*@out@*/int *week, /*@out@*/double *tow)
double earth_distance(double lat1, double lon1, double lat2, double lon2)
/* distance in meters between two points specified in degrees. */
{
- /*
- * this is a translation of the javascript implementation of the
- * Vincenty distance formula by Chris Veness. See
- * http://www.movable-type.co.uk/scripts/latlong-vincenty.html
- */
- double a, b, f; // WGS-84 ellipsoid params
- double L, L_P, U1, U2, s_U1, c_U1, s_U2, c_U2;
- double uSq, A, B, d_S, lambda;
- double s_L, c_L, s_S, C;
- double c_S, S, s_A, c_SqA, c_2SM;
- int i = 100;
-
- a = WGS84A;
- b = WGS84B;
- f = 1/WGS84F;
- L = Deg2Rad(lon2 - lon1);
- U1 = atan((1 - f) * tan(Deg2Rad(lat1)));
- U2 = atan((1 - f) * tan(Deg2Rad(lat2)));
- s_U1 = sin(U1);
- c_U1 = cos(U1);
- s_U2 = sin(U2);
- c_U2 = cos(U2);
- lambda = L;
-
- do {
- s_L = sin(lambda);
- c_L = cos(lambda);
- s_S = sqrt((c_U2 * s_L) * (c_U2 * s_L) +
- (c_U1 * s_U2 - s_U1 * c_U2 * c_L) *
- (c_U1 * s_U2 - s_U1 * c_U2 * c_L));
-
- if (s_S==0)
- return 0;
-
- c_S = s_U1 * s_U2 + c_U1 * c_U2 * c_L;
- S = atan2(s_S, c_S);
- s_A = c_U1 * c_U2 * s_L / s_S;
- c_SqA = 1 - s_A * s_A;
- c_2SM = c_S - 2 * s_U1 * s_U2 / c_SqA;
-
- if (isnan(c_2SM))
- c_2SM = 0;
-
- C = f / 16 * c_SqA * (4 + f * (4 - 3 * c_SqA));
- L_P = lambda;
- lambda = L + (1 - C) * f * s_A *
- (S + C * s_S * (c_2SM + C * c_S * (2 * c_2SM * c_2SM - 1)));
- } while ((fabs(lambda - L_P) > 1.0e-12) && (--i > 0));
-
- if (i == 0)
- return NAN; // formula failed to converge
-
- uSq = c_SqA * ((a*a) - (b*b)) / (b*b);
- A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));
- B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));
- d_S = B * s_S * (c_2SM + B/4 *
- (c_S * (-1 + 2 * c_2SM * c_2SM) - B/6 * c_2SM *
- (-3 + 4 * s_S * s_S) * (-3 + 4 * c_2SM * c_2SM)));
-
- return(WGS84B * A * (S - d_S));
+ /*
+ * this is a translation of the javascript implementation of the
+ * Vincenty distance formula by Chris Veness. See
+ * http://www.movable-type.co.uk/scripts/latlong-vincenty.html
+ */
+ double a, b, f; // WGS-84 ellipsoid params
+ double L, L_P, U1, U2, s_U1, c_U1, s_U2, c_U2;
+ double uSq, A, B, d_S, lambda;
+ double s_L, c_L, s_S, C;
+ double c_S, S, s_A, c_SqA, c_2SM;
+ int i = 100;
+
+ a = WGS84A;
+ b = WGS84B;
+ f = 1 / WGS84F;
+ L = Deg2Rad(lon2 - lon1);
+ U1 = atan((1 - f) * tan(Deg2Rad(lat1)));
+ U2 = atan((1 - f) * tan(Deg2Rad(lat2)));
+ s_U1 = sin(U1);
+ c_U1 = cos(U1);
+ s_U2 = sin(U2);
+ c_U2 = cos(U2);
+ lambda = L;
+
+ do {
+ s_L = sin(lambda);
+ c_L = cos(lambda);
+ s_S = sqrt((c_U2 * s_L) * (c_U2 * s_L) +
+ (c_U1 * s_U2 - s_U1 * c_U2 * c_L) *
+ (c_U1 * s_U2 - s_U1 * c_U2 * c_L));
+
+ if (s_S == 0)
+ return 0;
+
+ c_S = s_U1 * s_U2 + c_U1 * c_U2 * c_L;
+ S = atan2(s_S, c_S);
+ s_A = c_U1 * c_U2 * s_L / s_S;
+ c_SqA = 1 - s_A * s_A;
+ c_2SM = c_S - 2 * s_U1 * s_U2 / c_SqA;
+
+ if (isnan(c_2SM))
+ c_2SM = 0;
+
+ C = f / 16 * c_SqA * (4 + f * (4 - 3 * c_SqA));
+ L_P = lambda;
+ lambda = L + (1 - C) * f * s_A *
+ (S + C * s_S * (c_2SM + C * c_S * (2 * c_2SM * c_2SM - 1)));
+ } while ((fabs(lambda - L_P) > 1.0e-12) && (--i > 0));
+
+ if (i == 0)
+ return NAN; // formula failed to converge
+
+ uSq = c_SqA * ((a * a) - (b * b)) / (b * b);
+ A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)));
+ B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)));
+ d_S = B * s_S * (c_2SM + B / 4 *
+ (c_S * (-1 + 2 * c_2SM * c_2SM) - B / 6 * c_2SM *
+ (-3 + 4 * s_S * s_S) * (-3 + 4 * c_2SM * c_2SM)));
+
+ return (WGS84B * A * (S - d_S));
}
/*****************************************************************************
@@ -391,104 +360,105 @@ driver.
******************************************************************************/
-void clear_dop(/*@out@*/struct dop_t *dop)
+void clear_dop( /*@out@*/ struct dop_t *dop)
{
- dop->xdop = dop->ydop = dop->vdop = dop->tdop = dop->hdop = dop->pdop = dop->gdop = NAN;
+ dop->xdop = dop->ydop = dop->vdop = dop->tdop = dop->hdop = dop->pdop =
+ dop->gdop = NAN;
}
/*@ -fixedformalarray -mustdefine @*/
-static bool invert(double mat[4][4], /*@out@*/double inverse[4][4])
+static bool invert(double mat[4][4], /*@out@*/ double inverse[4][4])
{
- // Find all NECESSARY 2x2 subdeterminants
- double Det2_12_01 = mat[1][0]*mat[2][1] - mat[1][1]*mat[2][0];
- double Det2_12_02 = mat[1][0]*mat[2][2] - mat[1][2]*mat[2][0];
- //double Det2_12_03 = mat[1][0]*mat[2][3] - mat[1][3]*mat[2][0];
- double Det2_12_12 = mat[1][1]*mat[2][2] - mat[1][2]*mat[2][1];
- //double Det2_12_13 = mat[1][1]*mat[2][3] - mat[1][3]*mat[2][1];
- //double Det2_12_23 = mat[1][2]*mat[2][3] - mat[1][3]*mat[2][2];
- double Det2_13_01 = mat[1][0]*mat[3][1] - mat[1][1]*mat[3][0];
- //double Det2_13_02 = mat[1][0]*mat[3][2] - mat[1][2]*mat[3][0];
- double Det2_13_03 = mat[1][0]*mat[3][3] - mat[1][3]*mat[3][0];
- //double Det2_13_12 = mat[1][1]*mat[3][2] - mat[1][2]*mat[3][1];
- double Det2_13_13 = mat[1][1]*mat[3][3] - mat[1][3]*mat[3][1];
- //double Det2_13_23 = mat[1][2]*mat[3][3] - mat[1][3]*mat[3][2];
- double Det2_23_01 = mat[2][0]*mat[3][1] - mat[2][1]*mat[3][0];
- double Det2_23_02 = mat[2][0]*mat[3][2] - mat[2][2]*mat[3][0];
- double Det2_23_03 = mat[2][0]*mat[3][3] - mat[2][3]*mat[3][0];
- double Det2_23_12 = mat[2][1]*mat[3][2] - mat[2][2]*mat[3][1];
- double Det2_23_13 = mat[2][1]*mat[3][3] - mat[2][3]*mat[3][1];
- double Det2_23_23 = mat[2][2]*mat[3][3] - mat[2][3]*mat[3][2];
-
- // Find all NECESSARY 3x3 subdeterminants
- double Det3_012_012 = mat[0][0]*Det2_12_12 - mat[0][1]*Det2_12_02
- + mat[0][2]*Det2_12_01;
- //double Det3_012_013 = mat[0][0]*Det2_12_13 - mat[0][1]*Det2_12_03
- // + mat[0][3]*Det2_12_01;
- //double Det3_012_023 = mat[0][0]*Det2_12_23 - mat[0][2]*Det2_12_03
- // + mat[0][3]*Det2_12_02;
- //double Det3_012_123 = mat[0][1]*Det2_12_23 - mat[0][2]*Det2_12_13
- // + mat[0][3]*Det2_12_12;
- //double Det3_013_012 = mat[0][0]*Det2_13_12 - mat[0][1]*Det2_13_02
- // + mat[0][2]*Det2_13_01;
- double Det3_013_013 = mat[0][0]*Det2_13_13 - mat[0][1]*Det2_13_03
- + mat[0][3]*Det2_13_01;
- //double Det3_013_023 = mat[0][0]*Det2_13_23 - mat[0][2]*Det2_13_03
- // + mat[0][3]*Det2_13_02;
- //double Det3_013_123 = mat[0][1]*Det2_13_23 - mat[0][2]*Det2_13_13
- // + mat[0][3]*Det2_13_12;
- //double Det3_023_012 = mat[0][0]*Det2_23_12 - mat[0][1]*Det2_23_02
- // + mat[0][2]*Det2_23_01;
- //double Det3_023_013 = mat[0][0]*Det2_23_13 - mat[0][1]*Det2_23_03
- // + mat[0][3]*Det2_23_01;
- double Det3_023_023 = mat[0][0]*Det2_23_23 - mat[0][2]*Det2_23_03
- + mat[0][3]*Det2_23_02;
- //double Det3_023_123 = mat[0][1]*Det2_23_23 - mat[0][2]*Det2_23_13
- // + mat[0][3]*Det2_23_12;
- double Det3_123_012 = mat[1][0]*Det2_23_12 - mat[1][1]*Det2_23_02
- + mat[1][2]*Det2_23_01;
- double Det3_123_013 = mat[1][0]*Det2_23_13 - mat[1][1]*Det2_23_03
- + mat[1][3]*Det2_23_01;
- double Det3_123_023 = mat[1][0]*Det2_23_23 - mat[1][2]*Det2_23_03
- + mat[1][3]*Det2_23_02;
- double Det3_123_123 = mat[1][1]*Det2_23_23 - mat[1][2]*Det2_23_13
- + mat[1][3]*Det2_23_12;
-
- // Find the 4x4 determinant
- static double det;
- det = mat[0][0]*Det3_123_123
- - mat[0][1]*Det3_123_023
- + mat[0][2]*Det3_123_013
- - mat[0][3]*Det3_123_012;
-
- // Very small determinants probably reflect floating-point fuzz near zero
- if (fabs(det) < 0.0001)
- return false;
-
- inverse[0][0] = Det3_123_123 / det;
- //inverse[0][1] = -Det3_023_123 / det;
- //inverse[0][2] = Det3_013_123 / det;
- //inverse[0][3] = -Det3_012_123 / det;
-
- //inverse[1][0] = -Det3_123_023 / det;
- inverse[1][1] = Det3_023_023 / det;
- //inverse[1][2] = -Det3_013_023 / det;
- //inverse[1][3] = Det3_012_023 / det;
-
- //inverse[2][0] = Det3_123_013 / det;
- //inverse[2][1] = -Det3_023_013 / det;
- inverse[2][2] = Det3_013_013 / det;
- //inverse[2][3] = -Det3_012_013 / det;
-
- //inverse[3][0] = -Det3_123_012 / det;
- //inverse[3][1] = Det3_023_012 / det;
- //inverse[3][2] = -Det3_013_012 / det;
- inverse[3][3] = Det3_012_012 / det;
-
- return true;
+ // Find all NECESSARY 2x2 subdeterminants
+ double Det2_12_01 = mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0];
+ double Det2_12_02 = mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0];
+ //double Det2_12_03 = mat[1][0]*mat[2][3] - mat[1][3]*mat[2][0];
+ double Det2_12_12 = mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1];
+ //double Det2_12_13 = mat[1][1]*mat[2][3] - mat[1][3]*mat[2][1];
+ //double Det2_12_23 = mat[1][2]*mat[2][3] - mat[1][3]*mat[2][2];
+ double Det2_13_01 = mat[1][0] * mat[3][1] - mat[1][1] * mat[3][0];
+ //double Det2_13_02 = mat[1][0]*mat[3][2] - mat[1][2]*mat[3][0];
+ double Det2_13_03 = mat[1][0] * mat[3][3] - mat[1][3] * mat[3][0];
+ //double Det2_13_12 = mat[1][1]*mat[3][2] - mat[1][2]*mat[3][1];
+ double Det2_13_13 = mat[1][1] * mat[3][3] - mat[1][3] * mat[3][1];
+ //double Det2_13_23 = mat[1][2]*mat[3][3] - mat[1][3]*mat[3][2];
+ double Det2_23_01 = mat[2][0] * mat[3][1] - mat[2][1] * mat[3][0];
+ double Det2_23_02 = mat[2][0] * mat[3][2] - mat[2][2] * mat[3][0];
+ double Det2_23_03 = mat[2][0] * mat[3][3] - mat[2][3] * mat[3][0];
+ double Det2_23_12 = mat[2][1] * mat[3][2] - mat[2][2] * mat[3][1];
+ double Det2_23_13 = mat[2][1] * mat[3][3] - mat[2][3] * mat[3][1];
+ double Det2_23_23 = mat[2][2] * mat[3][3] - mat[2][3] * mat[3][2];
+
+ // Find all NECESSARY 3x3 subdeterminants
+ double Det3_012_012 = mat[0][0] * Det2_12_12 - mat[0][1] * Det2_12_02
+ + mat[0][2] * Det2_12_01;
+ //double Det3_012_013 = mat[0][0]*Det2_12_13 - mat[0][1]*Det2_12_03
+ // + mat[0][3]*Det2_12_01;
+ //double Det3_012_023 = mat[0][0]*Det2_12_23 - mat[0][2]*Det2_12_03
+ // + mat[0][3]*Det2_12_02;
+ //double Det3_012_123 = mat[0][1]*Det2_12_23 - mat[0][2]*Det2_12_13
+ // + mat[0][3]*Det2_12_12;
+ //double Det3_013_012 = mat[0][0]*Det2_13_12 - mat[0][1]*Det2_13_02
+ // + mat[0][2]*Det2_13_01;
+ double Det3_013_013 = mat[0][0] * Det2_13_13 - mat[0][1] * Det2_13_03
+ + mat[0][3] * Det2_13_01;
+ //double Det3_013_023 = mat[0][0]*Det2_13_23 - mat[0][2]*Det2_13_03
+ // + mat[0][3]*Det2_13_02;
+ //double Det3_013_123 = mat[0][1]*Det2_13_23 - mat[0][2]*Det2_13_13
+ // + mat[0][3]*Det2_13_12;
+ //double Det3_023_012 = mat[0][0]*Det2_23_12 - mat[0][1]*Det2_23_02
+ // + mat[0][2]*Det2_23_01;
+ //double Det3_023_013 = mat[0][0]*Det2_23_13 - mat[0][1]*Det2_23_03
+ // + mat[0][3]*Det2_23_01;
+ double Det3_023_023 = mat[0][0] * Det2_23_23 - mat[0][2] * Det2_23_03
+ + mat[0][3] * Det2_23_02;
+ //double Det3_023_123 = mat[0][1]*Det2_23_23 - mat[0][2]*Det2_23_13
+ // + mat[0][3]*Det2_23_12;
+ double Det3_123_012 = mat[1][0] * Det2_23_12 - mat[1][1] * Det2_23_02
+ + mat[1][2] * Det2_23_01;
+ double Det3_123_013 = mat[1][0] * Det2_23_13 - mat[1][1] * Det2_23_03
+ + mat[1][3] * Det2_23_01;
+ double Det3_123_023 = mat[1][0] * Det2_23_23 - mat[1][2] * Det2_23_03
+ + mat[1][3] * Det2_23_02;
+ double Det3_123_123 = mat[1][1] * Det2_23_23 - mat[1][2] * Det2_23_13
+ + mat[1][3] * Det2_23_12;
+
+ // Find the 4x4 determinant
+ static double det;
+ det = mat[0][0] * Det3_123_123
+ - mat[0][1] * Det3_123_023
+ + mat[0][2] * Det3_123_013 - mat[0][3] * Det3_123_012;
+
+ // Very small determinants probably reflect floating-point fuzz near zero
+ if (fabs(det) < 0.0001)
+ return false;
+
+ inverse[0][0] = Det3_123_123 / det;
+ //inverse[0][1] = -Det3_023_123 / det;
+ //inverse[0][2] = Det3_013_123 / det;
+ //inverse[0][3] = -Det3_012_123 / det;
+
+ //inverse[1][0] = -Det3_123_023 / det;
+ inverse[1][1] = Det3_023_023 / det;
+ //inverse[1][2] = -Det3_013_023 / det;
+ //inverse[1][3] = Det3_012_023 / det;
+
+ //inverse[2][0] = Det3_123_013 / det;
+ //inverse[2][1] = -Det3_023_013 / det;
+ inverse[2][2] = Det3_013_013 / det;
+ //inverse[2][3] = -Det3_012_013 / det;
+
+ //inverse[3][0] = -Det3_123_012 / det;
+ //inverse[3][1] = Det3_023_012 / det;
+ //inverse[3][2] = -Det3_013_012 / det;
+ inverse[3][3] = Det3_012_012 / det;
+
+ return true;
}
+
/*@ +fixedformalarray +mustdefine @*/
-gps_mask_t fill_dop(const struct gps_data_t *gpsdata, struct dop_t *dop)
+gps_mask_t fill_dop(const struct gps_data_t * gpsdata, struct dop_t * dop)
{
double prod[4][4];
double inv[4][4];
@@ -501,18 +471,19 @@ gps_mask_t fill_dop(const struct gps_data_t *gpsdata, struct dop_t *dop)
for (k = 0; k < MAXCHANNELS; k++) {
if (gpsdata->used[k])
gpsd_report(LOG_INF, "az: %d el: %d SV: %d\n",
- gpsdata->azimuth[k], gpsdata->elevation[k], gpsdata->used[k]);
+ gpsdata->azimuth[k], gpsdata->elevation[k],
+ gpsdata->used[k]);
}
#endif /* __UNUSED__ */
for (n = k = 0; k < gpsdata->satellites_used; k++) {
if (gpsdata->used[k] == 0)
continue;
- satpos[n][0] = sin(gpsdata->azimuth[k]*DEG_2_RAD)
- * cos(gpsdata->elevation[k]*DEG_2_RAD);
- satpos[n][1] = cos(gpsdata->azimuth[k]*DEG_2_RAD)
- * cos(gpsdata->elevation[k]*DEG_2_RAD);
- satpos[n][2] = sin(gpsdata->elevation[k]*DEG_2_RAD);
+ satpos[n][0] = sin(gpsdata->azimuth[k] * DEG_2_RAD)
+ * cos(gpsdata->elevation[k] * DEG_2_RAD);
+ satpos[n][1] = cos(gpsdata->azimuth[k] * DEG_2_RAD)
+ * cos(gpsdata->elevation[k] * DEG_2_RAD);
+ satpos[n][2] = sin(gpsdata->elevation[k] * DEG_2_RAD);
satpos[n][3] = 1;
n++;
}
@@ -525,8 +496,8 @@ gps_mask_t fill_dop(const struct gps_data_t *gpsdata, struct dop_t *dop)
}
#endif /* __UNUSED__ */
- for (i = 0; i < 4; ++i) { //< rows
- for (j = 0; j < 4; ++j) { //< cols
+ for (i = 0; i < 4; ++i) { //< rows
+ for (j = 0; j < 4; ++j) { //< cols
prod[i][j] = 0.0;
for (k = 0; k < n; ++k) {
prod[i][j] += satpos[k][i] * satpos[k][j];
@@ -557,8 +528,8 @@ gps_mask_t fill_dop(const struct gps_data_t *gpsdata, struct dop_t *dop)
} else {
#ifndef USE_QT
gpsd_report(LOG_DATA,
- "LOS matrix is singular, can't calculate DOPs - source '%s'\n",
- gpsdata->dev.path);
+ "LOS matrix is singular, can't calculate DOPs - source '%s'\n",
+ gpsdata->dev.path);
#endif
return 0;
}
@@ -572,39 +543,35 @@ gps_mask_t fill_dop(const struct gps_data_t *gpsdata, struct dop_t *dop)
gdop = sqrt(inv[0][0] + inv[1][1] + inv[2][2] + inv[3][3]);
#ifndef USE_QT
- gpsd_report(LOG_DATA, "DOPS computed/reported: X=%f/%f, Y=%f/%f, H=%f/%f, V=%f/%f, P=%f/%f, T=%f/%f, G=%f/%f\n",
- xdop, dop->xdop,
- ydop, dop->ydop,
- hdop, dop->hdop,
- vdop, dop->vdop,
- pdop, dop->pdop,
- tdop, dop->tdop,
- gdop, dop->gdop);
+ gpsd_report(LOG_DATA,
+ "DOPS computed/reported: X=%f/%f, Y=%f/%f, H=%f/%f, V=%f/%f, P=%f/%f, T=%f/%f, G=%f/%f\n",
+ xdop, dop->xdop, ydop, dop->ydop, hdop, dop->hdop, vdop,
+ dop->vdop, pdop, dop->pdop, tdop, dop->tdop, gdop, dop->gdop);
#endif
/*@ -usedef @*/
- if (isnan(dop->xdop)!=0) {
+ if (isnan(dop->xdop) != 0) {
dop->xdop = xdop;
}
- if (isnan(dop->ydop)!=0) {
+ if (isnan(dop->ydop) != 0) {
dop->ydop = ydop;
}
- if (isnan(dop->hdop)!=0) {
+ if (isnan(dop->hdop) != 0) {
dop->hdop = hdop;
}
- if (isnan(dop->vdop)!=0) {
+ if (isnan(dop->vdop) != 0) {
dop->vdop = vdop;
}
- if (isnan(dop->pdop)!=0) {
+ if (isnan(dop->pdop) != 0) {
dop->pdop = pdop;
}
- if (isnan(dop->tdop)!=0) {
+ if (isnan(dop->tdop) != 0) {
dop->tdop = tdop;
}
- if (isnan(dop->gdop)!=0) {
+ if (isnan(dop->gdop) != 0) {
dop->gdop = gdop;
}
/*@ +usedef @*/
- return DOP_SET;
+ return DOP_IS;
}
diff --git a/gpxlogger.c b/gpxlogger.c
index a936f1dc..761d33b0 100644
--- a/gpxlogger.c
+++ b/gpxlogger.c
@@ -22,6 +22,10 @@
#include "gpsdclient.h"
#include "revision.h"
+#ifdef S_SPLINT_S
+extern struct tm *gmtime_r(const time_t *, /*@out@*/ struct tm *tp);
+#endif /* S_SPLINT_S */
+
/**************************************************************************
*
* Transport-layer-independent functions
@@ -35,18 +39,22 @@ static char *progname;
static time_t int_time, old_int_time;
static bool intrack = false;
static bool first = true;
-static time_t timeout = 5; /* seconds */
+static time_t timeout = 5; /* seconds */
#ifdef CLIENTDEBUG_ENABLE
static int debug;
#endif /* CLIENTDEBUG_ENABLE */
-static void print_gpx_header(void)
+static void print_gpx_header(void)
{
(void)printf("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
(void)printf("<gpx version=\"1.1\" creator=\"navsys logger\"\n");
- (void)printf(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n");
+ (void)
+ printf
+ (" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n");
(void)printf(" xmlns=\"http://www.topografix.com/GPX/1.1\"\n");
- (void)printf(" xsi:schemaLocation=\"http://www.topografix.com/GPS/1/1\n");
+ (void)
+ printf
+ (" xsi:schemaLocation=\"http://www.topografix.com/GPS/1/1\n");
(void)printf(" http://www.topografix.com/GPX/1/1/gpx.xsd\">\n");
(void)printf(" <metadata>\n");
(void)printf(" <name>NavSys GPS logger dump</name>\n");
@@ -56,14 +64,14 @@ static void print_gpx_header(void)
(void)fflush(stdout);
}
-static void print_gpx_trk_end (void)
+static void print_gpx_trk_end(void)
{
(void)printf(" </trkseg>\n");
(void)printf(" </trk>\n");
(void)fflush(stdout);
}
-static void print_gpx_footer (void)
+static void print_gpx_footer(void)
{
if (intrack)
print_gpx_trk_end();
@@ -71,7 +79,7 @@ static void print_gpx_footer (void)
(void)fclose(stdout);
}
-static void print_gpx_trk_start (void)
+static void print_gpx_trk_start(void)
{
(void)printf(" <trk>\n");
(void)printf(" <trkseg>\n");
@@ -80,17 +88,16 @@ static void print_gpx_trk_start (void)
static void print_fix(struct gps_fix_t *fix, struct tm *time)
{
- (void)printf(" <trkpt lat=\"%f\" lon=\"%f\">\n",
+ (void)printf(" <trkpt lat=\"%f\" lon=\"%f\">\n",
fix->latitude, fix->longitude);
- (void)printf(" <ele>%f</ele>\n",
- fix->altitude);
+ (void)printf(" <ele>%f</ele>\n", fix->altitude);
(void)printf(" <time>%04d-%02d-%02dT%02d:%02d:%02dZ</time>\n",
- time->tm_year+1900, time->tm_mon+1, time->tm_mday,
+ time->tm_year + 1900, time->tm_mon + 1, time->tm_mday,
time->tm_hour, time->tm_min, time->tm_sec);
- if (fix->mode==MODE_NO_FIX)
- (void)fprintf (stdout, " <fix>none</fix>\n");
+ if (fix->mode == MODE_NO_FIX)
+ (void)fprintf(stdout, " <fix>none</fix>\n");
else
- (void)fprintf (stdout, " <fix>%dd</fix>\n", fix->mode);
+ (void)fprintf(stdout, " <fix>%dd</fix>\n", fix->mode);
#if 0
/*
* Can't print this more detailed report because in D-Bus mode
@@ -99,19 +106,19 @@ static void print_fix(struct gps_fix_t *fix, struct tm *time)
*/
if ((gpsdata->status >= 2) && (gpsdata->fix.mode >= MODE_3D)) {
/* dgps or pps */
- if (gpsdata->fix.mode == 4) { /* military pps */
+ if (gpsdata->fix.mode == 4) { /* military pps */
(void)printf(" <fix>pps</fix>\n");
- } else { /* civilian dgps or sbas */
+ } else { /* civilian dgps or sbas */
(void)printf(" <fix>dgps</fix>\n");
}
- } else { /* no dgps or pps */
+ } else { /* no dgps or pps */
if (gpsdata->fix.mode == MODE_3D) {
(void)printf(" <fix>3d</fix>\n");
} else if (gpsdata->fix.mode == MODE_2D) {
(void)printf(" <fix>2d</fix>\n");
} else if (gpsdata->fix.mode == MODE_NOFIX) {
(void)printf(" <fix>none</fix>\n");
- } /* don't print anything if no fix indicator */
+ } /* don't print anything if no fix indicator */
}
/* print # satellites used in fix, if reasonable to do so */
@@ -122,14 +129,14 @@ static void print_fix(struct gps_fix_t *fix, struct tm *time)
#endif
(void)printf(" </trkpt>\n");
- (void)fflush (stdout);
+ (void)fflush(stdout);
}
static void conditionally_log_fix(struct gps_fix_t *gpsfix)
{
- int_time = floor(gpsfix->time);
+ int_time = (time_t) floor(gpsfix->time);
if ((int_time != old_int_time) && gpsfix->mode >= MODE_2D) {
- struct tm time;
+ struct tm time;
/*
* Make new track if the jump in time is above
* timeout. Handle jumps both forward and
@@ -137,10 +144,12 @@ static void conditionally_log_fix(struct gps_fix_t *gpsfix)
* backward when gpsd is submitting junk on the
* dbus.
*/
+ /*@-type@*/
if (fabs(int_time - old_int_time) > timeout && !first) {
print_gpx_trk_end();
intrack = false;
}
+ /*@+type@*/
if (!intrack) {
print_gpx_trk_start();
@@ -148,19 +157,19 @@ static void conditionally_log_fix(struct gps_fix_t *gpsfix)
if (first)
first = false;
}
-
+
old_int_time = int_time;
- gmtime_r(&(int_time), &time);
+ (void)gmtime_r(&(int_time), &time);
print_fix(gpsfix, &time);
}
}
-static void quit_handler (int signum)
+static void quit_handler(int signum)
{
/* don't clutter the logs on Ctrl-C */
if (signum != SIGINT)
syslog(LOG_INFO, "exiting, signal %d received", signum);
- print_gpx_footer ();
+ print_gpx_footer();
exit(0);
}
@@ -186,36 +195,35 @@ static struct gps_fix_t gpsfix;
*/
#define EMIX(x, y) (((x) > (y)) ? (x) : (y))
-DBusConnection* connection;
+DBusConnection *connection;
static char gpsd_devname[BUFSIZ];
-static DBusHandlerResult handle_gps_fix (DBusMessage* message)
+static DBusHandlerResult handle_gps_fix(DBusMessage * message)
{
- DBusError error;
+ DBusError error;
/* this packet format was designed before we split eph */
double eph = EMIX(gpsfix.epx, gpsfix.epy);
- dbus_error_init (&error);
-
- dbus_message_get_args (message,
- &error,
- DBUS_TYPE_DOUBLE, &gpsfix.time,
- DBUS_TYPE_INT32, &gpsfix.mode,
- DBUS_TYPE_DOUBLE, &gpsfix.ept,
- DBUS_TYPE_DOUBLE, &gpsfix.latitude,
- DBUS_TYPE_DOUBLE, &gpsfix.longitude,
- DBUS_TYPE_DOUBLE, &eph,
- DBUS_TYPE_DOUBLE, &gpsfix.altitude,
- DBUS_TYPE_DOUBLE, &gpsfix.epv,
- DBUS_TYPE_DOUBLE, &gpsfix.track,
- DBUS_TYPE_DOUBLE, &gpsfix.epd,
- DBUS_TYPE_DOUBLE, &gpsfix.speed,
- DBUS_TYPE_DOUBLE, &gpsfix.eps,
- DBUS_TYPE_DOUBLE, &gpsfix.climb,
- DBUS_TYPE_DOUBLE, &gpsfix.epc,
- DBUS_TYPE_STRING, &gpsd_devname,
- DBUS_TYPE_INVALID);
+ dbus_error_init(&error);
+
+ dbus_message_get_args(message,
+ &error,
+ DBUS_TYPE_DOUBLE, &gpsfix.time,
+ DBUS_TYPE_INT32, &gpsfix.mode,
+ DBUS_TYPE_DOUBLE, &gpsfix.ept,
+ DBUS_TYPE_DOUBLE, &gpsfix.latitude,
+ DBUS_TYPE_DOUBLE, &gpsfix.longitude,
+ DBUS_TYPE_DOUBLE, &eph,
+ DBUS_TYPE_DOUBLE, &gpsfix.altitude,
+ DBUS_TYPE_DOUBLE, &gpsfix.epv,
+ DBUS_TYPE_DOUBLE, &gpsfix.track,
+ DBUS_TYPE_DOUBLE, &gpsfix.epd,
+ DBUS_TYPE_DOUBLE, &gpsfix.speed,
+ DBUS_TYPE_DOUBLE, &gpsfix.eps,
+ DBUS_TYPE_DOUBLE, &gpsfix.climb,
+ DBUS_TYPE_DOUBLE, &gpsfix.epc,
+ DBUS_TYPE_STRING, &gpsd_devname, DBUS_TYPE_INVALID);
conditionally_log_fix(&gpsfix);
return DBUS_HANDLER_RESULT_HANDLED;
@@ -225,49 +233,52 @@ static DBusHandlerResult handle_gps_fix (DBusMessage* message)
* Message dispatching function
*
*/
-static DBusHandlerResult signal_handler (
- DBusConnection* connection, DBusMessage* message)
+static DBusHandlerResult signal_handler(DBusConnection * connection,
+ DBusMessage * message)
{
/* dummy, need to use the variable for some reason */
connection = NULL;
-
- if (dbus_message_is_signal (message, "org.gpsd", "fix"))
- return handle_gps_fix (message);
+
+ if (dbus_message_is_signal(message, "org.gpsd", "fix"))
+ return handle_gps_fix(message);
/*
* ignore all other messages
*/
-
+
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
static int dbus_mainloop(void)
{
- GMainLoop* mainloop;
+ GMainLoop *mainloop;
DBusError error;
- mainloop = g_main_loop_new (NULL, FALSE);
+ mainloop = g_main_loop_new(NULL, FALSE);
- dbus_error_init (&error);
- connection = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
- if (dbus_error_is_set (&error)) {
- syslog (LOG_CRIT, "%s: %s", error.name, error.message);
+ dbus_error_init(&error);
+ connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
+ if (dbus_error_is_set(&error)) {
+ syslog(LOG_CRIT, "%s: %s", error.name, error.message);
return 3;
}
-
- dbus_bus_add_match (connection, "type='signal'", &error);
- if (dbus_error_is_set (&error)) {
- syslog (LOG_CRIT, "unable to add match for signals %s: %s", error.name, error.message);
+
+ dbus_bus_add_match(connection, "type='signal'", &error);
+ if (dbus_error_is_set(&error)) {
+ syslog(LOG_CRIT, "unable to add match for signals %s: %s", error.name,
+ error.message);
return 4;
}
- if (!dbus_connection_add_filter (connection, (DBusHandleMessageFunction)signal_handler, NULL, NULL)) {
- syslog (LOG_CRIT, "unable to register filter with the connection");
+ if (!dbus_connection_add_filter
+ (connection, (DBusHandleMessageFunction) signal_handler, NULL,
+ NULL)) {
+ syslog(LOG_CRIT, "unable to register filter with the connection");
return 5;
}
-
- dbus_connection_setup_with_g_main (connection, NULL);
- g_main_loop_run (mainloop);
+ dbus_connection_setup_with_g_main(connection, NULL);
+
+ g_main_loop_run(mainloop);
return 0;
}
@@ -279,18 +290,20 @@ static int dbus_mainloop(void)
*
**************************************************************************/
-struct fixsource_t source;
+static struct fixsource_t source;
static void process(struct gps_data_t *gpsdata,
- char *buf UNUSED, size_t len UNUSED)
+ char *buf UNUSED, size_t len UNUSED)
{
/* this is where we implement source-device filtering */
- if (gpsdata->dev.path[0] && source.device!=NULL && strcmp(source.device, gpsdata->dev.path) != 0)
+ if (gpsdata->dev.path[0] != '\0' && source.device != NULL
+ && strcmp(source.device, gpsdata->dev.path) != 0)
return;
conditionally_log_fix(&gpsdata->fix);
}
+/*@-mustfreefresh@*/
static int socket_mainloop(void)
{
fd_set fds;
@@ -305,9 +318,9 @@ static int socket_mainloop(void)
}
gps_set_raw_hook(gpsdata, process);
- gps_stream(gpsdata, WATCH_ENABLE, NULL);
+ (void)gps_stream(gpsdata, WATCH_ENABLE, NULL);
- for(;;) {
+ for (;;) {
int data;
struct timeval tv;
@@ -319,33 +332,33 @@ static int socket_mainloop(void)
data = select(gpsdata->gps_fd + 1, &fds, NULL, NULL, &tv);
if (data == -1) {
- (void)fprintf(stderr,"%s\n", strerror(errno));
+ (void)fprintf(stderr, "%s\n", strerror(errno));
break;
- }
- else if (data)
- gps_poll(gpsdata);
+ } else if (data)
+ (void)gps_poll(gpsdata);
}
return 0;
}
+/*@+mustfreefresh@*/
+
/**************************************************************************
*
* Main sequence
*
**************************************************************************/
-static void usage(void)
+static void usage(void)
{
fprintf(stderr,
"Usage: %s [-V] [-h] [-i timeout] [-j casoc] [server[:port:[device]]]\n",
progname);
fprintf(stderr,
- "\tdefaults to '%s -i 5 -j 0 localhost:2947'\n",
- progname);
+ "\tdefaults to '%s -i 5 -j 0 localhost:2947'\n", progname);
exit(1);
}
-int main (int argc, char** argv)
+int main(int argc, char **argv)
{
int ch;
@@ -359,7 +372,7 @@ int main (int argc, char** argv)
break;
#endif /* CLIENTDEBUG_ENABLE */
case 'i': /* set polling interfal */
- timeout = (unsigned int)atoi(optarg);
+ timeout = (time_t) atoi(optarg);
if (timeout < 1)
timeout = 1;
if (timeout >= 3600)
@@ -370,7 +383,7 @@ int main (int argc, char** argv)
(void)fprintf(stderr, "gpxlogger revision " REVISION "\n");
exit(0);
default:
- usage();
+ usage();
/* NOTREACHED */
}
}
@@ -388,14 +401,14 @@ int main (int argc, char** argv)
gps_clear_fix(&gpsfix);
/* catch all interesting signals */
- signal (SIGTERM, quit_handler);
- signal (SIGQUIT, quit_handler);
- signal (SIGINT, quit_handler);
+ (void)signal(SIGTERM, quit_handler);
+ (void)signal(SIGQUIT, quit_handler);
+ (void)signal(SIGINT, quit_handler);
//openlog ("gpxlogger", LOG_PID | LOG_NDELAY , LOG_DAEMON);
//syslog (LOG_INFO, "---------- STARTED ----------");
-
- print_gpx_header ();
+
+ print_gpx_header();
#ifdef DBUS_ENABLE
/* To force socket use in the default way just give a 'localhost' arg */
diff --git a/hex.c b/hex.c
index d22bc937..7a7a2331 100644
--- a/hex.c
+++ b/hex.c
@@ -22,7 +22,7 @@ int gpsd_hexdump_level = -1;
* speed, chatty protocols, this can save a lot of CPU.
*/
char *gpsd_hexdump_wrapper(const void *binbuf, size_t binbuflen,
- int msg_debug_level)
+ int msg_debug_level)
{
#ifndef SQUELCH_ENABLE
if (msg_debug_level <= gpsd_hexdump_level)
@@ -33,44 +33,47 @@ char *gpsd_hexdump_wrapper(const void *binbuf, size_t binbuflen,
char /*@ observer @*/ *gpsd_hexdump(const void *binbuf, size_t binbuflen)
{
- static char hexbuf[MAX_PACKET_LENGTH*2+1];
+ static char hexbuf[MAX_PACKET_LENGTH * 2 + 1];
#ifndef SQUELCH_ENABLE
size_t i, j = 0;
- size_t len = (size_t)((binbuflen > MAX_PACKET_LENGTH) ? MAX_PACKET_LENGTH : binbuflen);
+ size_t len =
+ (size_t) ((binbuflen >
+ MAX_PACKET_LENGTH) ? MAX_PACKET_LENGTH : binbuflen);
const char *ibuf = (const char *)binbuf;
const char *hexchar = "0123456789abcdef";
- if (NULL == binbuf || 0 == binbuflen)
+ if (NULL == binbuf || 0 == binbuflen)
return "";
/*@ -shiftimplementation @*/
for (i = 0; i < len; i++) {
- hexbuf[j++] = hexchar[ (ibuf[i]&0xf0)>>4 ];
- hexbuf[j++] = hexchar[ ibuf[i]&0x0f ];
+ hexbuf[j++] = hexchar[(ibuf[i] & 0xf0) >> 4];
+ hexbuf[j++] = hexchar[ibuf[i] & 0x0f];
}
/*@ +shiftimplementation @*/
- hexbuf[j] ='\0';
+ hexbuf[j] = '\0';
#else /* SQUELCH defined */
hexbuf[0] = '\0';
#endif /* SQUELCH_ENABLE */
return hexbuf;
}
-int gpsd_hexpack(/*@in@*/const char *src, /*@out@*/char *dst, size_t len) {
-/* hex2bin source string to destination - destination can be same as source */
+int gpsd_hexpack( /*@in@*/ const char *src, /*@out@ */ char *dst, size_t len)
+{
+/* hex2bin source string to destination - destination can be same as source */
int i, k, l;
/*@ -mustdefine @*/
l = (int)(strlen(src) / 2);
- if ((l < 1) || ((size_t)l > len))
+ if ((l < 1) || ((size_t) l > len))
return -2;
for (i = 0; i < l; i++)
- if ((k = hex2bin(src+i*2)) != -1)
+ if ((k = hex2bin(src + i * 2)) != -1)
dst[i] = (char)(k & 0xff);
else
return -1;
- (void)memset(dst+i, '\0', (size_t)(len-i));
+ (void)memset(dst + i, '\0', (size_t) (len - i));
return l;
/*@ +mustdefine @*/
}
@@ -101,11 +104,12 @@ int hex2bin(const char *s)
else
return -1;
- return ((a<<4) + b);
+ return ((a << 4) + b);
}
+
/*@ -charint +shiftimplementation @*/
-ssize_t hex_escapes(/*@out@*/char *cooked, const char *raw)
+ssize_t hex_escapes( /*@out@*/ char *cooked, const char *raw)
/* interpret C-style hex escapes */
{
char c, *cookend;
@@ -115,62 +119,154 @@ ssize_t hex_escapes(/*@out@*/char *cooked, const char *raw)
if (*raw != '\\')
*cookend++ = *raw;
else {
- switch(*++raw) {
- case 'b': *cookend++ = '\b'; break;
- case 'e': *cookend++ = '\x1b'; break;
- case 'f': *cookend++ = '\f'; break;
- case 'n': *cookend++ = '\n'; break;
- case 'r': *cookend++ = '\r'; break;
- case 't': *cookend++ = '\r'; break;
- case 'v': *cookend++ = '\v'; break;
+ switch (*++raw) {
+ case 'b':
+ *cookend++ = '\b';
+ break;
+ case 'e':
+ *cookend++ = '\x1b';
+ break;
+ case 'f':
+ *cookend++ = '\f';
+ break;
+ case 'n':
+ *cookend++ = '\n';
+ break;
+ case 'r':
+ *cookend++ = '\r';
+ break;
+ case 't':
+ *cookend++ = '\r';
+ break;
+ case 'v':
+ *cookend++ = '\v';
+ break;
case 'x':
- switch(*++raw) {
- case '0': c = (char)0x00; break;
- case '1': c = (char)0x10; break;
- case '2': c = (char)0x20; break;
- case '3': c = (char)0x30; break;
- case '4': c = (char)0x40; break;
- case '5': c = (char)0x50; break;
- case '6': c = (char)0x60; break;
- case '7': c = (char)0x70; break;
- case '8': c = (char)0x80; break;
- case '9': c = (char)0x90; break;
- case 'A': case 'a': c = (char)0xa0; break;
- case 'B': case 'b': c = (char)0xb0; break;
- case 'C': case 'c': c = (char)0xc0; break;
- case 'D': case 'd': c = (char)0xd0; break;
- case 'E': case 'e': c = (char)0xe0; break;
- case 'F': case 'f': c = (char)0xf0; break;
+ switch (*++raw) {
+ case '0':
+ c = (char)0x00;
+ break;
+ case '1':
+ c = (char)0x10;
+ break;
+ case '2':
+ c = (char)0x20;
+ break;
+ case '3':
+ c = (char)0x30;
+ break;
+ case '4':
+ c = (char)0x40;
+ break;
+ case '5':
+ c = (char)0x50;
+ break;
+ case '6':
+ c = (char)0x60;
+ break;
+ case '7':
+ c = (char)0x70;
+ break;
+ case '8':
+ c = (char)0x80;
+ break;
+ case '9':
+ c = (char)0x90;
+ break;
+ case 'A':
+ case 'a':
+ c = (char)0xa0;
+ break;
+ case 'B':
+ case 'b':
+ c = (char)0xb0;
+ break;
+ case 'C':
+ case 'c':
+ c = (char)0xc0;
+ break;
+ case 'D':
+ case 'd':
+ c = (char)0xd0;
+ break;
+ case 'E':
+ case 'e':
+ c = (char)0xe0;
+ break;
+ case 'F':
+ case 'f':
+ c = (char)0xf0;
+ break;
default:
return -1;
}
- switch(*++raw) {
- case '0': c += 0x00; break;
- case '1': c += 0x01; break;
- case '2': c += 0x02; break;
- case '3': c += 0x03; break;
- case '4': c += 0x04; break;
- case '5': c += 0x05; break;
- case '6': c += 0x06; break;
- case '7': c += 0x07; break;
- case '8': c += 0x08; break;
- case '9': c += 0x09; break;
- case 'A': case 'a': c += 0x0a; break;
- case 'B': case 'b': c += 0x0b; break;
- case 'C': case 'c': c += 0x0c; break;
- case 'D': case 'd': c += 0x0d; break;
- case 'E': case 'e': c += 0x0e; break;
- case 'F': case 'f': c += 0x0f; break;
+ switch (*++raw) {
+ case '0':
+ c += 0x00;
+ break;
+ case '1':
+ c += 0x01;
+ break;
+ case '2':
+ c += 0x02;
+ break;
+ case '3':
+ c += 0x03;
+ break;
+ case '4':
+ c += 0x04;
+ break;
+ case '5':
+ c += 0x05;
+ break;
+ case '6':
+ c += 0x06;
+ break;
+ case '7':
+ c += 0x07;
+ break;
+ case '8':
+ c += 0x08;
+ break;
+ case '9':
+ c += 0x09;
+ break;
+ case 'A':
+ case 'a':
+ c += 0x0a;
+ break;
+ case 'B':
+ case 'b':
+ c += 0x0b;
+ break;
+ case 'C':
+ case 'c':
+ c += 0x0c;
+ break;
+ case 'D':
+ case 'd':
+ c += 0x0d;
+ break;
+ case 'E':
+ case 'e':
+ c += 0x0e;
+ break;
+ case 'F':
+ case 'f':
+ c += 0x0f;
+ break;
default:
return -2;
}
*cookend++ = c;
break;
- case '\\': *cookend++ = '\\'; break;
+ case '\\':
+ *cookend++ = '\\';
+ break;
default:
return -3;
}
}
- return (ssize_t)(cookend - cooked);
+ return (ssize_t) (cookend - cooked);
/*@ +charint +mustdefine +compdef @*/
}
diff --git a/isgps.c b/isgps.c
index 15fbc746..4c89ad40 100644
--- a/isgps.c
+++ b/isgps.c
@@ -75,7 +75,7 @@ BSD terms apply: see the file COPYING in the distribution root for details.
#define W_DATA_MASK 0x3fffffc0u
/*@ +charint @*/
-static unsigned char parity_array[] = {
+static unsigned char parity_array[] = {
0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
@@ -100,6 +100,7 @@ static unsigned int reverse_bits[] = {
1, 33, 17, 49, 9, 41, 25, 57, 5, 37, 21, 53, 13, 45, 29, 61,
3, 35, 19, 51, 11, 43, 27, 59, 7, 39, 23, 55, 15, 47, 31, 63
};
+
/*@ -charint @*/
unsigned int isgps_parity(isgps30bits_t th)
@@ -112,13 +113,13 @@ unsigned int isgps_parity(isgps30bits_t th)
#define PARITY_28 0x5763e680u
#define PARITY_29 0x6bb1f340u
#define PARITY_30 0x8b7a89c0u
- isgps30bits_t t;
- unsigned int p;
+ isgps30bits_t t;
+ unsigned int p;
/*
- if (th & P_30_MASK)
- th ^= W_DATA_MASK;
- */
+ * if (th & P_30_MASK)
+ * th ^= W_DATA_MASK;
+ */
/*@ +charint @*/
t = th & PARITY_25;
@@ -126,22 +127,27 @@ unsigned int isgps_parity(isgps30bits_t th)
parity_array[(t >> 16) & 0xff] ^ parity_array[(t >> 24) & 0xff];
t = th & PARITY_26;
p = (p << 1) | (parity_array[t & 0xff] ^ parity_array[(t >> 8) & 0xff] ^
- parity_array[(t >> 16) & 0xff] ^ parity_array[(t >> 24) & 0xff]);
+ parity_array[(t >> 16) & 0xff] ^ parity_array[(t >> 24) &
+ 0xff]);
t = th & PARITY_27;
p = (p << 1) | (parity_array[t & 0xff] ^ parity_array[(t >> 8) & 0xff] ^
- parity_array[(t >> 16) & 0xff] ^ parity_array[(t >> 24) & 0xff]);
+ parity_array[(t >> 16) & 0xff] ^ parity_array[(t >> 24) &
+ 0xff]);
t = th & PARITY_28;
p = (p << 1) | (parity_array[t & 0xff] ^ parity_array[(t >> 8) & 0xff] ^
- parity_array[(t >> 16) & 0xff] ^ parity_array[(t >> 24) & 0xff]);
+ parity_array[(t >> 16) & 0xff] ^ parity_array[(t >> 24) &
+ 0xff]);
t = th & PARITY_29;
p = (p << 1) | (parity_array[t & 0xff] ^ parity_array[(t >> 8) & 0xff] ^
- parity_array[(t >> 16) & 0xff] ^ parity_array[(t >> 24) & 0xff]);
+ parity_array[(t >> 16) & 0xff] ^ parity_array[(t >> 24) &
+ 0xff]);
t = th & PARITY_30;
p = (p << 1) | (parity_array[t & 0xff] ^ parity_array[(t >> 8) & 0xff] ^
- parity_array[(t >> 16) & 0xff] ^ parity_array[(t >> 24) & 0xff]);
+ parity_array[(t >> 16) & 0xff] ^ parity_array[(t >> 24) &
+ 0xff]);
/*@ -charint @*/
- gpsd_report(ISGPS_ERRLEVEL_BASE+2, "ISGPS parity %u\n", p);
+ gpsd_report(ISGPS_ERRLEVEL_BASE + 2, "ISGPS parity %u\n", p);
return (p);
}
@@ -174,7 +180,7 @@ static bool isgps_parityok(isgps30bits_t w)
}
#endif
-void isgps_init(/*@out@*/struct gps_packet_t *session)
+void isgps_init( /*@out@*/ struct gps_packet_t *session)
{
session->isgps.curr_word = 0;
session->isgps.curr_offset = 24; /* first word */
@@ -183,17 +189,16 @@ void isgps_init(/*@out@*/struct gps_packet_t *session)
}
/*@ -usereleased -compdef @*/
-enum isgpsstat_t isgps_decode(struct gps_packet_t *session,
- bool (*preamble_match)(isgps30bits_t *),
- bool (*length_check)(struct gps_packet_t*),
- size_t maxlen,
- unsigned int c)
+enum isgpsstat_t isgps_decode(struct gps_packet_t *session,
+ bool(*preamble_match) (isgps30bits_t *),
+ bool(*length_check) (struct gps_packet_t *),
+ size_t maxlen, unsigned int c)
{
enum isgpsstat_t res;
/* ASCII characters 64-127, @ through DEL */
if ((c & MAG_TAG_MASK) != MAG_TAG_DATA) {
- gpsd_report(ISGPS_ERRLEVEL_BASE+1,
+ gpsd_report(ISGPS_ERRLEVEL_BASE + 1,
"ISGPS word tag not correct, skipping byte\n");
return ISGPS_SKIP;
}
@@ -210,19 +215,22 @@ enum isgpsstat_t isgps_decode(struct gps_packet_t *session,
if (session->isgps.curr_offset > 0) {
session->isgps.curr_word |= c << session->isgps.curr_offset;
} else {
- session->isgps.curr_word |= c >> -(session->isgps.curr_offset);
+ session->isgps.curr_word |=
+ c >> -(session->isgps.curr_offset);
}
- gpsd_report(ISGPS_ERRLEVEL_BASE+2, "ISGPS syncing at byte %lu: 0x%08x\n", session->char_counter, session->isgps.curr_word);
+ gpsd_report(ISGPS_ERRLEVEL_BASE + 2,
+ "ISGPS syncing at byte %lu: 0x%08x\n",
+ session->char_counter, session->isgps.curr_word);
if (preamble_match(&session->isgps.curr_word)) {
if (isgps_parityok(session->isgps.curr_word)) {
- gpsd_report(ISGPS_ERRLEVEL_BASE+1,
+ gpsd_report(ISGPS_ERRLEVEL_BASE + 1,
"ISGPS preamble ok, parity ok -- locked\n");
session->isgps.locked = true;
/* session->isgps.curr_offset; XXX - testing */
break;
}
- gpsd_report(ISGPS_ERRLEVEL_BASE+1,
+ gpsd_report(ISGPS_ERRLEVEL_BASE + 1,
"ISGPS preamble ok, parity fail\n");
}
session->isgps.curr_offset++;
@@ -249,15 +257,16 @@ enum isgpsstat_t isgps_decode(struct gps_packet_t *session,
* another preamble pattern in the data stream. -wsr
*/
if (preamble_match(&session->isgps.curr_word)) {
- gpsd_report(ISGPS_ERRLEVEL_BASE+2,
+ gpsd_report(ISGPS_ERRLEVEL_BASE + 2,
"ISGPS preamble spotted (index: %u)\n",
session->isgps.bufindex);
session->isgps.bufindex = 0;
}
#endif
- gpsd_report(ISGPS_ERRLEVEL_BASE+2,
+ gpsd_report(ISGPS_ERRLEVEL_BASE + 2,
"ISGPS processing word %u (offset %d)\n",
- session->isgps.bufindex, session->isgps.curr_offset);
+ session->isgps.bufindex,
+ session->isgps.curr_offset);
{
/*
* Guard against a buffer overflow attack. Just wait for
@@ -265,23 +274,26 @@ enum isgpsstat_t isgps_decode(struct gps_packet_t *session,
*/
if (session->isgps.bufindex >= (unsigned)maxlen) {
session->isgps.bufindex = 0;
- gpsd_report(ISGPS_ERRLEVEL_BASE+1,
+ gpsd_report(ISGPS_ERRLEVEL_BASE + 1,
"ISGPS buffer overflowing -- resetting\n");
return ISGPS_NO_SYNC;
}
- session->isgps.buf[session->isgps.bufindex] = session->isgps.curr_word;
+ session->isgps.buf[session->isgps.bufindex] =
+ session->isgps.curr_word;
+ /* *INDENT-OFF* */
if ((session->isgps.bufindex == 0) &&
- !preamble_match((isgps30bits_t *)session->isgps.buf)) {
- gpsd_report(ISGPS_ERRLEVEL_BASE+1,
+ !preamble_match((isgps30bits_t *) session->isgps.buf)) {
+ gpsd_report(ISGPS_ERRLEVEL_BASE + 1,
"ISGPS word 0 not a preamble- punting\n");
return ISGPS_NO_SYNC;
}
+ /* *INDENT-ON* */
session->isgps.bufindex++;
if (length_check(session)) {
- /* jackpot, we have a complete packet*/
+ /* jackpot, we have a complete packet */
session->isgps.bufindex = 0;
res = ISGPS_MESSAGE;
}
@@ -289,31 +301,34 @@ enum isgpsstat_t isgps_decode(struct gps_packet_t *session,
session->isgps.curr_word <<= 30; /* preserve the 2 low bits */
session->isgps.curr_offset += 30;
if (session->isgps.curr_offset > 0) {
- session->isgps.curr_word |= c << session->isgps.curr_offset;
+ session->isgps.curr_word |=
+ c << session->isgps.curr_offset;
} else {
- session->isgps.curr_word |= c >> -(session->isgps.curr_offset);
+ session->isgps.curr_word |=
+ c >> -(session->isgps.curr_offset);
}
} else {
- gpsd_report(ISGPS_ERRLEVEL_BASE+0,
+ gpsd_report(ISGPS_ERRLEVEL_BASE + 0,
"ISGPS parity failure, lost lock\n");
session->isgps.locked = false;
}
}
session->isgps.curr_offset -= 6;
- gpsd_report(ISGPS_ERRLEVEL_BASE+2, "ISGPS residual %d\n", session->isgps.curr_offset);
+ gpsd_report(ISGPS_ERRLEVEL_BASE + 2, "ISGPS residual %d\n",
+ session->isgps.curr_offset);
return res;
}
/*@ +shiftnegative @*/
/* never achieved lock */
- gpsd_report(ISGPS_ERRLEVEL_BASE+1,
- "ISGPS lock never achieved\n");
+ gpsd_report(ISGPS_ERRLEVEL_BASE + 1, "ISGPS lock never achieved\n");
return ISGPS_NO_SYNC;
}
+
/*@ +usereleased +compdef @*/
#ifdef __UNUSED__
-void isgps_output_magnavox(isgps30bits_t *ip, unsigned int len, FILE *fp)
+void isgps_output_magnavox(isgps30bits_t * ip, unsigned int len, FILE * fp)
/* ship an IS-GPS-200 message to standard output in Magnavox format */
{
isgps30bits_t w = 0;
diff --git a/json.c b/json.c
index fa665ca5..a7a671c4 100644
--- a/json.c
+++ b/json.c
@@ -61,17 +61,17 @@ PERMISSIONS
#include "json.h"
#ifdef CLIENTDEBUG_ENABLE
-static int debuglevel = 0;
+static int debuglevel = 0;
static FILE *debugfp;
-void json_enable_debug(int level, FILE *fp)
+void json_enable_debug(int level, FILE * fp)
/* control the level and destination of debug trace messages */
{
debuglevel = level;
debugfp = fp;
}
-static void json_trace(int errlevel, const char *fmt, ... )
+static void json_trace(int errlevel, const char *fmt, ...)
/* assemble command in printf(3) style */
{
if (errlevel <= debuglevel) {
@@ -79,8 +79,9 @@ static void json_trace(int errlevel, const char *fmt, ... )
va_list ap;
(void)strlcpy(buf, "json: ", BUFSIZ);
- va_start(ap, fmt) ;
- (void)vsnprintf(buf + strlen(buf), sizeof(buf)-strlen(buf), fmt, ap);
+ va_start(ap, fmt);
+ (void)vsnprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), fmt,
+ ap);
va_end(ap);
(void)fputs(buf, debugfp);
@@ -93,15 +94,15 @@ static void json_trace(int errlevel, const char *fmt, ... )
#endif /* CLIENTDEBUG_ENABLE */
/*@-immediatetrans -dependenttrans -usereleased -compdef@*/
-static /*@null@*/char *json_target_address(const struct json_attr_t *cursor,
- /*@null@*/const struct json_array_t *parent,
- int offset)
+static /*@null@*/ char *json_target_address(const struct json_attr_t *cursor,
+ /*@null@*/
+ const struct json_array_t
+ *parent, int offset)
{
- char *targetaddr = NULL;
- if (parent == NULL || parent->element_type != t_structobject) {
+ char *targetaddr = NULL;
+ if (parent == NULL || parent->element_type != t_structobject) {
/* ordinary case - use the address in the cursor structure */
- switch(cursor->type)
- {
+ switch (cursor->type) {
case t_integer:
targetaddr = (char *)&cursor->addr.integer[offset];
break;
@@ -124,35 +125,40 @@ static /*@null@*/char *json_target_address(const struct json_attr_t *cursor,
targetaddr = NULL;
break;
}
- }
- else
+ } else
/* tricky case - hacking a member in an array of structures */
- targetaddr = parent->arr.objects.base + (offset * parent->arr.objects.stride) + cursor->addr.offset;
- json_debug_trace((1, "Target address for %s (offset %d) is %p\n",
+ targetaddr =
+ parent->arr.objects.base + (offset * parent->arr.objects.stride) +
+ cursor->addr.offset;
+ json_debug_trace((1, "Target address for %s (offset %d) is %p\n",
cursor->attribute, offset, targetaddr));
return targetaddr;
}
+
/*@-immediatetrans -dependenttrans +usereleased +compdef@*/
-static int json_internal_read_object(const char *cp,
- const struct json_attr_t *attrs,
- /*@null@*/const struct json_array_t *parent,
- int offset,
- /*@null@*/const char **end)
+static int json_internal_read_object(const char *cp,
+ const struct json_attr_t *attrs,
+ /*@null@*/
+ const struct json_array_t *parent,
+ int offset,
+ /*@null@*/ const char **end)
{
/*@ -nullstate -nullderef -mustfreefresh -nullpass -usedef @*/
- enum {init, await_attr, in_attr, await_value, in_val_string,
- in_escape, in_val_token, post_val, post_array} state = 0;
+ enum
+ { init, await_attr, in_attr, await_value, in_val_string,
+ in_escape, in_val_token, post_val, post_array
+ } state = 0;
#ifdef CLIENTDEBUG_ENABLE
char *statenames[] = {
- "init", "await_attr", "in_attr", "await_value", "in_val_string",
+ "init", "await_attr", "in_attr", "await_value", "in_val_string",
"in_escape", "in_val_token", "post_val", "post_array",
- };
+ };
#endif /* CLIENTDEBUG_ENABLE */
- char attrbuf[JSON_ATTR_MAX+1], *pattr = NULL;
- char valbuf[JSON_VAL_MAX+1], *pval = NULL;
+ char attrbuf[JSON_ATTR_MAX + 1], *pattr = NULL;
+ char valbuf[JSON_VAL_MAX + 1], *pval = NULL;
bool value_quoted = false;
- char uescape[5]; /* enough space for 4 hex digits and a NUL */
+ char uescape[5]; /* enough space for 4 hex digits and a NUL */
const struct json_attr_t *cursor;
int substatus, n, maxlen = 0;
unsigned int u;
@@ -166,15 +172,14 @@ static int json_internal_read_object(const char *cp,
#endif /* S_SPLINT_S */
if (end != NULL)
- *end = NULL; /* give it a well-defined value on parse failure */
+ *end = NULL; /* give it a well-defined value on parse failure */
/* stuff fields with defaults in case they're omitted in the JSON input */
- for (cursor = attrs; cursor->attribute != NULL; cursor++)
+ for (cursor = attrs; cursor->attribute != NULL; cursor++)
if (!cursor->nodefault) {
lptr = json_target_address(cursor, parent, offset);
if (lptr != NULL)
- switch(cursor->type)
- {
+ switch (cursor->type) {
case t_integer:
*((int *)lptr) = cursor->dflt.integer;
break;
@@ -185,7 +190,9 @@ static int json_internal_read_object(const char *cp,
*((double *)lptr) = cursor->dflt.real;
break;
case t_string:
- if (parent != NULL && parent->element_type != t_structobject && offset > 0)
+ if (parent != NULL
+ && parent->element_type != t_structobject
+ && offset > 0)
return JSON_ERR_NOPARSTR;
lptr[0] = '\0';
break;
@@ -193,7 +200,7 @@ static int json_internal_read_object(const char *cp,
/* nullbool default says not to set the value at all */
/*@+boolint@*/
if (cursor->dflt.boolean != nullbool)
- *((bool *)lptr) = cursor->dflt.boolean;
+ *((bool *) lptr) = cursor->dflt.boolean;
/*@-boolint@*/
break;
case t_character:
@@ -210,17 +217,18 @@ static int json_internal_read_object(const char *cp,
json_debug_trace((1, "JSON parse of '%s' begins.\n", cp));
/* parse input JSON */
- for (; *cp!='\0'; cp++) {
- json_debug_trace((2, "State %-14s, looking at '%c' (%p)\n", statenames[state], *cp, cp));
- switch (state)
- {
+ for (; *cp != '\0'; cp++) {
+ json_debug_trace((2, "State %-14s, looking at '%c' (%p)\n",
+ statenames[state], *cp, cp));
+ switch (state) {
case init:
if (isspace(*cp))
continue;
else if (*cp == '{')
state = await_attr;
else {
- json_debug_trace((1, "Non-WS when expecting object start.\n"));
+ json_debug_trace((1,
+ "Non-WS when expecting object start.\n"));
return JSON_ERR_OBSTART;
}
break;
@@ -240,12 +248,15 @@ static int json_internal_read_object(const char *cp,
case in_attr:
if (*cp == '"') {
*pattr++ = '\0';
- json_debug_trace((1, "Collected attribute name %s\n", attrbuf));
+ json_debug_trace((1, "Collected attribute name %s\n",
+ attrbuf));
for (cursor = attrs; cursor->attribute != NULL; cursor++)
- if (strcmp(cursor->attribute, attrbuf)==0)
+ if (strcmp(cursor->attribute, attrbuf) == 0)
break;
if (cursor->attribute == NULL) {
- json_debug_trace((1, "Unknown attribute name '%s' (attributes begin with '%s').\n", attrbuf, attrs->attribute));
+ json_debug_trace((1,
+ "Unknown attribute name '%s' (attributes begin with '%s').\n",
+ attrbuf, attrs->attribute));
return JSON_ERR_BADATTR;
}
state = await_value;
@@ -254,7 +265,7 @@ static int json_internal_read_object(const char *cp,
else if (cursor->type == t_check)
maxlen = (int)strlen(cursor->dflt.check);
else if (cursor->map != NULL)
- maxlen = (int)sizeof(valbuf)-1;
+ maxlen = (int)sizeof(valbuf) - 1;
pval = valbuf;
} else if (pattr >= attrbuf + JSON_ATTR_MAX - 1) {
json_debug_trace((1, "Attribute name too long.\n"));
@@ -267,7 +278,8 @@ static int json_internal_read_object(const char *cp,
continue;
else if (*cp == '[') {
if (cursor->type != t_array) {
- json_debug_trace((1, "Saw [ when not expecting array.\n"));
+ json_debug_trace((1,
+ "Saw [ when not expecting array.\n"));
return JSON_ERR_NOARRAY;
}
substatus = json_read_array(cp, &cursor->addr.array, &cp);
@@ -275,7 +287,8 @@ static int json_internal_read_object(const char *cp,
return substatus;
state = post_array;
} else if (cursor->type == t_array) {
- json_debug_trace((1, "Array element was specified, but no [.\n"));
+ json_debug_trace((1,
+ "Array element was specified, but no [.\n"));
return JSON_ERR_NOBRAK;
} else if (*cp == '"') {
value_quoted = true;
@@ -295,14 +308,15 @@ static int json_internal_read_object(const char *cp,
*pval++ = '\0';
json_debug_trace((1, "Collected string value %s\n", valbuf));
state = post_val;
- } else if (pval > valbuf + JSON_VAL_MAX - 1 || pval > valbuf + maxlen) {
+ } else if (pval > valbuf + JSON_VAL_MAX - 1
+ || pval > valbuf + maxlen) {
json_debug_trace((1, "String value too long.\n"));
return JSON_ERR_STRLONG; /* */
} else
*pval++ = *cp;
break;
case in_escape:
- switch(*cp) {
+ switch (*cp) {
case 'b':
*pval++ = '\b';
break;
@@ -325,7 +339,7 @@ static int json_internal_read_object(const char *cp,
(void)sscanf(uescape, "%04x", &u);
*pval++ = (char)u; /* will truncate values above 0xff */
break;
- default: /* handles double quote and solidus */
+ default: /* handles double quote and solidus */
*pval++ = *cp;
break;
}
@@ -345,28 +359,34 @@ static int json_internal_read_object(const char *cp,
*pval++ = *cp;
break;
case post_val:
- if (value_quoted && (cursor->type != t_string && cursor->type != t_character && cursor->type != t_check && cursor->map == 0)) {
- json_debug_trace((1, "Saw quoted value when expecting non-string.\n"));
+ if (value_quoted
+ && (cursor->type != t_string && cursor->type != t_character
+ && cursor->type != t_check && cursor->map == 0)) {
+ json_debug_trace((1,
+ "Saw quoted value when expecting non-string.\n"));
return JSON_ERR_QNONSTRING;
- }
- if (!value_quoted && (cursor->type == t_string || cursor->type == t_check || cursor->map != 0)) {
- json_debug_trace((1, "Didn't see quoted value when expecting string.\n"));
+ }
+ if (!value_quoted
+ && (cursor->type == t_string || cursor->type == t_check
+ || cursor->map != 0)) {
+ json_debug_trace((1,
+ "Didn't see quoted value when expecting string.\n"));
return JSON_ERR_NONQSTRING;
- }
+ }
if (cursor->map != 0) {
for (mp = cursor->map; mp->name != NULL; mp++)
if (strcmp(mp->name, valbuf) == 0) {
goto foundit;
}
- json_debug_trace((1, "Invalid enumerated value string %s.\n", valbuf));
+ json_debug_trace((1, "Invalid enumerated value string %s.\n",
+ valbuf));
return JSON_ERR_BADENUM;
- foundit:
+ foundit:
(void)snprintf(valbuf, sizeof(valbuf), "%d", mp->value);
}
lptr = json_target_address(cursor, parent, offset);
if (lptr != NULL)
- switch(cursor->type)
- {
+ switch (cursor->type) {
case t_integer:
*((int *)lptr) = atoi(valbuf);
break;
@@ -377,12 +397,14 @@ static int json_internal_read_object(const char *cp,
*((double *)lptr) = atof(valbuf);
break;
case t_string:
- if (parent != NULL && parent->element_type != t_structobject && offset > 0)
+ if (parent != NULL
+ && parent->element_type != t_structobject
+ && offset > 0)
return JSON_ERR_NOPARSTR;
(void)strncpy(lptr, valbuf, cursor->len);
break;
case t_boolean:
- *((bool *)lptr) = (strcmp(valbuf, "true") == 0);
+ *((bool *) lptr) = (strcmp(valbuf, "true") == 0);
break;
case t_character:
if (strlen(valbuf) > 1)
@@ -395,30 +417,32 @@ static int json_internal_read_object(const char *cp,
case t_array:
break;
case t_check:
- if (strcmp(cursor->dflt.check, valbuf)!=0) {
- json_debug_trace((1, "Required attribute vakue %s not present.\n", cursor->dflt.check));
+ if (strcmp(cursor->dflt.check, valbuf) != 0) {
+ json_debug_trace((1,
+ "Required attribute vakue %s not present.\n",
+ cursor->dflt.check));
return JSON_ERR_CHECKFAIL;
}
break;
}
- /*@fallthrough@*/
- case post_array:
- if (isspace(*cp))
- continue;
- else if (*cp == ',')
- state = await_attr;
- else if (*cp == '}') {
- ++cp;
- goto good_parse;
- } else {
- json_debug_trace((1, "Garbage while expecting comma or }\n"));
- return JSON_ERR_BADTRAIL;
- }
- break;
+ /*@fallthrough@*/
+ case post_array:
+ if (isspace(*cp))
+ continue;
+ else if (*cp == ',')
+ state = await_attr;
+ else if (*cp == '}') {
+ ++cp;
+ goto good_parse;
+ } else {
+ json_debug_trace((1, "Garbage while expecting comma or }\n"));
+ return JSON_ERR_BADTRAIL;
}
+ break;
+ }
}
-good_parse:
+ good_parse:
/* in case there's another object following, consune trailing WS */
while (isspace(*cp))
++cp;
@@ -429,14 +453,15 @@ good_parse:
/*@ +nullstate +nullderef +mustfreefresh +nullpass +usedef @*/
}
-int json_read_array(const char *cp, const struct json_array_t *arr, const char **end)
+int json_read_array(const char *cp, const struct json_array_t *arr,
+ const char **end)
{
/*@-nullstate -onlytrans@*/
int substatus, offset;
char *tp;
if (end != NULL)
- *end = NULL; /* give it a well-defined value on parse failure */
+ *end = NULL; /* give it a well-defined value on parse failure */
json_debug_trace((1, "Entered json_read_array()\n"));
@@ -445,7 +470,7 @@ int json_read_array(const char *cp, const struct json_array_t *arr, const char *
if (*cp != '[') {
json_debug_trace((1, "Didn't find expected array start\n"));
return JSON_ERR_ARRAYSTART;
- }else
+ } else
cp++;
tp = arr->arr.strings.store;
@@ -453,8 +478,7 @@ int json_read_array(const char *cp, const struct json_array_t *arr, const char *
*(arr->count) = 0;
for (offset = 0; offset < arr->maxlen; offset++) {
json_debug_trace((1, "Looking at %s\n", cp));
- switch (arr->element_type)
- {
+ switch (arr->element_type) {
case t_string:
if (isspace(*cp))
cp++;
@@ -463,24 +487,28 @@ int json_read_array(const char *cp, const struct json_array_t *arr, const char *
else
++cp;
arr->arr.strings.ptrs[offset] = tp;
- for (; tp - arr->arr.strings.store < arr->arr.strings.storelen; tp++)
+ for (; tp - arr->arr.strings.store < arr->arr.strings.storelen;
+ tp++)
if (*cp == '"') {
++cp;
*tp++ = '\0';
goto stringend;
} else if (*cp == '\0') {
- json_debug_trace((1, "Bad string syntax in string list.\n"));
+ json_debug_trace((1,
+ "Bad string syntax in string list.\n"));
return JSON_ERR_BADSTRING;
- } else {
+ } else {
*tp = *cp++;
}
json_debug_trace((1, "Bad string syntax in string list.\n"));
return JSON_ERR_BADSTRING;
- stringend:
+ stringend:
break;
case t_object:
case t_structobject:
- substatus = json_internal_read_object(cp, arr->arr.objects.subtype, arr, offset, &cp);
+ substatus =
+ json_internal_read_object(cp, arr->arr.objects.subtype, arr,
+ offset, &cp);
if (substatus != 0)
return substatus;
break;
@@ -510,25 +538,25 @@ int json_read_array(const char *cp, const struct json_array_t *arr, const char *
}
json_debug_trace((1, "Too many elements in array.\n"));
return JSON_ERR_SUBTOOLONG;
-breakout:
+ breakout:
if (end != NULL)
*end = cp;
/*@ -nullderef @*/
- json_debug_trace((1, "leaving json_read_array() with %d elements\n", *arr->count));
+ json_debug_trace((1, "leaving json_read_array() with %d elements\n",
+ *arr->count));
/*@ +nullderef @*/
return 0;
/*@+nullstate +onlytrans@*/
}
-int json_read_object(const char *cp,
- const struct json_attr_t *attrs,
- /*@null@*/const char **end)
+int json_read_object(const char *cp, const struct json_attr_t *attrs,
+ /*@null@*/ const char **end)
{
json_debug_trace((1, "json_read_object() sees '%s'\n", cp));
return json_internal_read_object(cp, attrs, NULL, 0, end);
}
-const /*@observer@*/char *json_error_string(int err)
+const /*@observer@*/ char *json_error_string(int err)
{
const char *errors[] = {
"unknown error while parsing JSON",
@@ -555,7 +583,7 @@ const /*@observer@*/char *json_error_string(int err)
"other data conversion error",
};
- if (err <= 0 || err >= (int)(sizeof(errors)/sizeof(errors[0])))
+ if (err <= 0 || err >= (int)(sizeof(errors) / sizeof(errors[0])))
return errors[0];
else
return errors[err];
diff --git a/libgps_core.c b/libgps_core.c
index e1d9b2e9..c4af870c 100644
--- a/libgps_core.c
+++ b/libgps_core.c
@@ -32,7 +32,7 @@
#if defined (HAVE_SYS_SELECT_H)
#include <sys/select.h>
#endif
-#else
+#else
#include <QTcpSocket>
#endif /* USE_QT */
@@ -44,7 +44,8 @@ extern char *strtok_r(char *, const char *, char **);
#define LIBGPS_DEBUG
#endif /* defined(TESTMAIN) || defined(CLIENTDEBUG_ENABLE) */
-struct privdata_t {
+struct privdata_t
+{
bool newstyle;
ssize_t waiting;
char buffer[GPS_JSON_RESPONSE_MAX * 2];
@@ -52,21 +53,21 @@ struct privdata_t {
#define PRIVATE(gpsdata) ((struct privdata_t *)gpsdata->privdata)
#ifdef LIBGPS_DEBUG
-static int debuglevel = 0;
+static int debuglevel = 0;
static int waitcount = 0;
static FILE *debugfp;
-void gps_enable_debug(int level, FILE *fp)
+void gps_enable_debug(int level, FILE * fp)
/* control the level and destination of debug trace messages */
{
debuglevel = level;
debugfp = fp;
#ifdef CLIENTDEBUG_ENABLE
- json_enable_debug(level-2, fp);
+ json_enable_debug(level - 2, fp);
#endif
}
-static void gps_trace(int errlevel, const char *fmt, ... )
+static void gps_trace(int errlevel, const char *fmt, ...)
/* assemble command in printf(3) style */
{
if (errlevel <= debuglevel) {
@@ -74,8 +75,9 @@ static void gps_trace(int errlevel, const char *fmt, ... )
va_list ap;
(void)strlcpy(buf, "libgps: ", BUFSIZ);
- va_start(ap, fmt) ;
- (void)vsnprintf(buf + strlen(buf), sizeof(buf)-strlen(buf), fmt, ap);
+ va_start(ap, fmt);
+ (void)vsnprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), fmt,
+ ap);
va_end(ap);
(void)fputs(buf, debugfp);
@@ -89,7 +91,7 @@ static void gps_trace(int errlevel, const char *fmt, ... )
/*@-nullderef@*/
int gps_open_r(const char *host, const char *port,
- /*@out@*/struct gps_data_t *gpsdata)
+ /*@out@*/ struct gps_data_t *gpsdata)
{
/*@ -branchstate @*/
if (!gpsdata)
@@ -99,21 +101,22 @@ int gps_open_r(const char *host, const char *port,
if (!port)
port = DEFAULT_GPSD_PORT;
- libgps_debug_trace((1, "gps_open_r(%s, %s)\n", host, port));
+ libgps_debug_trace((1, "gps_open_r(%s, %s)\n", host, port));
#ifndef USE_QT
- if ((gpsdata->gps_fd = netlib_connectsock(AF_UNSPEC, host, port, "tcp")) < 0) {
+ if ((gpsdata->gps_fd =
+ netlib_connectsock(AF_UNSPEC, host, port, "tcp")) < 0) {
errno = gpsdata->gps_fd;
return -1;
}
#else
- QTcpSocket* sock = new QTcpSocket();
+ QTcpSocket *sock = new QTcpSocket();
gpsdata->gps_fd = sock;
sock->connectToHost(host, QString(port).toInt());
if (!sock->waitForConnected())
- qDebug() << "libgps::connect error: " << sock->errorString();
+ qDebug() << "libgps::connect error: " << sock->errorString();
else
- qDebug() << "libgps::connected!";
+ qDebug() << "libgps::connected!";
#endif
gpsdata->set = 0;
@@ -126,7 +129,7 @@ int gps_open_r(const char *host, const char *port,
return -1;
PRIVATE(gpsdata)->newstyle = false;
PRIVATE(gpsdata)->waiting = 0;
- /*@i2@*/PRIVATE(gpsdata)->buffer[0] = '\0';
+ /*@i2@*/ PRIVATE(gpsdata)->buffer[0] = '\0';
return 0;
/*@ +branchstate @*/
@@ -140,8 +143,9 @@ struct gps_data_t *gps_open(const char *host, const char *port)
if (gps_open_r(host, port, &gpsdata) == -1)
return NULL;
else
- return &gpsdata;
+ return &gpsdata;
}
+
/*@+compmempass +immediatetrans@*/
/*@-compdef -usereleased@*/
@@ -154,18 +158,19 @@ int gps_close(struct gps_data_t *gpsdata)
(void)close(gpsdata->gps_fd);
gpsdata->gps_fd = -1;
#else
- QTcpSocket* sock = (QTcpSocket*)gpsdata->gps_fd;
+ QTcpSocket *sock = (QTcpSocket *) gpsdata->gps_fd;
sock->disconnectFromHost();
delete sock;
gpsdata->gps_fd = NULL;
#endif
-
+
return 0;
}
+
/*@+compdef +usereleased@*/
void gps_set_raw_hook(struct gps_data_t *gpsdata,
- void (*hook)(struct gps_data_t *, char *, size_t len))
+ void (*hook) (struct gps_data_t *, char *, size_t len))
{
gpsdata->raw_hook = hook;
}
@@ -173,24 +178,24 @@ void gps_set_raw_hook(struct gps_data_t *gpsdata,
#ifdef LIBGPS_DEBUG
static void libgps_dump_state(struct gps_data_t *collect, time_t now)
{
- char *status_values[] = {"NO_FIX", "FIX", "DGPS_FIX"};
- char *mode_values[] = {"", "NO_FIX", "MODE_2D", "MODE_3D"};
+ char *status_values[] = { "NO_FIX", "FIX", "DGPS_FIX" };
+ char *mode_values[] = { "", "NO_FIX", "MODE_2D", "MODE_3D" };
/* FIXME: We don't dump the entire state here yet */
#ifndef USE_QT
- (void)fprintf(debugfp, "flags: (0x%04x) %s\n",
- collect->set, gpsd_maskdump(collect->set));
+ (void)fprintf(debugfp, "flags: (0x%04x) %s\n",
+ collect->set, gps_maskdump(collect->set));
#endif
if (collect->set & ONLINE_SET)
(void)fprintf(debugfp, "ONLINE: %lf\n", collect->online);
if (collect->set & TIME_SET)
(void)fprintf(debugfp, "TIME: %lf\n", collect->fix.time);
if (collect->set & LATLON_SET)
- (void)fprintf(debugfp, "LATLON: lat/lon: %lf %lf\n",
+ (void)fprintf(debugfp, "LATLON: lat/lon: %lf %lf\n",
collect->fix.latitude, collect->fix.longitude);
if (collect->set & ALTITUDE_SET)
(void)fprintf(debugfp, "ALTITUDE: altitude: %lf U: climb: %lf\n",
- collect->fix.altitude, collect->fix.climb);
+ collect->fix.altitude, collect->fix.climb);
if (collect->set & SPEED_SET)
(void)fprintf(debugfp, "SPEED: %lf\n", collect->fix.speed);
if (collect->set & TRACK_SET)
@@ -199,38 +204,44 @@ static void libgps_dump_state(struct gps_data_t *collect, time_t now)
(void)fprintf(debugfp, "CLIMB: climb: %lf\n", collect->fix.climb);
if (collect->set & STATUS_SET)
(void)fprintf(debugfp, "STATUS: status: %d (%s)\n",
- collect->status, status_values[collect->status]);
+ collect->status, status_values[collect->status]);
if (collect->set & MODE_SET)
(void)fprintf(debugfp, "MODE: mode: %d (%s)\n",
- collect->fix.mode, mode_values[collect->fix.mode]);
+ collect->fix.mode, mode_values[collect->fix.mode]);
if (collect->set & DOP_SET)
- (void)fprintf(debugfp, "DOP: satellites %d, pdop=%lf, hdop=%lf, vdop=%lf\n",
- collect->satellites_used,
- collect->dop.pdop, collect->dop.hdop, collect->dop.vdop);
+ (void)fprintf(debugfp,
+ "DOP: satellites %d, pdop=%lf, hdop=%lf, vdop=%lf\n",
+ collect->satellites_used, collect->dop.pdop,
+ collect->dop.hdop, collect->dop.vdop);
if (collect->set & VERSION_SET)
(void)fprintf(debugfp, "VERSION: release=%s rev=%s proto=%d.%d\n",
- collect->version.release,
+ collect->version.release,
collect->version.rev,
- collect->version.proto_major,
+ collect->version.proto_major,
collect->version.proto_minor);
if (collect->set & POLICY_SET)
- (void)fprintf(debugfp, "POLICY: watcher=%s nmea=%s raw=%d scaled=%s timing=%s, devpath=%s\n",
- collect->policy.watcher ? "true" : "false",
+ (void)fprintf(debugfp,
+ "POLICY: watcher=%s nmea=%s raw=%d scaled=%s timing=%s, devpath=%s\n",
+ collect->policy.watcher ? "true" : "false",
collect->policy.nmea ? "true" : "false",
- collect->policy.raw,
- collect->policy.scaled ? "true" : "false",
- collect->policy.timing ? "true" : "false",
+ collect->policy.raw,
+ collect->policy.scaled ? "true" : "false",
+ collect->policy.timing ? "true" : "false",
collect->policy.devpath);
if (collect->set & SATELLITE_SET) {
int i;
- (void)fprintf(debugfp, "SKY: satellites in view: %d\n", collect->satellites_visible);
+ (void)fprintf(debugfp, "SKY: satellites in view: %d\n",
+ collect->satellites_visible);
for (i = 0; i < collect->satellites_visible; i++) {
- (void)fprintf(debugfp, " %2.2d: %2.2d %3.3d %3.0f %c\n", collect->PRN[i], collect->elevation[i], collect->azimuth[i], collect->ss[i], collect->used[i]? 'Y' : 'N');
+ (void)fprintf(debugfp, " %2.2d: %2.2d %3.3d %3.0f %c\n",
+ collect->PRN[i], collect->elevation[i],
+ collect->azimuth[i], collect->ss[i],
+ collect->used[i] ? 'Y' : 'N');
}
}
if (collect->set & DEVICE_SET)
- (void)fprintf(debugfp, "DEVICE: Device is '%s', driver is '%s'\n",
+ (void)fprintf(debugfp, "DEVICE: Device is '%s', driver is '%s'\n",
collect->dev.path, collect->dev.driver);
#ifdef OLDSTYLE_ENABLE
if (collect->set & DEVICEID_SET)
@@ -238,10 +249,11 @@ static void libgps_dump_state(struct gps_data_t *collect, time_t now)
#endif /* OLDSTYLE_ENABLE */
if (collect->set & DEVICELIST_SET) {
int i;
- (void)fprintf(debugfp, "DEVICELIST:%d devices:\n", collect->devices.ndevices);
+ (void)fprintf(debugfp, "DEVICELIST:%d devices:\n",
+ collect->devices.ndevices);
for (i = 0; i < collect->devices.ndevices; i++) {
- (void)fprintf(debugfp, "%d: path='%s' driver='%s'\n",
- collect->devices.ndevices,
+ (void)fprintf(debugfp, "%d: path='%s' driver='%s'\n",
+ collect->devices.ndevices,
collect->devices.list[i].path,
collect->devices.list[i].driver);
}
@@ -256,7 +268,6 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
/* unpack a gpsd response into a status structure, buf must be writeable */
{
char *ns, *sp, *tp;
- int i;
libgps_debug_trace((1, "gps_unpack(%s)\n", buf));
@@ -264,9 +275,8 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
if (buf[0] == '{') {
const char *jp = buf, **next = &jp;
while (next != NULL && *next != NULL && next[0][0] != '\0') {
- libgps_debug_trace((1,
- "gps_unpack() segment parse '%s'\n",
- *next));
+ libgps_debug_trace((1,
+ "gps_unpack() segment parse '%s'\n", *next));
if (libgps_json_unpack(*next, gpsdata, next) == -1)
break;
#ifdef LIBGPS_DEBUG
@@ -281,8 +291,7 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
#endif /* OLDSTYLE_ENABLE */
}
#ifdef OLDSTYLE_ENABLE
- else
- {
+ else {
/*
* Get the decimal separator for the current application locale.
* This looks thread-unsafe, but it's not. The key is that
@@ -295,11 +304,11 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
decimal_point = locale_data->decimal_point[0];
}
- for (ns = buf; ns; ns = strstr(ns+1, "GPSD")) {
- if (/*@i1@*/strncmp(ns, "GPSD", 4) == 0) {
+ for (ns = buf; ns; ns = strstr(ns + 1, "GPSD")) {
+ if ( /*@i1@*/ strncmp(ns, "GPSD", 4) == 0) {
bool eol = false;
/* the following should execute each time we have a good next sp */
- for (sp = ns + 5; *sp != '\0'; sp = tp+1) {
+ for (sp = ns + 5; *sp != '\0'; sp = tp + 1) {
tp = sp + strcspn(sp, ",\r\n");
eol = *tp == '\r' || *tp == '\n';
if (*tp == '\0')
@@ -325,62 +334,13 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
/* note, there's a bit of skip logic after the switch */
switch (*sp) {
- case 'A':
- if (sp[2] == '?') {
- gpsdata->fix.altitude = NAN;
- } else {
- (void)sscanf(sp, "A=%lf", &gpsdata->fix.altitude);
- gpsdata->set |= ALTITUDE_SET;
- }
- break;
- case 'B':
- if (sp[2] == '?') {
- gpsdata->dev.baudrate = gpsdata->dev.stopbits = 0;
- } else
- (void)sscanf(sp, "B=%u %*d %*s %u",
- &gpsdata->dev.baudrate, &gpsdata->dev.stopbits);
- break;
- case 'C':
- if (sp[2] == '?')
- gpsdata->dev.mincycle = gpsdata->dev.cycle = 0;
- else {
- if (sscanf(sp, "C=%lf %lf",
- &gpsdata->dev.cycle,
- &gpsdata->dev.mincycle) < 2)
- gpsdata->dev.mincycle = gpsdata->dev.cycle;
- }
- break;
- case 'D':
- if (sp[2] == '?')
- gpsdata->fix.time = NAN;
- else {
- gpsdata->fix.time = iso8601_to_unix(sp+2);
- gpsdata->set |= TIME_SET;
- }
- break;
- case 'E':
- gpsdata->epe = gpsdata->fix.epx = gpsdata->fix.epy = gpsdata->fix.epv = NAN;
- /* epe should always be present if eph or epv is */
- if (sp[2] != '?') {
- char epe[20], eph[20], epv[20];
- (void)sscanf(sp, "E=%s %s %s", epe, eph, epv);
-#define DEFAULT(val) (val[0] == '?') ? NAN : atof(val)
- /*@ +floatdouble @*/
- gpsdata->epe = DEFAULT(epe);
- gpsdata->fix.epx = DEFAULT(eph)/sqrt(2);
- gpsdata->fix.epy = DEFAULT(eph)/sqrt(2);
- gpsdata->fix.epv = DEFAULT(epv);
- /*@ -floatdouble @*/
-#undef DEFAULT
- gpsdata->set |= PERR_SET | HERR_SET | VERR_SET;
- }
- break;
- case 'F': /*@ -mustfreeonly */
+ case 'F': /*@ -mustfreeonly */
if (sp[2] == '?')
gpsdata->dev.path[0] = '\0';
else {
/*@ -mayaliasunique @*/
- strncpy(gpsdata->dev.path, sp+2, sizeof(gpsdata->dev.path));
+ strncpy(gpsdata->dev.path, sp + 2,
+ sizeof(gpsdata->dev.path));
/*@ +mayaliasunique @*/
gpsdata->set |= DEVICE_SET;
}
@@ -391,48 +351,12 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
if (sp[2] == '?')
gpsdata->dev.subtype[0] = '\0';
else {
- (void)strlcpy(gpsdata->dev.subtype, sp+2, sizeof(gpsdata->dev.subtype));
+ (void)strlcpy(gpsdata->dev.subtype, sp + 2,
+ sizeof(gpsdata->dev.subtype));
gpsdata->set |= DEVICEID_SET;
}
/*@ +mustfreeonly */
break;
- case 'K':
- /*@ -nullpass -mustfreeonly -dependenttrans@*/
- if (sp[2] != '?') {
- char *rc = strdup(sp);
- char *sp2 = rc;
- char *ns2 = ns;
- memset(&gpsdata->devices, '\0', sizeof(gpsdata->devices));
- gpsdata->devices.ndevices = (int)strtol(sp2+2, &sp2, 10);
- (void)strlcpy(gpsdata->devices.list[0].path,
- strtok_r(sp2+1," \r\n", &ns2),
- sizeof(gpsdata->devices.list[0].path));
- i = 0;
- while ((sp2 = strtok_r(NULL, " \r\n", &ns2))!=NULL)
- if (i < MAXDEVICES_PER_USER-1)
- (void)strlcpy(gpsdata->devices.list[++i].path,
- sp2,
- sizeof(gpsdata->devices.list[0].path));
- free(rc);
- gpsdata->set |= DEVICELIST_SET;
- gpsdata->devices.time = timestamp();
- }
- /*@ +nullpass +mustfreeonly +dependenttrans@*/
- break;
- case 'M':
- if (sp[2] == '?') {
- gpsdata->fix.mode = MODE_NOT_SEEN;
- } else {
- gpsdata->fix.mode = atoi(sp+2);
- gpsdata->set |= MODE_SET;
- }
- break;
- case 'N':
- if (sp[2] == '?')
- gpsdata->dev.driver_mode = MODE_NMEA;
- else
- gpsdata->dev.driver_mode = atoi(sp+2);
- break;
case 'O':
if (sp[2] == '?') {
gpsdata->set = MODE_SET | STATUS_SET;
@@ -440,17 +364,19 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
gps_clear_fix(&gpsdata->fix);
} else {
struct gps_fix_t nf;
- char tag[MAXTAGLEN+1], alt[20];
- char eph[20], epv[20], track[20],speed[20], climb[20];
+ char tag[MAXTAGLEN + 1], alt[20];
+ char eph[20], epv[20], track[20], speed[20],
+ climb[20];
char epd[20], eps[20], epc[20], mode[2];
char timestr[20], ept[20], lat[20], lon[20];
- int st = sscanf(sp+2,
- "%8s %19s %19s %19s %19s %19s %19s %19s %19s %19s %19s %19s %19s %19s %1s",
- tag, timestr, ept, lat, lon,
- alt, eph, epv, track, speed, climb,
- epd, eps, epc, mode);
+ int st = sscanf(sp + 2,
+ "%8s %19s %19s %19s %19s %19s %19s %19s %19s %19s %19s %19s %19s %19s %1s",
+ tag, timestr, ept, lat, lon,
+ alt, eph, epv, track, speed,
+ climb,
+ epd, eps, epc, mode);
if (st >= 14) {
- #define DEFAULT(val) (val[0] == '?') ? NAN : atof(val)
+#define DEFAULT(val) (val[0] == '?') ? NAN : atof(val)
/*@ +floatdouble @*/
nf.time = DEFAULT(timestr);
nf.latitude = DEFAULT(lat);
@@ -458,7 +384,7 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
nf.ept = DEFAULT(ept);
nf.altitude = DEFAULT(alt);
/* designed before we split eph into epx+epy */
- nf.epx = nf.epy = DEFAULT(eph)/sqrt(2);
+ nf.epx = nf.epy = DEFAULT(eph) / sqrt(2);
nf.epv = DEFAULT(epv);
nf.track = DEFAULT(track);
nf.speed = DEFAULT(speed);
@@ -467,92 +393,37 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
nf.eps = DEFAULT(eps);
nf.epc = DEFAULT(epc);
/*@ -floatdouble @*/
- #undef DEFAULT
+#undef DEFAULT
if (st >= 15)
- nf.mode = (mode[0] == '?') ? MODE_NOT_SEEN : atoi(mode);
+ nf.mode =
+ (mode[0] ==
+ '?') ? MODE_NOT_SEEN : atoi(mode);
else
- nf.mode = (alt[0] == '?') ? MODE_2D : MODE_3D;
+ nf.mode =
+ (alt[0] == '?') ? MODE_2D : MODE_3D;
if (alt[0] != '?')
gpsdata->set |= ALTITUDE_SET | CLIMB_SET;
- if (isnan(nf.epx)==0 && isnan(nf.epy)==0)
+ if (isnan(nf.epx) == 0 && isnan(nf.epy) == 0)
gpsdata->set |= HERR_SET;
- if (isnan(nf.epv)==0)
+ if (isnan(nf.epv) == 0)
gpsdata->set |= VERR_SET;
- if (isnan(nf.track)==0)
+ if (isnan(nf.track) == 0)
gpsdata->set |= TRACK_SET | SPEED_SET;
- if (isnan(nf.eps)==0)
+ if (isnan(nf.eps) == 0)
gpsdata->set |= SPEEDERR_SET;
- if (isnan(nf.epc)==0)
+ if (isnan(nf.epc) == 0)
gpsdata->set |= CLIMBERR_SET;
gpsdata->fix = nf;
- (void)strlcpy(gpsdata->tag, tag, MAXTAGLEN+1);
- gpsdata->set |= TIME_SET|TIMERR_SET|LATLON_SET|MODE_SET;
+ (void)strlcpy(gpsdata->tag, tag,
+ MAXTAGLEN + 1);
+ gpsdata->set |=
+ TIME_SET | TIMERR_SET | LATLON_SET |
+ MODE_SET;
gpsdata->status = STATUS_FIX;
gpsdata->set |= STATUS_SET;
}
}
break;
- case 'P':
- if (sp[2] == '?') {
- gpsdata->fix.latitude = NAN;
- gpsdata->fix.longitude = NAN;
- } else {
- (void)sscanf(sp, "P=%lf %lf",
- &gpsdata->fix.latitude, &gpsdata->fix.longitude);
- gpsdata->set |= LATLON_SET;
- }
- break;
- case 'Q':
- if (sp[2] == '?') {
- gpsdata->satellites_used = 0;
- gpsdata->dop.pdop = 0;
- gpsdata->dop.hdop = 0;
- gpsdata->dop.vdop = 0;
- } else {
- (void)sscanf(sp, "Q=%d %lf %lf %lf %lf %lf",
- &gpsdata->satellites_used,
- &gpsdata->dop.pdop,
- &gpsdata->dop.hdop,
- &gpsdata->dop.vdop,
- &gpsdata->dop.tdop,
- &gpsdata->dop.gdop);
- gpsdata->set |= DOP_SET;
- }
- break;
- case 'S':
- if (sp[2] == '?') {
- gpsdata->status = -1;
- } else {
- gpsdata->status = atoi(sp+2);
- gpsdata->set |= STATUS_SET;
- }
- break;
- case 'T':
- if (sp[2] == '?') {
- gpsdata->fix.track = NAN;
- } else {
- (void)sscanf(sp, "T=%lf", &gpsdata->fix.track);
- gpsdata->set |= TRACK_SET;
- }
- break;
- case 'U':
- if (sp[2] == '?') {
- gpsdata->fix.climb = NAN;
- } else {
- (void)sscanf(sp, "U=%lf", &gpsdata->fix.climb);
- gpsdata->set |= CLIMB_SET;
- }
- break;
- case 'V':
- if (sp[2] == '?') {
- gpsdata->fix.speed = NAN;
- } else {
- (void)sscanf(sp, "V=%lf", &gpsdata->fix.speed);
- /* V reply is in kt, fix.speed is in metres/sec */
- gpsdata->fix.speed = gpsdata->fix.speed / MPS_TO_KNOTS;
- gpsdata->set |= SPEED_SET;
- }
- break;
case 'X':
if (sp[2] == '?')
gpsdata->online = -1;
@@ -570,33 +441,42 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
int elevation[MAXCHANNELS], azimuth[MAXCHANNELS];
int used[MAXCHANNELS];
double ss[MAXCHANNELS], f4;
- char tag[MAXTAGLEN+1], timestamp[21];
+ char tag[MAXTAGLEN + 1], timestamp[21];
(void)sscanf(sp, "Y=%8s %20s %d ",
- tag, timestamp, &gpsdata->satellites_visible);
+ tag, timestamp,
+ &gpsdata->satellites_visible);
(void)strncpy(gpsdata->tag, tag, MAXTAGLEN);
if (timestamp[0] != '?') {
gpsdata->set |= TIME_SET;
}
for (j = 0; j < gpsdata->satellites_visible; j++) {
- PRN[j]=elevation[j]=azimuth[j]=used[j]=0;
- ss[j]=0.0;
+ PRN[j] = elevation[j] = azimuth[j] = used[j] =
+ 0;
+ ss[j] = 0.0;
}
- for (j = 0, gpsdata->satellites_used = 0; j < gpsdata->satellites_visible; j++) {
- if ((sp != NULL) && ((sp = strchr(sp, ':')) != NULL)) {
+ for (j = 0, gpsdata->satellites_used = 0;
+ j < gpsdata->satellites_visible; j++) {
+ if ((sp != NULL)
+ && ((sp = strchr(sp, ':')) != NULL)) {
sp++;
- (void)sscanf(sp, "%d %d %d %lf %d", &i1, &i2, &i3, &f4, &i5);
+ (void)sscanf(sp, "%d %d %d %lf %d", &i1,
+ &i2, &i3, &f4, &i5);
PRN[j] = i1;
- elevation[j] = i2; azimuth[j] = i3;
- ss[j] = f4; used[j] = i5;
+ elevation[j] = i2;
+ azimuth[j] = i3;
+ ss[j] = f4;
+ used[j] = i5;
if (i5 == 1)
gpsdata->satellites_used++;
}
}
/*@ -compdef @*/
memcpy(gpsdata->PRN, PRN, sizeof(PRN));
- memcpy(gpsdata->elevation, elevation, sizeof(elevation));
- memcpy(gpsdata->azimuth, azimuth,sizeof(azimuth));
+ memcpy(gpsdata->elevation, elevation,
+ sizeof(elevation));
+ memcpy(gpsdata->azimuth, azimuth,
+ sizeof(azimuth));
memcpy(gpsdata->ss, ss, sizeof(ss));
memcpy(gpsdata->used, used, sizeof(used));
/*@ +compdef @*/
@@ -629,14 +509,16 @@ int gps_unpack(char *buf, struct gps_data_t *gpsdata)
gpsdata->raw_hook(gpsdata, buf, strlen(buf));
}
#ifndef USE_QT
- libgps_debug_trace((1, "final flags: (0x%04x) %s\n", gpsdata->set, gpsd_maskdump(gpsdata->set)));
+ libgps_debug_trace((1, "final flags: (0x%04x) %s\n", gpsdata->set,
+ gpsd_maskdump(gpsdata->set)));
#endif
return 0;
}
+
/*@ +compdef @*/
/*@ -branchstate +usereleased +mustfreefresh +nullstate +usedef @*/
-bool gps_waiting(struct gps_data_t *gpsdata)
+bool gps_waiting(struct gps_data_t * gpsdata)
/* is there input waiting from the GPS? */
{
#ifndef USE_QT
@@ -649,11 +531,12 @@ bool gps_waiting(struct gps_data_t *gpsdata)
FD_ZERO(&rfds);
FD_SET(gpsdata->gps_fd, &rfds);
- tv.tv_sec = 0; tv.tv_usec = 1;
+ tv.tv_sec = 0;
+ tv.tv_usec = 1;
/* all error conditions return "not waiting" -- crude but effective */
- return (select(gpsdata->gps_fd+1, &rfds, NULL, NULL, &tv) == 1);
+ return (select(gpsdata->gps_fd + 1, &rfds, NULL, NULL, &tv) == 1);
#else
- return ((QTcpSocket*)(gpsdata->gps_fd))->waitForReadyRead(250);
+ return ((QTcpSocket *) (gpsdata->gps_fd))->waitForReadyRead(250);
#endif
}
@@ -666,24 +549,28 @@ int gps_poll(struct gps_data_t *gpsdata)
int status = -1;
struct privdata_t *priv = PRIVATE(gpsdata);
- gpsdata->set &=~ PACKET_SET;
- for (eol = priv->buffer; *eol != '\n' && eol < priv->buffer+priv->waiting; eol++)
+ gpsdata->set &= ~PACKET_SET;
+ for (eol = priv->buffer;
+ *eol != '\n' && eol < priv->buffer + priv->waiting; eol++)
continue;
if (*eol != '\n')
- eol = NULL;
+ eol = NULL;
if (eol == NULL) {
#ifndef USE_QT
/* read data: return -1 if no data waiting or buffered, 0 otherwise */
status = (int)recv(gpsdata->gps_fd,
priv->buffer + priv->waiting,
- sizeof(priv->buffer)-priv->waiting,
- 0);
+ sizeof(priv->buffer) - priv->waiting, 0);
#else
- status = ((QTcpSocket*)(gpsdata->gps_fd))->read(priv->buffer + priv->waiting, sizeof(priv->buffer)-priv->waiting);
+ status =
+ ((QTcpSocket *) (gpsdata->gps_fd))->read(priv->buffer +
+ priv->waiting,
+ sizeof(priv->buffer) -
+ priv->waiting);
#endif
- /* if we just received data from the socket, it's in the buffer */
+ /* if we just received data from the socket, it's in the buffer */
if (status > -1)
priv->waiting += status;
/* buffer is empty - implies no data was read */
@@ -696,15 +583,17 @@ int gps_poll(struct gps_data_t *gpsdata)
return -1;
#ifndef USE_QT
/* count transient errors as success, we'll retry later */
- else if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)
+ else if (errno == EINTR || errno == EAGAIN
+ || errno == EWOULDBLOCK)
return 0;
#endif
/* hard error return of -1, pass it along */
else
return -1;
}
- /* there's buffered data waiting to be returned */
- for (eol = priv->buffer; *eol != '\n' && eol < priv->buffer+priv->waiting; eol++)
+ /* there's buffered data waiting to be returned */
+ for (eol = priv->buffer;
+ *eol != '\n' && eol < priv->buffer + priv->waiting; eol++)
continue;
if (*eol != '\n')
eol = NULL;
@@ -719,9 +608,8 @@ int gps_poll(struct gps_data_t *gpsdata)
received = gpsdata->online = timestamp();
status = gps_unpack(priv->buffer, gpsdata);
/*@+matchanyintegral@*/
- memmove(priv->buffer,
- priv->buffer + response_length,
- priv->waiting - response_length);
+ memmove(priv->buffer,
+ priv->buffer + response_length, priv->waiting - response_length);
/*@-matchanyintegral@*/
priv->waiting -= response_length;
gpsdata->set |= PACKET_SET;
@@ -729,53 +617,51 @@ int gps_poll(struct gps_data_t *gpsdata)
return 0;
}
-int gps_send(struct gps_data_t *gpsdata, const char *fmt, ... )
+int gps_send(struct gps_data_t *gpsdata, const char *fmt, ...)
/* send a command to the gpsd instance */
{
char buf[BUFSIZ];
va_list ap;
va_start(ap, fmt);
- (void)vsnprintf(buf, sizeof(buf)-2, fmt, ap);
+ (void)vsnprintf(buf, sizeof(buf) - 2, fmt, ap);
va_end(ap);
- if (buf[strlen(buf)-1] != '\n')
+ if (buf[strlen(buf) - 1] != '\n')
(void)strlcat(buf, "\n", BUFSIZ);
#ifndef USE_QT
- if (write(gpsdata->gps_fd, buf, strlen(buf)) == (ssize_t)strlen(buf))
+ if (write(gpsdata->gps_fd, buf, strlen(buf)) == (ssize_t) strlen(buf))
return 0;
else
return -1;
#else
- QTcpSocket* sock = (QTcpSocket*)gpsdata->gps_fd;
+ QTcpSocket *sock = (QTcpSocket *) gpsdata->gps_fd;
sock->write(buf, strlen(buf));
if (sock->waitForBytesWritten())
- return 0;
+ return 0;
else {
- qDebug() << "libgps::send error: " << sock->errorString();
- return -1;
+ qDebug() << "libgps::send error: " << sock->errorString();
+ return -1;
}
#endif
}
-int gps_stream(struct gps_data_t *gpsdata,
- unsigned int flags,
- /*@null@*/void *d)
+int gps_stream(struct gps_data_t *gpsdata, unsigned int flags,
+ /*@null@*/ void *d)
/* ask gpsd to stream reports at you, hiding the command details */
{
char buf[GPS_JSON_COMMAND_MAX];
- if ((flags & (WATCH_JSON|WATCH_OLDSTYLE|WATCH_NMEA|WATCH_RAW))== 0) {
+ if ((flags & (WATCH_JSON | WATCH_OLDSTYLE | WATCH_NMEA | WATCH_RAW)) == 0) {
flags |= WATCH_JSON;
}
-
#ifndef USE_QT
if (flags & POLL_NONBLOCK)
- (void)fcntl(gpsdata->gps_fd, F_SETFL, O_NONBLOCK);
+ (void)fcntl(gpsdata->gps_fd, F_SETFL, O_NONBLOCK);
#endif
if ((flags & WATCH_DISABLE) != 0) {
if ((flags & WATCH_OLDSTYLE) != 0) {
(void)strlcpy(buf, "w-", sizeof(buf));
- if (gpsdata->raw_hook != NULL || (flags & WATCH_NMEA)!=0)
+ if (gpsdata->raw_hook != NULL || (flags & WATCH_NMEA) != 0)
(void)strlcat(buf, "r-", sizeof(buf));
} else {
(void)strlcpy(buf, "?WATCH={\"enable\":false,", sizeof(buf));
@@ -789,16 +675,17 @@ int gps_stream(struct gps_data_t *gpsdata,
(void)strlcat(buf, "\"raw\":0,", sizeof(buf));
if (flags & WATCH_SCALED)
(void)strlcat(buf, "\"scaled\":false,", sizeof(buf));
- if (buf[strlen(buf)-1] == ',')
- buf[strlen(buf)-1] = '\0';
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
(void)strlcat(buf, "};", sizeof(buf));
}
libgps_debug_trace((1, "gps_stream() disable command: %s\n", buf));
return gps_send(gpsdata, buf);
- } else /* if ((flags & WATCH_ENABLE) != 0) */{
+ } else { /* if ((flags & WATCH_ENABLE) != 0) */
+
if ((flags & WATCH_OLDSTYLE) != 0) {
(void)strlcpy(buf, "w+x", sizeof(buf));
- if (gpsdata->raw_hook != NULL || (flags & WATCH_NMEA)!=0)
+ if (gpsdata->raw_hook != NULL || (flags & WATCH_NMEA) != 0)
(void)strlcat(buf, "r+", sizeof(buf));
} else {
(void)strlcpy(buf, "?WATCH={\"enable\":true,", sizeof(buf));
@@ -814,11 +701,11 @@ int gps_stream(struct gps_data_t *gpsdata,
(void)strlcat(buf, "\"scaled\":true,", sizeof(buf));
/*@-nullpass@*//* shouldn't be needed, splint has a bug */
if (flags & WATCH_DEVICE)
- (void)snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf),
- "\"device\":%s,", (char*)d);
+ (void)snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
+ "\"device\":%s,", (char *)d);
/*@+nullpass@*/
- if (buf[strlen(buf)-1] == ',')
- buf[strlen(buf)-1] = '\0';
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
(void)strlcat(buf, "};", sizeof(buf));
}
libgps_debug_trace((1, "gps_stream() enable command: %s\n", buf));
@@ -833,7 +720,7 @@ extern char /*@observer@*/ *gps_errstr(const int err)
* protocol compatibility checks
*/
#ifndef USE_QT
- return netlib_errstr(err);
+ return netlib_errstr(err);
#else
return "";
#endif
@@ -845,7 +732,7 @@ extern char /*@observer@*/ *gps_errstr(const int err)
* Not really useful for anything but debugging.
*/
-static void dumpline(struct gps_data_t *ud UNUSED,
+static void dumpline(struct gps_data_t *ud UNUSED,
char *buf, size_t ulen UNUSED)
{
puts(buf);
@@ -883,16 +770,14 @@ int main(int argc, char *argv[])
batchmode = true;
break;
case 's':
- (void)printf("Sizes: gpsdata=%zd rtcm2=%zd rtcm3=%zd ais=%zd compass=%zd raw=%zd devices=%zd policy=%zd version=%zd\n",
- sizeof(struct gps_data_t),
- sizeof(struct rtcm2_t),
- sizeof(struct rtcm3_t),
- sizeof(struct ais_t),
- sizeof(struct compass_t),
- sizeof(struct rawdata_t),
- sizeof(collect->devices),
- sizeof(struct policy_t),
- sizeof(struct version_t));
+ (void)
+ printf
+ ("Sizes: gpsdata=%zd rtcm2=%zd rtcm3=%zd ais=%zd compass=%zd raw=%zd devices=%zd policy=%zd version=%zd\n",
+ sizeof(struct gps_data_t), sizeof(struct rtcm2_t),
+ sizeof(struct rtcm3_t), sizeof(struct ais_t),
+ sizeof(struct attitude_t), sizeof(struct rawdata_t),
+ sizeof(collect->devices), sizeof(struct policy_t),
+ sizeof(struct version_t));
exit(0);
case 'D':
debug = atoi(optarg);
@@ -919,13 +804,13 @@ int main(int argc, char *argv[])
} else if (optind < argc) {
gps_set_raw_hook(collect, dumpline);
strlcpy(buf, argv[optind], BUFSIZ);
- strlcat(buf,"\n", BUFSIZ);
+ strlcat(buf, "\n", BUFSIZ);
gps_send(collect, buf);
gps_poll(collect);
libgps_dump_state(collect, time(NULL));
(void)gps_close(collect);
} else {
- int tty = isatty(0);
+ int tty = isatty(0);
gps_set_raw_hook(collect, dumpline);
if (tty)
@@ -948,8 +833,7 @@ int main(int argc, char *argv[])
return 0;
}
+
/*@-nullderef@*/
#endif /* TESTMAIN */
-
-
diff --git a/libgps_json.c b/libgps_json.c
index 6ebfdf86..eaa056c0 100644
--- a/libgps_json.c
+++ b/libgps_json.c
@@ -31,13 +31,13 @@ PERMISSIONS
*/
/*@-compdef@*/
-static int json_tpv_read(const char *buf,
- struct gps_data_t *gpsdata,
- /*@null@*/const char **endptr)
+static int json_tpv_read(const char *buf, struct gps_data_t *gpsdata,
+ /*@null@*/ const char **endptr)
{
int status;
/*@ -fullinitblock @*/
const struct json_attr_t json_attrs_1[] = {
+ /* *INDENT-OFF* */
{"class", t_check, .dflt.check = "TPV"},
{"device", t_string, .addr.string = gpsdata->dev.path,
.len = sizeof(gpsdata->dev.path)},
@@ -74,6 +74,7 @@ static int json_tpv_read(const char *buf,
{"mode", t_integer, .addr.integer = &gpsdata->fix.mode,
.dflt.integer = MODE_NOT_SEEN},
{NULL},
+ /* *INDENT-ON* */
};
/*@ +fullinitblock @*/
@@ -90,23 +91,23 @@ static int json_tpv_read(const char *buf,
gpsdata->set |= LATLON_SET;
if (isnan(gpsdata->fix.altitude) == 0)
gpsdata->set |= ALTITUDE_SET;
- if (isnan(gpsdata->fix.epx)==0 && isnan(gpsdata->fix.epy)==0)
+ if (isnan(gpsdata->fix.epx) == 0 && isnan(gpsdata->fix.epy) == 0)
gpsdata->set |= HERR_SET;
- if (isnan(gpsdata->fix.epv)==0)
+ if (isnan(gpsdata->fix.epv) == 0)
gpsdata->set |= VERR_SET;
- if (isnan(gpsdata->fix.track)==0)
+ if (isnan(gpsdata->fix.track) == 0)
gpsdata->set |= TRACK_SET;
- if (isnan(gpsdata->fix.speed)==0)
+ if (isnan(gpsdata->fix.speed) == 0)
gpsdata->set |= SPEED_SET;
- if (isnan(gpsdata->fix.climb)==0)
+ if (isnan(gpsdata->fix.climb) == 0)
gpsdata->set |= CLIMB_SET;
- if (isnan(gpsdata->fix.epd)==0)
+ if (isnan(gpsdata->fix.epd) == 0)
gpsdata->set |= TRACKERR_SET;
- if (isnan(gpsdata->fix.eps)==0)
+ if (isnan(gpsdata->fix.eps) == 0)
gpsdata->set |= SPEEDERR_SET;
- if (isnan(gpsdata->fix.epc)==0)
+ if (isnan(gpsdata->fix.epc) == 0)
gpsdata->set |= CLIMBERR_SET;
- if (isnan(gpsdata->fix.epc)==0)
+ if (isnan(gpsdata->fix.epc) == 0)
gpsdata->set |= CLIMBERR_SET;
if (gpsdata->fix.mode != MODE_NOT_SEEN)
gpsdata->set |= MODE_SET;
@@ -114,27 +115,30 @@ static int json_tpv_read(const char *buf,
return status;
}
-static int json_sky_read(const char *buf,
- struct gps_data_t *gpsdata,
- /*@null@*/const char **endptr)
+static int json_sky_read(const char *buf, struct gps_data_t *gpsdata,
+ /*@null@*/ const char **endptr)
{
bool usedflags[MAXCHANNELS];
/*@ -fullinitblock @*/
const struct json_attr_t json_attrs_2_1[] = {
+ /* *INDENT-OFF* */
{"PRN", t_integer, .addr.integer = gpsdata->PRN},
{"el", t_integer, .addr.integer = gpsdata->elevation},
{"az", t_integer, .addr.integer = gpsdata->azimuth},
{"ss", t_real, .addr.real = gpsdata->ss},
{"used", t_boolean, .addr.boolean = usedflags},
+ /* *INDENT-ON* */
{NULL},
};
const struct json_attr_t json_attrs_2[] = {
+ /* *INDENT-OFF* */
{"class", t_check, .dflt.check = "SKY"},
{"device", t_string, .addr.string = gpsdata->dev.path,
.len = sizeof(gpsdata->dev.path)},
{"tag", t_string, .addr.string = gpsdata->tag,
.len = sizeof(gpsdata->tag)},
- {"time", t_real, .addr.real = &gpsdata->fix.time},
+ {"time", t_real, .addr.real = &gpsdata->fix.time,
+ .nodefault = true},
{"hdop", t_real, .addr.real = &gpsdata->dop.hdop,
.dflt.real = NAN},
{"xdop", t_real, .addr.real = &gpsdata->dop.xdop,
@@ -154,6 +158,7 @@ static int json_sky_read(const char *buf,
.addr.array.maxlen = MAXCHANNELS,
.addr.array.count = &gpsdata->satellites_visible},
{NULL},
+ /* *INDENT-ON* */
};
/*@ +fullinitblock @*/
int status, i, j;
@@ -177,12 +182,69 @@ static int json_sky_read(const char *buf,
return 0;
}
-static int json_devicelist_read(const char *buf,
- struct gps_data_t *gpsdata,
- /*@null@*/const char **endptr)
+static int json_att_read(const char *buf, struct gps_data_t *gpsdata,
+ /*@null@*/ const char **endptr)
+{
+ /*@ -fullinitblock @*/
+ const struct json_attr_t json_attrs_1[] = {
+ /* *INDENT-OFF* */
+ {"class", t_check, .dflt.check = "ATT"},
+ {"device", t_string, .addr.string = gpsdata->dev.path,
+ .len = sizeof(gpsdata->dev.path)},
+ {"tag", t_string, .addr.string = gpsdata->tag,
+ .len = sizeof(gpsdata->tag)},
+ {"heading", t_real, .addr.real = &gpsdata->attitude.heading,
+ .dflt.real = NAN},
+ {"mag_st", t_character, .addr.character = &gpsdata->attitude.mag_st},
+ {"pitch", t_real, .addr.real = &gpsdata->attitude.pitch,
+ .dflt.real = NAN},
+ {"pitch_st", t_character, .addr.character = &gpsdata->attitude.pitch_st},
+ {"roll", t_real, .addr.real = &gpsdata->attitude.roll,
+ .dflt.real = NAN},
+ {"roll_st", t_character, .addr.character = &gpsdata->attitude.roll_st},
+ {"yaw", t_real, .addr.real = &gpsdata->attitude.yaw,
+ .dflt.real = NAN},
+ {"yaw_st", t_character, .addr.character = &gpsdata->attitude.yaw_st},
+
+ {"mag_len", t_real, .addr.real = &gpsdata->attitude.mag_len,
+ .dflt.real = NAN},
+ {"mag_x", t_real, .addr.real = &gpsdata->attitude.mag_x,
+ .dflt.real = NAN},
+ {"mag_y", t_real, .addr.real = &gpsdata->attitude.mag_y,
+ .dflt.real = NAN},
+ {"mag_z", t_real, .addr.real = &gpsdata->attitude.mag_z,
+ .dflt.real = NAN},
+ {"acc_len", t_real, .addr.real = &gpsdata->attitude.acc_len,
+ .dflt.real = NAN},
+ {"acc_x", t_real, .addr.real = &gpsdata->attitude.acc_x,
+ .dflt.real = NAN},
+ {"acc_y", t_real, .addr.real = &gpsdata->attitude.acc_y,
+ .dflt.real = NAN},
+ {"acc_z", t_real, .addr.real = &gpsdata->attitude.acc_z,
+ .dflt.real = NAN},
+ {"gyro_x", t_real, .addr.real = &gpsdata->attitude.gyro_x,
+ .dflt.real = NAN},
+ {"gyro_y", t_real, .addr.real = &gpsdata->attitude.gyro_y,
+ .dflt.real = NAN},
+
+ {"temp", t_real, .addr.real = &gpsdata->attitude.temp,
+ .dflt.real = NAN},
+ {"depth", t_real, .addr.real = &gpsdata->attitude.depth,
+ .dflt.real = NAN},
+ {NULL},
+ /* *INDENT-ON* */
+ };
+ /*@ +fullinitblock @*/
+
+ return json_read_object(buf, json_attrs_1, endptr);
+}
+
+static int json_devicelist_read(const char *buf, struct gps_data_t *gpsdata,
+ /*@null@*/ const char **endptr)
{
/*@ -fullinitblock @*/
const struct json_attr_t json_attrs_subdevices[] = {
+ /* *INDENT-OFF* */
{"class", t_check, .dflt.check = "DEVICE"},
{"path", t_string, STRUCTOBJECT(struct devconfig_t, path),
.len = sizeof(gpsdata->devices.list[0].path)},
@@ -205,13 +267,14 @@ static int json_devicelist_read(const char *buf,
{"mincycle", t_real, STRUCTOBJECT(struct devconfig_t, mincycle),
.dflt.real = NAN},
{NULL},
+ /* *INDENT-ON* */
};
/*@-type@*//* STRUCTARRAY confuses splint */
const struct json_attr_t json_attrs_devices[] = {
- {"class", t_check, .dflt.check = "DEVICES"},
- {"devices", t_array, STRUCTARRAY(gpsdata->devices.list,
- json_attrs_subdevices,
- &gpsdata->devices.ndevices)},
+ {"class", t_check,.dflt.check = "DEVICES"},
+ {"devices", t_array, STRUCTARRAY(gpsdata->devices.list,
+ json_attrs_subdevices,
+ &gpsdata->devices.ndevices)},
{NULL},
};
/*@+type@*/
@@ -225,17 +288,17 @@ static int json_devicelist_read(const char *buf,
}
gpsdata->devices.time = timestamp();
- gpsdata->set &=~ UNION_SET;
+ gpsdata->set &= ~UNION_SET;
gpsdata->set |= DEVICELIST_SET;
return 0;
}
-static int json_version_read(const char *buf,
- struct gps_data_t *gpsdata,
- /*@null@*/const char **endptr)
+static int json_version_read(const char *buf, struct gps_data_t *gpsdata,
+ /*@null@*/ const char **endptr)
{
/*@ -fullinitblock @*/
const struct json_attr_t json_attrs_version[] = {
+ /* *INDENT-OFF* */
{"class", t_check, .dflt.check = "VERSION"},
{"release", t_string, .addr.string = gpsdata->version.release,
.len = sizeof(gpsdata->version.release)},
@@ -244,6 +307,7 @@ static int json_version_read(const char *buf,
{"proto_major", t_integer, .addr.integer = &gpsdata->version.proto_major},
{"proto_minor", t_integer, .addr.integer = &gpsdata->version.proto_minor},
{NULL},
+ /* *INDENT-ON* */
};
/*@ +fullinitblock @*/
int status;
@@ -253,21 +317,22 @@ static int json_version_read(const char *buf,
if (status != 0)
return status;
- gpsdata->set &=~ UNION_SET;
+ gpsdata->set &= ~UNION_SET;
gpsdata->set |= VERSION_SET;
return 0;
}
-static int json_error_read(const char *buf,
- struct gps_data_t *gpsdata,
- /*@null@*/const char **endptr)
+static int json_error_read(const char *buf, struct gps_data_t *gpsdata,
+ /*@null@*/ const char **endptr)
{
/*@ -fullinitblock @*/
const struct json_attr_t json_attrs_error[] = {
+ /* *INDENT-OFF* */
{"class", t_check, .dflt.check = "ERROR"},
{"message", t_string, .addr.string = gpsdata->error,
.len = sizeof(gpsdata->error)},
{NULL},
+ /* *INDENT-ON* */
};
/*@ +fullinitblock @*/
int status;
@@ -277,14 +342,13 @@ static int json_error_read(const char *buf,
if (status != 0)
return status;
- gpsdata->set &=~ UNION_SET;
+ gpsdata->set &= ~UNION_SET;
gpsdata->set |= ERROR_SET;
return 0;
}
-int libgps_json_unpack(const char *buf,
- struct gps_data_t *gpsdata,
- const char **end)
+int libgps_json_unpack(const char *buf,
+ struct gps_data_t *gpsdata, const char **end)
/* the only entry point - unpack a JSON object into gpsdata_t substructures */
{
int status;
@@ -297,6 +361,8 @@ int libgps_json_unpack(const char *buf,
return json_tpv_read(buf, gpsdata, end);
} else if (STARTSWITH(classtag, "\"class\":\"SKY\"")) {
return json_sky_read(buf, gpsdata, end);
+ } else if (STARTSWITH(classtag, "\"class\":\"ATT\"")) {
+ return json_att_read(buf, gpsdata, end);
} else if (STARTSWITH(classtag, "\"class\":\"DEVICES\"")) {
return json_devicelist_read(buf, gpsdata, end);
} else if (STARTSWITH(classtag, "\"class\":\"DEVICE\"")) {
@@ -313,22 +379,22 @@ int libgps_json_unpack(const char *buf,
return json_version_read(buf, gpsdata, end);
#ifdef RTCM104V2_ENABLE
} else if (STARTSWITH(classtag, "\"class\":\"RTCM2\"")) {
- status = json_rtcm2_read(buf,
- gpsdata->dev.path, sizeof(gpsdata->dev.path),
+ status = json_rtcm2_read(buf,
+ gpsdata->dev.path, sizeof(gpsdata->dev.path),
&gpsdata->rtcm2, end);
if (status == 0) {
- gpsdata->set &=~ UNION_SET;
+ gpsdata->set &= ~UNION_SET;
gpsdata->set |= RTCM2_SET;
}
return status;
#endif /* RTCM104V2_ENABLE */
#ifdef AIVDM_ENABLE
} else if (STARTSWITH(classtag, "\"class\":\"AIS\"")) {
- status = json_ais_read(buf,
- gpsdata->dev.path, sizeof(gpsdata->dev.path),
- &gpsdata->ais, end);
+ status = json_ais_read(buf,
+ gpsdata->dev.path, sizeof(gpsdata->dev.path),
+ &gpsdata->ais, end);
if (status == 0) {
- gpsdata->set &=~ UNION_SET;
+ gpsdata->set &= ~UNION_SET;
gpsdata->set |= AIS_SET;
}
return status;
@@ -339,6 +405,7 @@ int libgps_json_unpack(const char *buf,
return -1;
#undef STARTSWITH
}
+
/*@+compdef@*/
/* libgps_json.c ends here */
diff --git a/libgpsd_core.c b/libgpsd_core.c
index 0abbc5b9..6ae828f0 100644
--- a/libgpsd_core.c
+++ b/libgpsd_core.c
@@ -7,23 +7,23 @@
#include "gpsd_config.h"
#include <sys/time.h>
#ifdef HAVE_SYS_IOCTL_H
- #include <sys/ioctl.h>
+#include <sys/ioctl.h>
#endif /* HAVE_SYS_IOCTL_H */
#ifndef S_SPLINT_S
- #ifdef HAVE_SYS_SOCKET_H
- #include <sys/socket.h>
- #else
- #define AF_UNSPEC 0
- #endif /* HAVE_SYS_SOCKET_H */
- #include <unistd.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#else
+#define AF_UNSPEC 0
+#endif /* HAVE_SYS_SOCKET_H */
+#include <unistd.h>
#endif /* S_SPLINT_S */
#include <sys/time.h>
#include <stdio.h>
#include <math.h>
#ifndef S_SPLINT_S
- #ifdef HAVE_NETDB_H
- #include <netdb.h>
- #endif /* HAVE_NETDB_H */
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif /* HAVE_NETDB_H */
#endif /* S_SPLINT_S */
#include <string.h>
#include <errno.h>
@@ -33,12 +33,12 @@
#if defined(PPS_ENABLE) && defined(TIOCMIWAIT)
#ifndef S_SPLINT_S
-#include <pthread.h> /* pacifies OpenBSD's compiler */
+#include <pthread.h> /* pacifies OpenBSD's compiler */
#endif
#endif
-int gpsd_switch_driver(struct gps_device_t *session, char* type_name)
+int gpsd_switch_driver(struct gps_device_t *session, char *type_name)
{
const struct gps_type_t **dp;
bool identified = (session->device_type != NULL);
@@ -50,15 +50,17 @@ int gpsd_switch_driver(struct gps_device_t *session, char* type_name)
/*@ -compmempass @*/
for (dp = gpsd_drivers; *dp; dp++)
if (strcmp((*dp)->type_name, type_name) == 0) {
- gpsd_report(LOG_PROG, "selecting %s driver...\n", (*dp)->type_name);
+ gpsd_report(LOG_PROG, "selecting %s driver...\n",
+ (*dp)->type_name);
gpsd_assert_sync(session);
- /*@i@*/session->device_type = *dp;
+ /*@i@*/ session->device_type = *dp;
#ifdef ALLOW_RECONFIGURE
session->gpsdata.dev.mincycle = session->device_type->min_cycle;
#endif /* ALLOW_RECONFIGURE */
/* reconfiguration might be required */
if (identified && session->device_type->event_hook != NULL)
- session->device_type->event_hook(session, event_driver_switch);
+ session->device_type->event_hook(session,
+ event_driver_switch);
/* clients should be notified */
session->notify_clients = true;
return 1;
@@ -69,17 +71,20 @@ int gpsd_switch_driver(struct gps_device_t *session, char* type_name)
}
-void gpsd_init(struct gps_device_t *session, struct gps_context_t *context, char *device)
+void gpsd_init(struct gps_device_t *session, struct gps_context_t *context,
+ char *device)
/* initialize GPS polling */
{
/*@ -mayaliasunique @*/
if (device != NULL)
- (void)strlcpy(session->gpsdata.dev.path, device, sizeof(session->gpsdata.dev.path));
+ (void)strlcpy(session->gpsdata.dev.path, device,
+ sizeof(session->gpsdata.dev.path));
/*@ -mustfreeonly @*/
session->device_type = NULL; /* start by hunting packets */
session->observed = 0;
session->rtcmtime = 0;
- session->is_serial = false; /* gpsd_open() setss this */
+ session->is_serial = false; /* gpsd_open() sets this */
+ session->sourcetype = source_unknown; /* gpsd_open() sets this */
/*@ -temptrans @*/
session->context = context;
/*@ +temptrans @*/
@@ -116,7 +121,7 @@ void gpsd_deactivate(struct gps_device_t *session)
# ifdef PPS_ENABLE
(void)ntpshm_free(session->context, session->shmTimeP);
session->shmTimeP = -1;
-# endif /* PPS_ENABLE */
+# endif /* PPS_ENABLE */
#endif /* NTPSHM_ENABLE */
#ifdef ALLOW_RECONFIGURE
if (!session->context->readonly
@@ -124,8 +129,9 @@ void gpsd_deactivate(struct gps_device_t *session)
&& session->device_type->event_hook != NULL) {
session->device_type->event_hook(session, event_deactivate);
}
- if (session->device_type!=NULL) {
- if (session->back_to_nmea && session->device_type->mode_switcher!=NULL)
+ if (session->device_type != NULL) {
+ if (session->back_to_nmea
+ && session->device_type->mode_switcher != NULL)
session->device_type->mode_switcher(session, 0);
}
#endif /* ALLOW_RECONFIGURE */
@@ -135,19 +141,19 @@ void gpsd_deactivate(struct gps_device_t *session)
}
#if defined(PPS_ENABLE) && defined(TIOCMIWAIT)
-static /*@null@*/void *gpsd_ppsmonitor(void *arg)
+static /*@null@*/ void *gpsd_ppsmonitor(void *arg)
{
struct gps_device_t *session = (struct gps_device_t *)arg;
- int cycle,duration, state = 0, laststate = -1, unchanged = 0;
+ int cycle, duration, state = 0, laststate = -1, unchanged = 0;
struct timeval tv;
- struct timeval pulse[2] = {{0,0},{0,0}};
+ struct timeval pulse[2] = { {0, 0}, {0, 0} };
#if defined(PPS_ON_CTS)
int pps_device = TIOCM_CTS;
- #define pps_device_str "CTS"
+#define pps_device_str "CTS"
#else
int pps_device = TIOCM_CAR;
- #define pps_device_str "DCD"
+#define pps_device_str "DCD"
#endif
gpsd_report(LOG_PROG, "PPS Create Thread gpsd_ppsmonitor\n");
@@ -157,7 +163,7 @@ static /*@null@*/void *gpsd_ppsmonitor(void *arg)
int ok = 0;
char *log = NULL;
- (void)gettimeofday(&tv,NULL);
+ (void)gettimeofday(&tv, NULL);
ok = 0;
log = NULL;
@@ -177,36 +183,35 @@ static /*@null@*/void *gpsd_ppsmonitor(void *arg)
if (state == laststate) {
/* some pulses may be so short that state never changes */
- if ( 999000 < cycle && 1001000 > cycle ) {
+ if (999000 < cycle && 1001000 > cycle) {
duration = 0;
unchanged = 0;
gpsd_report(LOG_RAW,
- "PPS pps-detect (%s) on %s invisible pulse\n",
- pps_device_str, session->gpsdata.dev.path);
+ "PPS pps-detect (%s) on %s invisible pulse\n",
+ pps_device_str, session->gpsdata.dev.path);
} else if (++unchanged == 10) {
unchanged = 1;
gpsd_report(LOG_WARN,
- "PPS TIOCMIWAIT returns unchanged state, ppsmonitor sleeps 10\n");
+ "PPS TIOCMIWAIT returns unchanged state, ppsmonitor sleeps 10\n");
(void)sleep(10);
}
} else {
gpsd_report(LOG_RAW, "PPS pps-detect (%s) on %s changed to %d\n",
- pps_device_str,
- session->gpsdata.dev.path, state);
+ pps_device_str, session->gpsdata.dev.path, state);
laststate = state;
unchanged = 0;
}
pulse[state] = tv;
- if ( unchanged ) {
+ if (unchanged) {
// strange, try again
continue;
}
gpsd_report(LOG_INF, "PPS cycle: %d, duration: %d @ %lu.%06lu\n",
- cycle, duration,
- (unsigned long)tv.tv_sec, (unsigned long)tv.tv_usec);
+ cycle, duration,
+ (unsigned long)tv.tv_sec, (unsigned long)tv.tv_usec);
/*@ +boolint @*/
- if ( 3 < session->context->fixcnt ) {
+ if (3 < session->context->fixcnt) {
/* Garmin doc says PPS is valid after four good fixes. */
/*
* The PPS pulse is normally a short pulse with a frequency of
@@ -246,18 +251,17 @@ static /*@null@*/void *gpsd_ppsmonitor(void *arg)
log = "5Hz PPS pulse\n";
}
} else if (999000 > cycle) {
- log = "Too long for 5Hz, too short for 1Hz\n";
+ log = "Too long for 5Hz, too short for 1Hz\n";
} else if (1001000 > cycle) {
/* looks like PPS pulse or square wave */
#if 0
/* huh? */
#if defined(NMEA_ENABLE) && defined(GPSCLOCK_ENABLE)
- && session->driver.nmea.ignore_trailing_edge
+ &&session->driver.nmea.ignore_trailing_edge
#endif /* GPSCLOCK_ENABLE */
#endif
-
- if (0 == duration) {
+ if (0 == duration) {
ok = 1;
log = "PPS invisible pulse\n";
} else if (499000 > duration) {
@@ -280,14 +284,14 @@ static /*@null@*/void *gpsd_ppsmonitor(void *arg)
log = "Too long for 1Hz, too short for 2Hz\n";
} else if (2001000 > cycle) {
/* looks like 0.5 Hz square wave */
- if (999000 > duration) {
- log = "PPS 0.5 Hz square too short duration\n";
- } else if (1001000 > duration) {
- ok = 1;
- log = "PPS 0.5 Hz square wave\n";
- } else {
- log = "PPS 0.5 Hz square too long duration\n";
- }
+ if (999000 > duration) {
+ log = "PPS 0.5 Hz square too short duration\n";
+ } else if (1001000 > duration) {
+ ok = 1;
+ log = "PPS 0.5 Hz square wave\n";
+ } else {
+ log = "PPS 0.5 Hz square too long duration\n";
+ }
} else {
log = "Too long for 0.5Hz\n";
}
@@ -297,10 +301,10 @@ static /*@null@*/void *gpsd_ppsmonitor(void *arg)
log = "PPS no fix.\n";
}
/*@ -boolint @*/
- if ( NULL != log ) {
+ if (NULL != log) {
gpsd_report(LOG_RAW, "%s", log);
}
- if ( 0 != ok ) {
+ if (0 != ok) {
(void)ntpshm_pps(session, &tv);
} else {
gpsd_report(LOG_INF, "PPS pulse rejected\n");
@@ -317,14 +321,18 @@ int gpsd_activate(struct gps_device_t *session)
/* acquire a connection to the GPS device */
{
/* special case: source may be a URI to a remote GNSS or DGPS service */
- if (netgnss_uri_check(session->gpsdata.dev.path))
- session->gpsdata.gps_fd = netgnss_uri_open(session->context,
+ if (netgnss_uri_check(session->gpsdata.dev.path)) {
+ session->gpsdata.gps_fd = netgnss_uri_open(session->context,
session->gpsdata.dev.path);
- /* otherwise, could be an AIS data feed */
- else if (strncmp(session->gpsdata.dev.path, "ais://", 6) == 0) {
+ session->sourcetype = source_socket;
+ gpsd_report(LOG_SPIN,
+ "netgnss_uri_open(%s) returns socket on fd %d\n",
+ session->gpsdata.dev.path, session->gpsdata.gps_fd);
+ /* otherwise, could be an AIS data feed */
+ } else if (strncmp(session->gpsdata.dev.path, "ais://", 6) == 0) {
char server[GPS_PATH_MAX], *port;
socket_t dsock;
- (void)strlcpy(server, session->gpsdata.dev.path+6, sizeof(server));
+ (void)strlcpy(server, session->gpsdata.dev.path + 6, sizeof(server));
session->gpsdata.gps_fd = -1;
port = strchr(server, ':');
if (port == NULL) {
@@ -332,16 +340,17 @@ int gpsd_activate(struct gps_device_t *session)
return -1;
}
*port++ = '\0';
- gpsd_report(LOG_INF, "opening AIS feed at %s, port %s.\n", server,port);
+ gpsd_report(LOG_INF, "opening AIS feed at %s, port %s.\n", server,
+ port);
if ((dsock = netlib_connectsock(AF_UNSPEC, server, port, "tcp")) < 0) {
- gpsd_report(LOG_ERROR, "AIS device open error %s.\n",
+ gpsd_report(LOG_ERROR, "AIS device open error %s.\n",
netlib_errstr(dsock));
return -1;
}
session->gpsdata.gps_fd = dsock;
}
/* otherwise, ordinary serial device */
- else
+ else
session->gpsdata.gps_fd = gpsd_open(session);
if (session->gpsdata.gps_fd < 0)
@@ -352,9 +361,11 @@ int gpsd_activate(struct gps_device_t *session)
/*@ -mustfreeonly @*/
for (dp = gpsd_drivers; *dp; dp++) {
- (void)tcflush(session->gpsdata.gps_fd, TCIOFLUSH); /* toss stale data */
- if ((*dp)->probe_detect!=NULL && (*dp)->probe_detect(session)!=0) {
- gpsd_report(LOG_PROG, "probe found %s driver...\n", (*dp)->type_name);
+ (void)tcflush(session->gpsdata.gps_fd, TCIOFLUSH); /* toss stale data */
+ if ((*dp)->probe_detect != NULL
+ && (*dp)->probe_detect(session) != 0) {
+ gpsd_report(LOG_PROG, "probe found %s driver...\n",
+ (*dp)->type_name);
session->device_type = *dp;
gpsd_assert_sync(session);
goto foundit;
@@ -362,7 +373,7 @@ int gpsd_activate(struct gps_device_t *session)
}
/*@ +mustfreeonly @*/
gpsd_report(LOG_PROG, "no probe matched...\n");
- foundit:
+ foundit:
#endif /* NON_NMEA_ENABLE */
session->gpsdata.online = timestamp();
#ifdef SIRF_ENABLE
@@ -393,8 +404,10 @@ int gpsd_activate(struct gps_device_t *session)
session->device_type->event_hook(session, event_reactivate);
}
+ session->opentime = timestamp();
return session->gpsdata.gps_fd;
}
+
/*@ +branchstate @*/
void ntpd_link_activate(struct gps_device_t *session)
@@ -408,16 +421,18 @@ void ntpd_link_activate(struct gps_device_t *session)
if (session->context->enable_ntpshm)
session->shmindex = ntpshm_alloc(session->context);
- if ( 0 > session->shmindex ) {
+ if (0 > session->shmindex) {
gpsd_report(LOG_INF, "NTPD ntpshm_alloc() failed\n");
#if defined(PPS_ENABLE) && defined(TIOCMIWAIT)
- } else if ( session->context->shmTimePPS) {
+ } else if (session->context->shmTimePPS) {
/* We also have the 1pps capability, allocate a shared-memory segment
* for the 1pps time data and launch a thread to capture the 1pps
* transitions
*/
if ((session->shmTimeP = ntpshm_alloc(session->context)) >= 0) {
- /*@i1@*/(void)pthread_create(&pt,NULL,gpsd_ppsmonitor,(void *)session);
+ /*@-unrecog@*/
+ (void)pthread_create(&pt, NULL, gpsd_ppsmonitor, (void *)session);
+ /*@+unrecog@*/
} else {
gpsd_report(LOG_INF, "NTPD ntpshm_alloc(1) failed\n");
}
@@ -427,7 +442,7 @@ void ntpd_link_activate(struct gps_device_t *session)
#endif /* NTPSHM_ENABLE */
}
-char /*@observer@*/ *gpsd_id(/*@in@*/struct gps_device_t *session)
+char /*@observer@*/ *gpsd_id( /*@in@ */ struct gps_device_t *session)
/* full ID of the device for reports, including subtype */
{
static char buf[128];
@@ -439,7 +454,7 @@ char /*@observer@*/ *gpsd_id(/*@in@*/struct gps_device_t *session)
(void)strlcat(buf, " ", sizeof(buf));
(void)strlcat(buf, session->subtype, sizeof(buf));
}
- return(buf);
+ return (buf);
}
void gpsd_error_model(struct gps_device_t *session,
@@ -468,9 +483,15 @@ void gpsd_error_model(struct gps_device_t *session,
if (NULL == session)
return;
- h_uere = (session->gpsdata.status == STATUS_DGPS_FIX ? H_UERE_WITH_DGPS : H_UERE_NO_DGPS);
- v_uere = (session->gpsdata.status == STATUS_DGPS_FIX ? V_UERE_WITH_DGPS : V_UERE_NO_DGPS);
- p_uere = (session->gpsdata.status == STATUS_DGPS_FIX ? P_UERE_WITH_DGPS : P_UERE_NO_DGPS);
+ h_uere =
+ (session->gpsdata.status ==
+ STATUS_DGPS_FIX ? H_UERE_WITH_DGPS : H_UERE_NO_DGPS);
+ v_uere =
+ (session->gpsdata.status ==
+ STATUS_DGPS_FIX ? V_UERE_WITH_DGPS : V_UERE_NO_DGPS);
+ p_uere =
+ (session->gpsdata.status ==
+ STATUS_DGPS_FIX ? P_UERE_WITH_DGPS : P_UERE_NO_DGPS);
/*
@@ -479,11 +500,14 @@ void gpsd_error_model(struct gps_device_t *session,
* Compute climb/sink in the simplest possible way.
* FIXME: Someday we should compute speed here too.
*/
- if (fix->mode>=MODE_3D && oldfix->mode>=MODE_3D && isnan(fix->climb)!=0) {
+ if (fix->mode >= MODE_3D && oldfix->mode >= MODE_3D
+ && isnan(fix->climb) != 0) {
if (fix->time == oldfix->time)
fix->climb = 0;
- else if (isnan(fix->altitude)==0 && isnan(oldfix->altitude)==0) {
- fix->climb = (fix->altitude-oldfix->altitude)/(fix->time-oldfix->time);
+ else if (isnan(fix->altitude) == 0 && isnan(oldfix->altitude) == 0) {
+ fix->climb =
+ (fix->altitude - oldfix->altitude) / (fix->time -
+ oldfix->time);
}
}
@@ -493,21 +517,24 @@ void gpsd_error_model(struct gps_device_t *session,
* the GPS clock, so we put the bound of the error
* in as a constant pending getting it from each driver.
*/
- if (isnan(fix->time)==0 && isnan(fix->ept)!=0)
+ if (isnan(fix->time) == 0 && isnan(fix->ept) != 0)
fix->ept = 0.005;
/* Other error computations depend on having a valid fix */
+ gpsd_report(LOG_DATA, "modeling errors: mode=%d, masks=%s\n",
+ fix->mode, gpsd_maskdump(session->gpsdata.set));
if (fix->mode >= MODE_2D) {
- if (isnan(fix->epx)!=0 && finite(session->gpsdata.dop.hdop)!=0)
- fix->epx = session->gpsdata.dop.xdop * h_uere;
+ if (isnan(fix->epx) != 0 && finite(session->gpsdata.dop.hdop) != 0)
+ fix->epx = session->gpsdata.dop.xdop * h_uere;
- if (isnan(fix->epy)!=0 && finite(session->gpsdata.dop.hdop)!=0)
- fix->epy = session->gpsdata.dop.ydop * h_uere;
+ if (isnan(fix->epy) != 0 && finite(session->gpsdata.dop.hdop) != 0)
+ fix->epy = session->gpsdata.dop.ydop * h_uere;
if ((fix->mode >= MODE_3D)
- && isnan(fix->epv)!=0 && finite(session->gpsdata.dop.vdop)!=0)
+ && isnan(fix->epv) != 0 && finite(session->gpsdata.dop.vdop) != 0)
fix->epv = session->gpsdata.dop.vdop * v_uere;
- if (isnan(session->gpsdata.epe)!=0 && finite(session->gpsdata.dop.pdop)!=0)
+ if (isnan(session->gpsdata.epe) != 0
+ && finite(session->gpsdata.dop.pdop) != 0)
session->gpsdata.epe = session->gpsdata.dop.pdop * p_uere;
else
session->gpsdata.epe = NAN;
@@ -517,25 +544,25 @@ void gpsd_error_model(struct gps_device_t *session,
* didn't set the speed error and climb error members itself,
* try to compute them now.
*/
- if (isnan(fix->eps)!=0)
- {
+ if (isnan(fix->eps) != 0) {
if (oldfix->mode > MODE_NO_FIX && fix->mode > MODE_NO_FIX
- && isnan(oldfix->epx)==0 && isnan(oldfix->epy)==0
- && isnan(oldfix->time)==0 && isnan(oldfix->time)==0
- && fix->time > oldfix->time) {
- double t = fix->time-oldfix->time;
- double e = EMIX(oldfix->epx,oldfix->epy) + EMIX(fix->epx,fix->epy);
- fix->eps = e/t;
+ && isnan(oldfix->epx) == 0 && isnan(oldfix->epy) == 0
+ && isnan(oldfix->time) == 0 && isnan(oldfix->time) == 0
+ && fix->time > oldfix->time) {
+ double t = fix->time - oldfix->time;
+ double e =
+ EMIX(oldfix->epx, oldfix->epy) + EMIX(fix->epx, fix->epy);
+ fix->eps = e / t;
} else
fix->eps = NAN;
}
if ((fix->mode >= MODE_3D)
- && isnan(fix->epc)!=0 && fix->time > oldfix->time) {
+ && isnan(fix->epc) != 0 && fix->time > oldfix->time) {
if (oldfix->mode > MODE_3D && fix->mode > MODE_3D) {
- double t = fix->time-oldfix->time;
+ double t = fix->time - oldfix->time;
double e = oldfix->epv + fix->epv;
/* if vertical uncertainties are zero this will be too */
- fix->epc = e/t;
+ fix->epc = e / t;
}
/*
* We compute a track error estimate solely from the
@@ -555,12 +582,12 @@ void gpsd_error_model(struct gps_device_t *session,
*/
fix->epd = NAN;
if (oldfix->mode >= MODE_2D) {
- double adj = earth_distance(
- oldfix->latitude, oldfix->longitude,
- fix->latitude, fix->longitude);
- if (isnan(adj)==0 && adj > EMIX(fix->epx, fix->epy)) {
+ double adj =
+ earth_distance(oldfix->latitude, oldfix->longitude,
+ fix->latitude, fix->longitude);
+ if (isnan(adj) == 0 && adj > EMIX(fix->epx, fix->epy)) {
double opp = EMIX(fix->epx, fix->epy);
- double hyp = sqrt(adj*adj + opp*opp);
+ double hyp = sqrt(adj * adj + opp * opp);
fix->epd = RAD_2_DEG * 2 * asin(opp / hyp);
}
}
@@ -587,8 +614,11 @@ gps_mask_t gpsd_poll(struct gps_device_t *session)
session->d_xmit_time = timestamp();
#endif /* TIMING_ENABLE */
- if (session->packet.type >= COMMENT_PACKET)
- /*@i2@*/session->observed |= PACKET_TYPEMASK(session->packet.type);
+ if (session->packet.type >= COMMENT_PACKET) {
+ /*@-shiftnegative@*/
+ session->observed |= PACKET_TYPEMASK(session->packet.type);
+ /*@+shiftnegative@*/
+ }
/* can we get a full packet from the device? */
if (session->device_type) {
@@ -603,8 +633,7 @@ gps_mask_t gpsd_poll(struct gps_device_t *session)
newlen = generic_get(session);
gpsd_report(LOG_RAW,
"packet sniff on %s finds type %d\n",
- session->gpsdata.dev.path,
- session->packet.type);
+ session->gpsdata.dev.path, session->packet.type);
if (session->packet.type > COMMENT_PACKET) {
first_sync = (session->device_type == NULL);
for (dp = gpsd_drivers; *dp; dp++)
@@ -613,37 +642,28 @@ gps_mask_t gpsd_poll(struct gps_device_t *session)
break;
}
} else if (!gpsd_next_hunt_setting(session))
- return ERROR_SET;
+ return ERROR_IS;
}
/* update the scoreboard structure from the GPS */
- gpsd_report(LOG_RAW+2, "%s sent %zd new characters\n",
+ gpsd_report(LOG_RAW + 2, "%s sent %zd new characters\n",
session->gpsdata.dev.path, newlen);
- if (newlen == -1) { /* read error */
+ if (newlen <= 0) { /* read error or EOF */
gpsd_report(LOG_INF, "GPS on %s is offline (%lf sec since data)\n",
session->gpsdata.dev.path,
timestamp() - session->gpsdata.online);
session->gpsdata.online = 0;
return 0;
- } else if (newlen == 0) { /* no new data */
- if (session->device_type != NULL && timestamp()>session->gpsdata.online+session->gpsdata.dev.cycle+1) {
- gpsd_report(LOG_INF, "GPS on %s is offline (%lf sec since data)\n",
- session->gpsdata.dev.path,
- timestamp() - session->gpsdata.online);
- session->gpsdata.online = 0;
- return 0;
- } else
- return ONLINE_SET;
- } else if (session->packet.outbuflen == 0) { /* got new data, but no packet */
- gpsd_report(LOG_RAW+3, "New data on %s, not yet a packet\n",
- session->gpsdata.dev.path);
- return ONLINE_SET;
- } else { /* we have recognized a packet */
- gps_mask_t received = PACKET_SET, dopmask = 0;
+ } else if (session->packet.outbuflen == 0) { /* got new data, but no packet */
+ gpsd_report(LOG_RAW + 3, "New data on %s, not yet a packet\n",
+ session->gpsdata.dev.path);
+ return ONLINE_IS;
+ } else { /* we have recognized a packet */
+ gps_mask_t received = PACKET_IS, dopmask = 0;
session->gpsdata.online = timestamp();
- gpsd_report(LOG_RAW+3, "Accepted packet on %s.\n",
- session->gpsdata.dev.path);
+ gpsd_report(LOG_RAW + 3, "Accepted packet on %s.\n",
+ session->gpsdata.dev.path);
#ifdef TIMING_ENABLE
session->d_recv_time = timestamp();
@@ -651,66 +671,103 @@ gps_mask_t gpsd_poll(struct gps_device_t *session)
/* track the packet count since achieving sync on the device */
if (first_sync) {
+ /*@-nullderef@*/
+ gpsd_report(LOG_INF, "%s identified as type %s (%f sec @ %dbps)\n",
+ session->gpsdata.dev.path,
+ session->device_type->type_name,
+ timestamp()- session->opentime,
+ gpsd_get_speed(&session->ttyset));
+ /*@+nullderef@*/
/* fire the identified hook */
- if (session->device_type != NULL && session->device_type->event_hook != NULL)
+ if (session->device_type != NULL
+ && session->device_type->event_hook != NULL)
session->device_type->event_hook(session, event_identified);
session->packet.counter = 0;
} else
session->packet.counter++;
/* fire the configure hook */
- if (session->device_type != NULL && session->device_type->event_hook != NULL)
+ if (session->device_type != NULL
+ && session->device_type->event_hook != NULL)
session->device_type->event_hook(session, event_configure);
/*
* If this is the first time we've achieved sync on this
* device, or the the driver type has changed for any other
* reason, that's a significant event that the caller needs to
- * know about. Using DEVICE_SET this way is a bit shaky but
+ * know about. Using DEVICE_IS this way is a bit shaky but
* we're short of bits in the flag mask (client library uses
* it differently).
*/
if (first_sync || session->notify_clients) {
session->notify_clients = false;
- received |= DEVICE_SET;
+ received |= DEVICE_IS;
}
/* Get data from current packet into the fix structure */
if (session->packet.type != COMMENT_PACKET)
- if (session->device_type != NULL && session->device_type->parse_packet!=NULL)
+ if (session->device_type != NULL
+ && session->device_type->parse_packet != NULL)
received |= session->device_type->parse_packet(session);
+#ifdef NTPSHM_ENABLE
+ /*
+ * Only update the NTP time if we've seen the leap-seconds data.
+ * Else we may be providing GPS time.
+ */
+ if (session->context->enable_ntpshm == 0) {
+ //gpsd_report(LOG_PROG, "NTP: off\n");
+ } else if ((received & TIME_IS) == 0) {
+ //gpsd_report(LOG_PROG, "NTP: No time this packet\n");
+ } else if (isnan(session->newdata.time)) {
+ //gpsd_report(LOG_PROG, "NTP: bad new time\n");
+ } else if (session->newdata.time == session->last_fixtime) {
+ //gpsd_report(LOG_PROG, "NTP: Not a new time\n");
+ } else if (session->newdata.mode == MODE_NO_FIX) {
+ //gpsd_report(LOG_PROG, "NTP: No fix\n");
+ } else {
+ double offset;
+ //gpsd_report(LOG_PROG, "NTP: Got one\n");
+ /* assume zero when there's no offset method */
+ if (session->device_type == NULL
+ || session->device_type->ntp_offset == NULL)
+ offset = 0.0;
+ else
+ offset = session->device_type->ntp_offset(session);
+ (void)ntpshm_put(session, session->newdata.time, offset);
+ session->last_fixtime = session->newdata.time;
+ }
+#endif /* NTPSHM_ENABLE */
+
/*
* Compute fix-quality data from the satellite positions.
- * These will not overwrite DOPs reported from the packet we just got.
+ * These will not overwrite any DOPs reported from the packet
+ * we just got.
*/
- if (session->newdata.mode > MODE_NO_FIX
- && (session->gpsdata.set & SATELLITE_SET) != 0
- && session->gpsdata.satellites_visible > 0) {
+ if ((received & SATELLITE_IS) != 0
+ && session->gpsdata.satellites_visible > 0) {
dopmask = fill_dop(&session->gpsdata, &session->gpsdata.dop);
session->gpsdata.epe = NAN;
}
- session->gpsdata.set = ONLINE_SET | dopmask | received;
+ session->gpsdata.set = ONLINE_IS | dopmask | received;
/* copy/merge device data into staging buffers */
/*@-nullderef -nullpass@*/
- if ((session->gpsdata.set & CLEAR_SET)!=0)
+ if ((session->gpsdata.set & CLEAR_IS) != 0)
gps_clear_fix(&session->gpsdata.fix);
/* don't downgrade mode if holding previous fix */
if (session->gpsdata.fix.mode > session->newdata.mode)
- session->gpsdata.set &=~ MODE_SET;
+ session->gpsdata.set &= ~MODE_IS;
//gpsd_report(LOG_PROG,
- // "transfer mask on %s: %02x\n", session->gpsdata.tag, session->gpsdata.set);
+ // "transfer mask on %s: %02x\n", session->gpsdata.tag, session->gpsdata.set);
gps_merge_fix(&session->gpsdata.fix,
- session->gpsdata.set,
- &session->newdata);
- gpsd_error_model(session,
- &session->gpsdata.fix, &session->oldfix);
+ session->gpsdata.set, &session->newdata);
+ gpsd_error_model(session, &session->gpsdata.fix, &session->oldfix);
/*@+nullderef -nullpass@*/
/*
* Count good fixes. We used to check
- * session->gpsdata.status > STATUS_NO_FIX
+ * session->gpsdata.status > STATUS_NO_FIX
* here, but that wasn't quite right. That tells us whether
* we think we have a valid fix for the current cycle, but remains
* true while following non-fix packets are received. What we
@@ -720,7 +777,8 @@ gps_mask_t gpsd_poll(struct gps_device_t *session)
* devices output fix packets on a regular basis, even when unable
* to derive a good fix. Such packets should set STATUS_NO_FIX.
*/
- if ((session->gpsdata.set & LATLON_SET )!=0 && session->gpsdata.status > STATUS_NO_FIX)
+ if ((session->gpsdata.set & LATLON_IS) != 0
+ && session->gpsdata.status > STATUS_NO_FIX)
session->context->fixcnt++;
#ifdef TIMING_ENABLE
@@ -732,11 +790,12 @@ gps_mask_t gpsd_poll(struct gps_device_t *session)
* driver errors, including 32-vs.-64-bit problems.
*/
/*@+relaxtypes +longunsignedintegral@*/
- if ((session->gpsdata.set & TIME_SET)!=0) {
+ if ((session->gpsdata.set & TIME_IS) != 0) {
if (session->newdata.time > time(NULL) + (60 * 60 * 24 * 365))
- gpsd_report(LOG_ERROR,"date more than a year in the future!\n");
+ gpsd_report(LOG_ERROR,
+ "date more than a year in the future!\n");
else if (session->newdata.time < 0)
- gpsd_report(LOG_ERROR,"date is negative!\n");
+ gpsd_report(LOG_ERROR, "date is negative!\n");
}
/*@-relaxtypes -longunsignedintegral@*/
@@ -751,12 +810,11 @@ void gpsd_wrap(struct gps_device_t *session)
gpsd_deactivate(session);
}
-void gpsd_zero_satellites(/*@out@*/struct gps_data_t *out)
+void gpsd_zero_satellites( /*@out@*/ struct gps_data_t *out)
{
- (void)memset(out->PRN, 0, sizeof(out->PRN));
+ (void)memset(out->PRN, 0, sizeof(out->PRN));
(void)memset(out->elevation, 0, sizeof(out->elevation));
- (void)memset(out->azimuth, 0, sizeof(out->azimuth));
- (void)memset(out->ss, 0, sizeof(out->ss));
+ (void)memset(out->azimuth, 0, sizeof(out->azimuth));
+ (void)memset(out->ss, 0, sizeof(out->ss));
out->satellites_visible = 0;
}
-
diff --git a/libgpsmm.h b/libgpsmm.h
index 711e75c8..b5cf0035 100644
--- a/libgpsmm.h
+++ b/libgpsmm.h
@@ -34,6 +34,5 @@ class LIBQGPSMMSHARED_EXPORT gpsmm {
struct gps_data_t *to_user; //we return the user a copy of the internal structure. This way she can modify it without
//integrity loss for the entire class
struct gps_data_t* backup(void) { *to_user=*gps_data; return to_user;}; //return the backup copy
- pthread_t *handler; //needed to handle the callback registration/deletion
};
#endif // _GPSD_GPSMM_H_
diff --git a/maskaudit.py.in b/maskaudit.py.in
index ad9d3e14..04c0d15a 100644
--- a/maskaudit.py.in
+++ b/maskaudit.py.in
@@ -3,67 +3,83 @@
# This file is Copyright (c) 2010 by the GPSD project
# BSD terms apply: see the file COPYING in the distribution root for details.
#
-# With -t, report on which status masks are used in the daemon vs. the
-# client-side library.
-#
# With -p, dump a Python status mask list translated from the C one.
#
-# With -c, generare C code to dump masks for debugging purposes.
+# With -c, generate C code to dump client-side masks for debugging purposes.
+#
+# With -d, generate C code to dump demon-side masks for debugging purposes.
import sys, commands, glob, getopt
class SourceExtractor:
- def __init__(self):
- self.daemonfiles = ["gpsd.c", "libgpsd_core.c", "pseudonmea.c"] + glob.glob("driver_*.c")
+ def __init__(self, sourcefile, suffix, clientside):
+ self.sourcefile = sourcefile
+ self.suffix = suffix
+ self.clientside = clientside
+ self.daemonfiles = ["gpsd.c", "libgpsd_core.c", "pseudonmea.c"] + glob.glob("driver_*.c") + ["gpsmon.c"] + glob.glob("monitor_*.c")
self.masks = []
self.primitive_masks = []
- for line in file("@srcdir@/gps.h"):
- if line.startswith("#define") and "_SET" in line:
+ for line in file(self.sourcefile):
+ if line.startswith("#define") and self.suffix in line:
fields = line.split()
self.masks.append((fields[1], fields[2]))
if fields[2].endswith("u"):
self.primitive_masks.append((fields[1], fields[2]))
def in_library(self, flag):
- (status, output) = commands.getstatusoutput("grep %s libgps.c libgps_json.c" % flag)
+ (status, output) = commands.getstatusoutput("grep %s libgps_core.c libgps_json.c gpsctl.c" % flag)
return status == 0
def in_daemon(self, flag):
(status, output) = commands.getstatusoutput("grep %s %s" % (flag, " ".join(self.daemonfiles)))
return status == 0
+ def relevant(self, flag):
+ if self.clientside:
+ return self.in_library(flag)
+ else:
+ return self.in_daemon(flag)
+
if __name__ == '__main__':
try:
- (options, arguments) = getopt.getopt(sys.argv[1:], "ptc")
- tabulate = False
- pythonize = False
- codegen = False
+ (options, arguments) = getopt.getopt(sys.argv[1:], "cdpt")
+ pythonize = tabulate = False
+ clientgen = daemongen = False
for (switch, val) in options:
- if (switch == '-t'):
- tabulate = True
if (switch == '-p'):
pythonize = True
if (switch == '-c'):
- codegen = True
+ clientgen = True
+ if (switch == '-d'):
+ daemongen = True
+ if (switch == '-t'):
+ tabulate = True
- source = SourceExtractor()
+ if clientgen:
+ source = SourceExtractor("./gps.h", "_SET", clientside=True)
+ prefix = "gps"
+ banner = "Library"
+ elif daemongen:
+ source = SourceExtractor("./gpsd.h", "_IS", clientside=False)
+ prefix = "gpsd"
+ banner = "Daemon"
if tabulate:
- print "%-14s %8s %8s" % (" ", "Library", "Daemon")
+ print "%-14s %8s %8s" % (" ", "Library", banner)
for (flag, value) in source.masks:
- print "%-14s %8s %8s" % (flag, source.in_library(flag), source.in_daemon(flag))
+ print "%-14s %8s" % (flag, source.relevant(flag))
if pythonize:
for (d, v) in source.masks:
if v[-1] == 'u':
v = v[:-1]
print "%-15s\t= %s" % (d, v)
- if codegen:
+ if not pythonize and not tabulate:
maxout = 0
for (d, v) in source.primitive_masks:
- if source.in_daemon(d):
+ if source.relevant(d):
stem = d
- if stem.endswith("_SET"):
- stem = stem[:-4]
+ if stem.endswith(source.suffix):
+ stem = stem[:-len(source.suffix)]
maxout += len(stem) + 1
print """/* This code is generated. Do not hand-hack it! */
#include <stdio.h>
@@ -71,17 +87,17 @@ if __name__ == '__main__':
#include \"gpsd.h\"
-const char *gpsd_maskdump(gps_mask_t set)
+const char *%s_maskdump(gps_mask_t set)
{
static char buf[%d];
const struct {
gps_mask_t mask;
const char *name;
- } *sp, names[] = {""" % (maxout + 3,)
+ } *sp, names[] = {""" % (prefix, maxout + 3,)
for (flag, value) in source.primitive_masks:
stem = flag
- if stem.endswith("_SET"):
- stem = stem[:-4]
+ if stem.endswith(source.suffix):
+ stem = stem[:-len(source.suffix)]
print "\t{%s,\t\"%s\"}," % (flag, stem)
print '''\
};
@@ -106,5 +122,3 @@ const char *gpsd_maskdump(gps_mask_t set)
# Local Variables:
# mode:python
# End:
-
-
diff --git a/monitor_italk.c b/monitor_italk.c
index 26a683c7..a945bdd4 100644
--- a/monitor_italk.c
+++ b/monitor_italk.c
@@ -35,229 +35,230 @@ static WINDOW *satwin, *navfixwin;
#define display (void)mvwprintw
static bool italk_initialize(void)
{
- int i;
-
- /*@ -onlytrans @*/
- /* "heavily inspired" by monitor_nmea.c */
- if ((satwin = derwin(devicewin, MAX_NR_VISIBLE_PRNS+3, 27, 0, 0)) == NULL)
- return false;
- (void)wborder(satwin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)syncok(satwin, true);
- (void)wattrset(satwin, A_BOLD);
- display(satwin, 1, 1, "Ch PRN Az El S/N Flag U");
- for (i = 0; i < MAX_NR_VISIBLE_PRNS; i++)
- display(satwin, (int)(i+2), 1, "%2d",i);
- display(satwin, MAX_NR_VISIBLE_PRNS+2, 7, " PRN_STATUS ");
- (void)wattrset(satwin, A_NORMAL);
-
- /* "heavily inspired" by monitor_nmea.c */
- if ((navfixwin = derwin(devicewin, 13, 52, 0, 27)) == NULL)
- return false;
- (void)wborder(navfixwin, 0, 0, 0, 0, 0, 0, 0, 0),
+ int i;
+
+ /*@ -onlytrans @*/
+ /* "heavily inspired" by monitor_nmea.c */
+ if ((satwin =
+ derwin(devicewin, MAX_NR_VISIBLE_PRNS + 3, 27, 0, 0)) == NULL)
+ return false;
+ (void)wborder(satwin, 0, 0, 0, 0, 0, 0, 0, 0), (void)syncok(satwin, true);
+ (void)wattrset(satwin, A_BOLD);
+ display(satwin, 1, 1, "Ch PRN Az El S/N Flag U");
+ for (i = 0; i < MAX_NR_VISIBLE_PRNS; i++)
+ display(satwin, (int)(i + 2), 1, "%2d", i);
+ display(satwin, MAX_NR_VISIBLE_PRNS + 2, 7, " PRN_STATUS ");
+ (void)wattrset(satwin, A_NORMAL);
+
+ /* "heavily inspired" by monitor_nmea.c */
+ if ((navfixwin = derwin(devicewin, 13, 52, 0, 27)) == NULL)
+ return false;
+ (void)wborder(navfixwin, 0, 0, 0, 0, 0, 0, 0, 0),
(void)wattrset(navfixwin, A_BOLD);
- (void)wmove(navfixwin, 1,1);
- (void)wprintw(navfixwin, "ECEF Pos:");
- (void)wmove(navfixwin, 2,1);
- (void)wprintw(navfixwin, "ECEF Vel:");
-
- (void)wmove(navfixwin, 4,1);
- (void)wprintw(navfixwin, "LTP Pos:");
- (void)wmove(navfixwin, 5,1);
- (void)wprintw(navfixwin, "LTP Vel:");
-
- (void)wmove(navfixwin, 7,1);
- (void)wprintw(navfixwin, "Time UTC:");
- (void)wmove(navfixwin, 8,1);
- (void)wprintw(navfixwin, "Time GPS: Day:");
-
- (void)wmove(navfixwin, 10,1);
- (void)wprintw(navfixwin, "DOP [H] [V] [P] [T] [G]");
- (void)wmove(navfixwin, 11,1);
- (void)wprintw(navfixwin, "Fix:");
-
- display(navfixwin, 12, 20, " NAV_FIX ");
- (void)wattrset(navfixwin, A_NORMAL);
- return true;
- /*@ +onlytrans @*/
+ (void)wmove(navfixwin, 1, 1);
+ (void)wprintw(navfixwin, "ECEF Pos:");
+ (void)wmove(navfixwin, 2, 1);
+ (void)wprintw(navfixwin, "ECEF Vel:");
+
+ (void)wmove(navfixwin, 4, 1);
+ (void)wprintw(navfixwin, "LTP Pos:");
+ (void)wmove(navfixwin, 5, 1);
+ (void)wprintw(navfixwin, "LTP Vel:");
+
+ (void)wmove(navfixwin, 7, 1);
+ (void)wprintw(navfixwin, "Time UTC:");
+ (void)wmove(navfixwin, 8, 1);
+ (void)wprintw(navfixwin, "Time GPS: Day:");
+
+ (void)wmove(navfixwin, 10, 1);
+ (void)wprintw(navfixwin, "DOP [H] [V] [P] [T] [G]");
+ (void)wmove(navfixwin, 11, 1);
+ (void)wprintw(navfixwin, "Fix:");
+
+ display(navfixwin, 12, 20, " NAV_FIX ");
+ (void)wattrset(navfixwin, A_NORMAL);
+ return true;
+ /*@ +onlytrans @*/
}
-static void display_itk_navfix(unsigned char *buf, size_t len) {
+static void display_itk_navfix(unsigned char *buf, size_t len)
+{
- unsigned int tow, tod, nsec, d, svlist;
- unsigned short gps_week, flags, cflags, pflags, nsv;
- unsigned short year, mon, day, hour, min, sec;
- double epx, epy, epz, evx, evy, evz;
- double latitude, longitude;
- float altitude, speed, track, climb;
- float hdop, gdop, pdop, vdop, tdop;
+ unsigned int tow, tod, nsec, d, svlist;
+ unsigned short gps_week, flags, cflags, pflags, nsv;
+ unsigned short year, mon, day, hour, min, sec;
+ double epx, epy, epz, evx, evy, evz;
+ double latitude, longitude;
+ float altitude, speed, track, climb;
+ float hdop, gdop, pdop, vdop, tdop;
- if (len != 296)
- return;
+ if (len != 296)
+ return;
- flags = (ushort)getleuw(buf, 7 + 4);
- cflags = (ushort)getleuw(buf, 7 + 6);
- pflags = (ushort)getleuw(buf, 7 + 8);
+ flags = (ushort) getleuw(buf, 7 + 4);
+ cflags = (ushort) getleuw(buf, 7 + 6);
+ pflags = (ushort) getleuw(buf, 7 + 8);
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
- nsv = (ushort)MAX(getleuw(buf, 7 + 12), getleuw(buf, 7 + 14));
- svlist = (ushort)getleul(buf, 7 + 16) | getleul(buf, 7 + 24);
-
- hour = (ushort)getleuw(buf, 7 + 66);
- min = (ushort)getleuw(buf, 7 + 68);
- sec = (ushort)getleuw(buf, 7 + 70);
- nsec = (ushort)getleul(buf, 7 + 72);
- year = (ushort)getleuw(buf, 7 + 76);
- mon = (ushort)getleuw(buf, 7 + 78);
- day = (ushort)getleuw(buf, 7 + 80);
- gps_week = (ushort)getlesw(buf, 7 + 82);
- tow = (ushort)getleul(buf, 7 + 84);
-
- epx = (double)(getlesl(buf, 7 + 96)/100.0);
- epy = (double)(getlesl(buf, 7 + 100)/100.0);
- epz = (double)(getlesl(buf, 7 + 104)/100.0);
- evx = (double)(getlesl(buf, 7 + 186)/1000.0);
- evy = (double)(getlesl(buf, 7 + 190)/1000.0);
- evz = (double)(getlesl(buf, 7 + 194)/1000.0);
-
- latitude = (double)(getlesl(buf, 7 + 144)/1e7);
- longitude = (double)(getlesl(buf, 7 + 148)/1e7);
- altitude = (float)(getlesl(buf, 7 + 152)/1e3);
- climb = (float)(getlesl(buf, 7 + 206)/1e3);
- speed = (float)(getleul(buf, 7 + 210)/1e3);
- track = (float)(getleuw(buf, 7 + 214)/1e2);
-
- hdop = (float)(getleuw(buf, 7 + 56)/100.0);
- gdop = (float)(getleuw(buf, 7 + 58)/100.0);
- pdop = (float)(getleuw(buf, 7 + 60)/100.0);
- vdop = (float)(getleuw(buf, 7 + 62)/100.0);
- tdop = (float)(getleuw(buf, 7 + 64)/100.0);
-
- (void)wmove(navfixwin, 1,11);
- (void)wprintw(navfixwin, "%12.2lf %12.2lf %12.2lfm", epx, epy, epz);
- (void)wmove(navfixwin, 2,11);
- (void)wprintw(navfixwin, "%11.2lf %11.2lf %11.2lfm/s", evx, evy, evz);
-
- (void)wmove(navfixwin, 4,11);
- (void)wprintw(navfixwin, "%11.8lf %13.8lf %8.1lfm",
- latitude, longitude, altitude);
- (void)mvwaddch(navfixwin, 4, 22, ACS_DEGREE);
- (void)mvwaddch(navfixwin, 4, 38, ACS_DEGREE);
- (void)wmove(navfixwin, 5,11);
- (void)wprintw(navfixwin, "%6.2lfm/s %5.1lf %6.2lfm/s climb",
- speed, track, climb);
- (void)mvwaddch(navfixwin, 5, 27, ACS_DEGREE);
-
- (void)wmove(navfixwin, 7,11);
- (void)wprintw(navfixwin, "%04u-%02u-%02u %02u:%02u:%02u",
- year, mon, day, hour, min, sec);
- (void)wmove(navfixwin, 8,11);
- (void)wprintw(navfixwin, "%04u+%010.3lf", gps_week, tow/1000.0);
- (void)wmove(navfixwin, 8,33);
- d = (tow/1000) / 86400;
- tod = (tow/1000) - (d*86400);
- sec = (unsigned short)tod % 60;
- min = (unsigned short)(tod / 60) % 60;
- hour = (unsigned short)tod / 3600;
- (void)wprintw(navfixwin, "%1d %02d:%02d:%02d", d, hour, min, sec);
-
- (void)wmove(navfixwin, 10,9);
- (void)wprintw(navfixwin, "%-5.1f", hdop);
- (void)wmove(navfixwin, 10,18);
- (void)wprintw(navfixwin, "%-5.1f", vdop);
- (void)wmove(navfixwin, 10,27);
- (void)wprintw(navfixwin, "%-5.1f", pdop);
- (void)wmove(navfixwin, 10,36);
- (void)wprintw(navfixwin, "%-5.1f", tdop);
- (void)wmove(navfixwin, 10,45);
- (void)wprintw(navfixwin, "%-5.1f", gdop);
-
- (void)wmove(navfixwin, 11,6);
- {
- char prn[4], satlist[38];
- unsigned int i;
- satlist[0] = '\0';
- for(i = 0; i<32; i++) {
- if (svlist & (1<<i)) {
- (void)snprintf(prn, 4, "%u ", i+1);
- (void)strlcat(satlist, prn, 38);
- }
- }
- (void)wprintw(navfixwin, "%02d = %-38s", nsv, satlist);
+ nsv = (ushort) MAX(getleuw(buf, 7 + 12), getleuw(buf, 7 + 14));
+ svlist = (ushort) getleul(buf, 7 + 16) | getleul(buf, 7 + 24);
+
+ hour = (ushort) getleuw(buf, 7 + 66);
+ min = (ushort) getleuw(buf, 7 + 68);
+ sec = (ushort) getleuw(buf, 7 + 70);
+ nsec = (ushort) getleul(buf, 7 + 72);
+ year = (ushort) getleuw(buf, 7 + 76);
+ mon = (ushort) getleuw(buf, 7 + 78);
+ day = (ushort) getleuw(buf, 7 + 80);
+ gps_week = (ushort) getlesw(buf, 7 + 82);
+ tow = (ushort) getleul(buf, 7 + 84);
+
+ epx = (double)(getlesl(buf, 7 + 96) / 100.0);
+ epy = (double)(getlesl(buf, 7 + 100) / 100.0);
+ epz = (double)(getlesl(buf, 7 + 104) / 100.0);
+ evx = (double)(getlesl(buf, 7 + 186) / 1000.0);
+ evy = (double)(getlesl(buf, 7 + 190) / 1000.0);
+ evz = (double)(getlesl(buf, 7 + 194) / 1000.0);
+
+ latitude = (double)(getlesl(buf, 7 + 144) / 1e7);
+ longitude = (double)(getlesl(buf, 7 + 148) / 1e7);
+ altitude = (float)(getlesl(buf, 7 + 152) / 1e3);
+ climb = (float)(getlesl(buf, 7 + 206) / 1e3);
+ speed = (float)(getleul(buf, 7 + 210) / 1e3);
+ track = (float)(getleuw(buf, 7 + 214) / 1e2);
+
+ hdop = (float)(getleuw(buf, 7 + 56) / 100.0);
+ gdop = (float)(getleuw(buf, 7 + 58) / 100.0);
+ pdop = (float)(getleuw(buf, 7 + 60) / 100.0);
+ vdop = (float)(getleuw(buf, 7 + 62) / 100.0);
+ tdop = (float)(getleuw(buf, 7 + 64) / 100.0);
+
+ (void)wmove(navfixwin, 1, 11);
+ (void)wprintw(navfixwin, "%12.2lf %12.2lf %12.2lfm", epx, epy, epz);
+ (void)wmove(navfixwin, 2, 11);
+ (void)wprintw(navfixwin, "%11.2lf %11.2lf %11.2lfm/s", evx, evy, evz);
+
+ (void)wmove(navfixwin, 4, 11);
+ (void)wprintw(navfixwin, "%11.8lf %13.8lf %8.1lfm",
+ latitude, longitude, altitude);
+ (void)mvwaddch(navfixwin, 4, 22, ACS_DEGREE);
+ (void)mvwaddch(navfixwin, 4, 38, ACS_DEGREE);
+ (void)wmove(navfixwin, 5, 11);
+ (void)wprintw(navfixwin, "%6.2lfm/s %5.1lf %6.2lfm/s climb",
+ speed, track, climb);
+ (void)mvwaddch(navfixwin, 5, 27, ACS_DEGREE);
+
+ (void)wmove(navfixwin, 7, 11);
+ (void)wprintw(navfixwin, "%04u-%02u-%02u %02u:%02u:%02u",
+ year, mon, day, hour, min, sec);
+ (void)wmove(navfixwin, 8, 11);
+ (void)wprintw(navfixwin, "%04u+%010.3lf", gps_week, tow / 1000.0);
+ (void)wmove(navfixwin, 8, 33);
+ d = (tow / 1000) / 86400;
+ tod = (tow / 1000) - (d * 86400);
+ sec = (unsigned short)tod % 60;
+ min = (unsigned short)(tod / 60) % 60;
+ hour = (unsigned short)tod / 3600;
+ (void)wprintw(navfixwin, "%1d %02d:%02d:%02d", d, hour, min, sec);
+
+ (void)wmove(navfixwin, 10, 9);
+ (void)wprintw(navfixwin, "%-5.1f", hdop);
+ (void)wmove(navfixwin, 10, 18);
+ (void)wprintw(navfixwin, "%-5.1f", vdop);
+ (void)wmove(navfixwin, 10, 27);
+ (void)wprintw(navfixwin, "%-5.1f", pdop);
+ (void)wmove(navfixwin, 10, 36);
+ (void)wprintw(navfixwin, "%-5.1f", tdop);
+ (void)wmove(navfixwin, 10, 45);
+ (void)wprintw(navfixwin, "%-5.1f", gdop);
+
+ (void)wmove(navfixwin, 11, 6);
+ {
+ char prn[4], satlist[38];
+ unsigned int i;
+ satlist[0] = '\0';
+ for (i = 0; i < 32; i++) {
+ if (svlist & (1 << i)) {
+ (void)snprintf(prn, 4, "%u ", i + 1);
+ (void)strlcat(satlist, prn, 38);
+ }
}
- (void)wnoutrefresh(navfixwin);
+ (void)wprintw(navfixwin, "%02d = %-38s", nsv, satlist);
+ }
+ (void)wnoutrefresh(navfixwin);
}
static void display_itk_prnstatus(unsigned char *buf, size_t len)
{
- int i, nchan;
- if (len < 62)
- return;
-
- nchan = (int)getleuw(buf, 7 +50);
- if (nchan > MAX_NR_VISIBLE_PRNS)
- nchan = MAX_NR_VISIBLE_PRNS;
- for (i = 0; i < nchan; i++) {
- int off = 7+ 52 + 10 * i;
- unsigned short fl;
- unsigned char ss, prn, el, az;
-
- fl = (unsigned short)getleuw(buf, off);
- ss = (unsigned char)getleuw(buf, off+2)&0xff;
- prn = (unsigned char)getleuw(buf, off+4)&0xff;
- el = (unsigned char)getlesw(buf, off+6)&0xff;
- az = (unsigned char)getlesw(buf, off+8)&0xff;
- (void)wmove(satwin, i+2, 4);
- (void)wprintw(satwin, "%3d %3d %2d %02d %04x %c",
- prn, az, el, ss, fl,
- (fl & PRN_FLAG_USE_IN_NAV)? 'Y' : ' ');
- }
- for ( ; i < MAX_NR_VISIBLE_PRNS; i++) {
- (void)wmove(satwin, (int)i+2, 4);
- (void)wprintw(satwin, " ");
- }
- (void)wnoutrefresh(satwin);
+ int i, nchan;
+ if (len < 62)
return;
+
+ nchan = (int)getleuw(buf, 7 + 50);
+ if (nchan > MAX_NR_VISIBLE_PRNS)
+ nchan = MAX_NR_VISIBLE_PRNS;
+ for (i = 0; i < nchan; i++) {
+ int off = 7 + 52 + 10 * i;
+ unsigned short fl;
+ unsigned char ss, prn, el, az;
+
+ fl = (unsigned short)getleuw(buf, off);
+ ss = (unsigned char)getleuw(buf, off + 2) & 0xff;
+ prn = (unsigned char)getleuw(buf, off + 4) & 0xff;
+ el = (unsigned char)getlesw(buf, off + 6) & 0xff;
+ az = (unsigned char)getlesw(buf, off + 8) & 0xff;
+ (void)wmove(satwin, i + 2, 4);
+ (void)wprintw(satwin, "%3d %3d %2d %02d %04x %c",
+ prn, az, el, ss, fl,
+ (fl & PRN_FLAG_USE_IN_NAV) ? 'Y' : ' ');
+ }
+ for (; i < MAX_NR_VISIBLE_PRNS; i++) {
+ (void)wmove(satwin, (int)i + 2, 4);
+ (void)wprintw(satwin, " ");
+ }
+ (void)wnoutrefresh(satwin);
+ return;
}
static void italk_update(void)
{
- unsigned char *buf;
- size_t len;
- unsigned char type;
-
- buf = session.packet.outbuffer;
- len = session.packet.outbuflen;
- type = (unsigned char)getub(buf, 4);
- switch (type) {
- case ITALK_NAV_FIX:
- display_itk_navfix(buf, len);
- break;
- case ITALK_PRN_STATUS:
- display_itk_prnstatus(buf, len);
- break;
- default:
- break;
- }
+ unsigned char *buf;
+ size_t len;
+ unsigned char type;
+
+ buf = session.packet.outbuffer;
+ len = session.packet.outbuflen;
+ type = (unsigned char)getub(buf, 4);
+ switch (type) {
+ case ITALK_NAV_FIX:
+ display_itk_navfix(buf, len);
+ break;
+ case ITALK_PRN_STATUS:
+ display_itk_prnstatus(buf, len);
+ break;
+ default:
+ break;
+ }
}
-static int italk_command(char line[] UNUSED)
+static int italk_command(char line[]UNUSED)
{
- return COMMAND_UNKNOWN;
+ return COMMAND_UNKNOWN;
}
static void italk_wrap(void)
{
- (void)delwin(satwin);
- return;
+ (void)delwin(satwin);
+ return;
}
const struct monitor_object_t italk_mmt = {
- .initialize = italk_initialize,
- .update = italk_update,
- .command = italk_command,
- .wrap = italk_wrap,
- .min_y = 23, .min_x = 80, /* size of the device window */
- .driver = &italk_binary,
+ .initialize = italk_initialize,
+ .update = italk_update,
+ .command = italk_command,
+ .wrap = italk_wrap,
+ .min_y = 23,.min_x = 80, /* size of the device window */
+ .driver = &italk_binary,
};
#endif
diff --git a/monitor_nmea.c b/monitor_nmea.c
index fb11e76d..184c524e 100644
--- a/monitor_nmea.c
+++ b/monitor_nmea.c
@@ -1,8 +1,7 @@
/*
- * nmeamon.c - gpsmon support for NMEA devices.
+ * monitor_nmea.c - gpsmon support for NMEA devices.
*
- * To do: Support for GPGLL, GPRME, GPZDA, OHPR, PASHR NMEA sentences.
- * Support for Tripmate, Earthmate, True North and Oceanserver devices.
+ * To do: Support for GPGLL, GPGBS, GPZDA, PASHR NMEA sentences.
*
* This file is Copyright (c) 2010 by the GPSD project
* BSD terms apply: see the file COPYING in the distribution root for details.
@@ -52,7 +51,7 @@ static bool nmea_initialize(void)
int i;
/*@ -onlytrans @*/
- cookedwin = derwin(devicewin, 3, 80, 0, 0);
+ cookedwin = derwin(devicewin, 3, 80, 0, 0);
(void)wborder(cookedwin, 0, 0, 0, 0, 0, 0, 0, 0);
(void)syncok(cookedwin, true);
wattrset(cookedwin, A_BOLD);
@@ -62,26 +61,25 @@ static bool nmea_initialize(void)
mvwaddstr(cookedwin, 2, 34, " Cooked PVT ");
wattrset(cookedwin, A_NORMAL);
- nmeawin = derwin(devicewin, 3, 80, 3, 0);
+ nmeawin = derwin(devicewin, 3, 80, 3, 0);
(void)wborder(nmeawin, 0, 0, 0, 0, 0, 0, 0, 0);
(void)syncok(nmeawin, true);
wattrset(nmeawin, A_BOLD);
mvwaddstr(nmeawin, 2, 34, " Sentences ");
wattrset(nmeawin, A_NORMAL);
- satwin = derwin(devicewin, MAXSATS+3, 20, 6, 0);
- (void)wborder(satwin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)syncok(satwin, true);
+ satwin = derwin(devicewin, MAXSATS + 3, 20, 6, 0);
+ (void)wborder(satwin, 0, 0, 0, 0, 0, 0, 0, 0), (void)syncok(satwin, true);
(void)wattrset(satwin, A_BOLD);
(void)mvwprintw(satwin, 1, 1, "Ch PRN Az El S/N");
for (i = 0; i < MAXSATS; i++)
- (void)mvwprintw(satwin, (int)(i+2), 1, "%2d",i);
+ (void)mvwprintw(satwin, (int)(i + 2), 1, "%2d", i);
(void)mvwprintw(satwin, 14, 7, " GSV ");
(void)wattrset(satwin, A_NORMAL);
- gprmcwin = derwin(devicewin, 9, 30, 6, 20);
+ gprmcwin = derwin(devicewin, 9, 30, 6, 20);
(void)wborder(gprmcwin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)syncok(gprmcwin, true);
+ (void)syncok(gprmcwin, true);
(void)wattrset(gprmcwin, A_BOLD);
(void)mvwprintw(gprmcwin, 1, 1, "Time: ");
(void)mvwprintw(gprmcwin, 2, 1, "Latitude: ");
@@ -93,9 +91,9 @@ static bool nmea_initialize(void)
(void)mvwprintw(gprmcwin, 8, 12, " RMC ");
(void)wattrset(gprmcwin, A_NORMAL);
- gpgsawin = derwin(devicewin, 5, 30, 15, 20);
+ gpgsawin = derwin(devicewin, 5, 30, 15, 20);
(void)wborder(gpgsawin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)syncok(gpgsawin, true);
+ (void)syncok(gpgsawin, true);
(void)wattrset(gpgsawin, A_BOLD);
(void)mvwprintw(gpgsawin, 1, 1, "Mode: ");
(void)mvwprintw(gpgsawin, 2, 1, "Sats: ");
@@ -103,9 +101,9 @@ static bool nmea_initialize(void)
(void)mvwprintw(gpgsawin, 4, 12, " GSA ");
(void)wattrset(gpgsawin, A_NORMAL);
- gpggawin = derwin(devicewin, 9, 30, 6, 50);
+ gpggawin = derwin(devicewin, 9, 30, 6, 50);
(void)wborder(gpggawin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)syncok(gpggawin, true);
+ (void)syncok(gpggawin, true);
(void)wattrset(gpggawin, A_BOLD);
(void)mvwprintw(gpggawin, 1, 1, "Time: ");
(void)mvwprintw(gpggawin, 2, 1, "Latitude: ");
@@ -127,39 +125,46 @@ static void cooked_pvt(void)
{
char scr[128];
- if (isnan(session.gpsdata.fix.time)==0) {
+ if (isnan(session.gpsdata.fix.time) == 0) {
(void)unix_to_iso8601(session.gpsdata.fix.time, scr, sizeof(scr));
} else
(void)snprintf(scr, sizeof(scr), "n/a");
(void)mvwprintw(cookedwin, 1, 7, "%-22s", scr);
- if (session.gpsdata.fix.mode >= MODE_2D && isnan(session.gpsdata.fix.latitude)==0) {
+ if (session.gpsdata.fix.mode >= MODE_2D
+ && isnan(session.gpsdata.fix.latitude) == 0) {
(void)snprintf(scr, sizeof(scr), "%s %c",
- deg_to_str(deg_ddmmss, fabs(session.gpsdata.fix.latitude)),
+ deg_to_str(deg_ddmmss,
+ fabs(session.gpsdata.fix.latitude)),
(session.gpsdata.fix.latitude < 0) ? 'S' : 'N');
} else
(void)snprintf(scr, sizeof(scr), "n/a");
(void)mvwprintw(cookedwin, 1, 36, "%-17s", scr);
- if (session.gpsdata.fix.mode >= MODE_2D && isnan(session.gpsdata.fix.longitude)==0) {
+ if (session.gpsdata.fix.mode >= MODE_2D
+ && isnan(session.gpsdata.fix.longitude) == 0) {
(void)snprintf(scr, sizeof(scr), "%s %c",
- deg_to_str(deg_ddmmss, fabs(session.gpsdata.fix.longitude)),
+ deg_to_str(deg_ddmmss,
+ fabs(session.gpsdata.fix.longitude)),
(session.gpsdata.fix.longitude < 0) ? 'W' : 'E');
} else
(void)snprintf(scr, sizeof(scr), "n/a");
(void)mvwprintw(cookedwin, 1, 60, "%-17s", scr);
#if 0
- if (isnan(session.gpsdata.fix.track)==0)
- (void)snprintf(scr, sizeof(scr), "%.1f meters/sec", session.gpsdata.fix.speed);
+ if (isnan(session.gpsdata.fix.track) == 0)
+ (void)snprintf(scr, sizeof(scr), "%.1f meters/sec",
+ session.gpsdata.fix.speed);
else
(void)snprintf(scr, sizeof(scr), "n/a");
(void)mvwprintw(cookedwin, 1, 33, "%-17s", scr);
/* fill in the course */
- if (session.gpsdata.fix.mode >= MODE_2D && isnan(session.gpsdata.fix.track)==0)
- (void)snprintf(scr, sizeof(scr), "%.1f deg", session.gpsdata.fix.track);
+ if (session.gpsdata.fix.mode >= MODE_2D
+ && isnan(session.gpsdata.fix.track) == 0)
+ (void)snprintf(scr, sizeof(scr), "%.1f deg",
+ session.gpsdata.fix.track);
else
(void)snprintf(scr, sizeof(scr), "n/a");
(void)mvwprintw(cookedwin, 5, 11, "%-17s", scr);
@@ -173,11 +178,11 @@ static void nmea_update(void)
static char sentences[NMEA_MAX];
char **fields;
- assert(cookedwin!=NULL);
- assert(nmeawin!=NULL);
- assert(gpgsawin!=NULL);
- assert(gpggawin!=NULL);
- assert(gprmcwin!=NULL);
+ assert(cookedwin != NULL);
+ assert(nmeawin != NULL);
+ assert(gpgsawin != NULL);
+ assert(gpggawin != NULL);
+ assert(gprmcwin != NULL);
fields = session.driver.nmea.field;
@@ -187,7 +192,7 @@ static void nmea_update(void)
getmaxyx(nmeawin, ymax, xmax);
if (strstr(sentences, fields[0]) == NULL) {
char *s_end = sentences + strlen(sentences);
- if ((int)(strlen(sentences) + strlen(fields[0])) < xmax-2) {
+ if ((int)(strlen(sentences) + strlen(fields[0])) < xmax - 2) {
*s_end++ = ' ';
(void)strlcpy(s_end, fields[0], NMEA_MAX);
} else {
@@ -204,29 +209,29 @@ static void nmea_update(void)
* tag.
*/
now = timestamp();
- if (now > last_tick && (now - last_tick) > tick_interval)
- {
+ if (now > last_tick && (now - last_tick) > tick_interval) {
char *findme = strstr(sentences, fields[0]);
tick_interval = now - last_tick;
if (findme != NULL) {
- mvwchgat(nmeawin, SENTENCELINE, 1, xmax-13, A_NORMAL, 0, NULL);
- mvwchgat(nmeawin,
- SENTENCELINE, 1+(findme-sentences),
- (int)strlen(fields[0]),
- A_BOLD, 0, NULL);
+ mvwchgat(nmeawin, SENTENCELINE, 1, xmax - 13, A_NORMAL, 0,
+ NULL);
+ mvwchgat(nmeawin, SENTENCELINE, 1 + (findme - sentences),
+ (int)strlen(fields[0]), A_BOLD, 0, NULL);
}
}
last_tick = now;
- if (strcmp(fields[0], "GPGSV") == 0
- || strcmp(fields[0], "GNGSV") == 0
- || strcmp(fields[0], "GLGSV") == 0) {
+ if (strcmp(fields[0], "GPGSV") == 0
+ || strcmp(fields[0], "GNGSV") == 0
+ || strcmp(fields[0], "GLGSV") == 0) {
int i;
- int nsats = (session.gpsdata.satellites_visible < MAXSATS) ? session.gpsdata.satellites_visible : MAXSATS;
+ int nsats =
+ (session.gpsdata.satellites_visible <
+ MAXSATS) ? session.gpsdata.satellites_visible : MAXSATS;
for (i = 0; i < nsats; i++) {
- (void)wmove(satwin, i+2, 3);
+ (void)wmove(satwin, i + 2, 3);
(void)wprintw(satwin, " %3d %3d%3d %3.0f",
session.gpsdata.PRN[i],
session.gpsdata.azimuth[i],
@@ -235,14 +240,14 @@ static void nmea_update(void)
}
/* add overflow mark to the display */
if (nsats <= MAXSATS)
- (void)mvwaddch(satwin, MAXSATS+2, 18, ACS_HLINE);
+ (void)mvwaddch(satwin, MAXSATS + 2, 18, ACS_HLINE);
else
- (void)mvwaddch(satwin, MAXSATS+2, 18, ACS_DARROW);
+ (void)mvwaddch(satwin, MAXSATS + 2, 18, ACS_DARROW);
}
- if (strcmp(fields[0], "GPRMC") == 0
- || strcmp(fields[0], "GNRMC") == 0
- || strcmp(fields[0], "GLRMC") == 0) {
+ if (strcmp(fields[0], "GPRMC") == 0
+ || strcmp(fields[0], "GNRMC") == 0
+ || strcmp(fields[0], "GLRMC") == 0) {
/* time, lat, lon, course, speed */
(void)mvwaddstr(gprmcwin, 1, 12, fields[1]);
(void)mvwprintw(gprmcwin, 2, 12, "%12s %s", fields[3], fields[4]);
@@ -252,30 +257,31 @@ static void nmea_update(void)
/* the status field, FAA code, and magnetic variation */
(void)mvwaddstr(gprmcwin, 6, 12, fields[2]);
(void)mvwaddstr(gprmcwin, 6, 25, fields[12]);
- (void)mvwprintw(gprmcwin, 7, 12, "%-5s%s", fields[10],fields[11]);
+ (void)mvwprintw(gprmcwin, 7, 12, "%-5s%s", fields[10],
+ fields[11]);
cooked_pvt(); /* cooked version of PVT */
}
- if (strcmp(fields[0], "GPGSA") == 0
- || strcmp(fields[0], "GNGSA") == 0
- || strcmp(fields[0], "GLGSA") == 0) {
+ if (strcmp(fields[0], "GPGSA") == 0
+ || strcmp(fields[0], "GNGSA") == 0
+ || strcmp(fields[0], "GLGSA") == 0) {
char scr[128];
int i;
- (void)mvwprintw(gpgsawin, 1,7, "%1s %s", fields[1], fields[2]);
+ (void)mvwprintw(gpgsawin, 1, 7, "%1s %s", fields[1], fields[2]);
(void)wmove(gpgsawin, 2, 7);
(void)wclrtoeol(gpgsawin);
scr[0] = '\0';
for (i = 0; i < session.gpsdata.satellites_used; i++) {
- (void)snprintf(scr + strlen(scr), sizeof(scr)-strlen(scr),
+ (void)snprintf(scr + strlen(scr), sizeof(scr) - strlen(scr),
"%d ", session.gpsdata.used[i]);
}
getmaxyx(gpgsawin, ymax, xmax);
- (void)mvwaddnstr(gpgsawin, 2, 7, scr, xmax-2-7);
- if (strlen(scr) >= (size_t)(xmax-2)) {
- mvwaddch(gpgsawin, 2, xmax-2-7, (chtype)'.');
- mvwaddch(gpgsawin, 2, xmax-3-7, (chtype)'.');
- mvwaddch(gpgsawin, 2, xmax-4-7, (chtype)'.');
+ (void)mvwaddnstr(gpgsawin, 2, 7, scr, xmax - 2 - 7);
+ if (strlen(scr) >= (size_t) (xmax - 2)) {
+ mvwaddch(gpgsawin, 2, xmax - 2 - 7, (chtype) '.');
+ mvwaddch(gpgsawin, 2, xmax - 3 - 7, (chtype) '.');
+ mvwaddch(gpgsawin, 2, xmax - 4 - 7, (chtype) '.');
}
monitor_fixframe(gpgsawin);
(void)mvwprintw(gpgsawin, 3, 8, "%-5s", fields[16]);
@@ -283,9 +289,9 @@ static void nmea_update(void)
(void)mvwprintw(gpgsawin, 3, 24, "%-5s", fields[15]);
monitor_fixframe(gpgsawin);
}
- if (strcmp(fields[0], "GPGGA") == 0
- || strcmp(fields[0], "GNGGA") == 0
- || strcmp(fields[0], "GLGGA") == 0) {
+ if (strcmp(fields[0], "GPGGA") == 0
+ || strcmp(fields[0], "GNGGA") == 0
+ || strcmp(fields[0], "GLGGA") == 0) {
(void)mvwprintw(gpggawin, 1, 12, "%-17s", fields[1]);
(void)mvwprintw(gpggawin, 2, 12, "%-17s", fields[2]);
(void)mvwprintw(gpggawin, 3, 12, "%-17s", fields[4]);
@@ -297,6 +303,7 @@ static void nmea_update(void)
}
}
}
+
/*@ +globstate +nullpass */
#undef SENTENCELINE
@@ -314,7 +321,7 @@ const struct monitor_object_t nmea_mmt = {
.update = nmea_update,
.command = NULL,
.wrap = nmea_wrap,
- .min_y = 21, .min_x = 80,
+ .min_y = 21,.min_x = 80,
.driver = &nmea,
};
@@ -325,13 +332,13 @@ const struct monitor_object_t nmea_mmt = {
*****************************************************************************/
#ifdef ALLOW_CONTROLSEND
-static void monitor_nmea_send(const char *fmt, ... )
+static void monitor_nmea_send(const char *fmt, ...)
{
char buf[BUFSIZ];
va_list ap;
- va_start(ap, fmt) ;
- (void)vsnprintf(buf, sizeof(buf)-5, fmt, ap);
+ va_start(ap, fmt);
+ (void)vsnprintf(buf, sizeof(buf) - 5, fmt, ap);
va_end(ap);
(void)monitor_control_send((unsigned char *)buf, strlen(buf));
}
@@ -354,7 +361,7 @@ const struct monitor_object_t garmin_mmt = {
.update = nmea_update,
.command = NULL,
.wrap = nmea_wrap,
- .min_y = 21, .min_x = 80,
+ .min_y = 21,.min_x = 80,
.driver = &garmin,
};
#endif /* GARMIN_ENABLE && NMEA_ENABLE */
@@ -368,10 +375,9 @@ extern const struct gps_type_t ashtech;
#ifdef ALLOW_CONTROLSEND
static int ashtech_command(char line[])
{
- switch (line[0])
- {
- case 'N': /* normal = 9600, GGA+GSA+GSV+RMC+ZDA */
- monitor_nmea_send("$PASHS,NME,ALL,A,OFF"); /* silence outbound chatter */
+ switch (line[0]) {
+ case 'N': /* normal = 9600, GGA+GSA+GSV+RMC+ZDA */
+ monitor_nmea_send("$PASHS,NME,ALL,A,OFF"); /* silence outbound chatter */
monitor_nmea_send("$PASHS,NME,ALL,B,OFF");
monitor_nmea_send("$PASHS,NME,GGA,A,ON");
monitor_nmea_send("$PASHS,NME,GSA,A,ON");
@@ -380,13 +386,13 @@ static int ashtech_command(char line[])
monitor_nmea_send("$PASHS,NME,ZDA,A,ON");
monitor_nmea_send("$PASHS,INI,%d,%d,,,0,",
- ASHTECH_SPEED_9600, ASHTECH_SPEED_9600);
- (void)sleep(6); /* it takes 4-6 sec for the receiver to reboot */
- monitor_nmea_send("$PASHS,WAS,ON"); /* enable WAAS */
+ ASHTECH_SPEED_9600, ASHTECH_SPEED_9600);
+ (void)sleep(6); /* it takes 4-6 sec for the receiver to reboot */
+ monitor_nmea_send("$PASHS,WAS,ON"); /* enable WAAS */
break;
- case 'R': /* raw = 57600, normal+XPG+POS+SAT+MCA+PBN+SNV */
- monitor_nmea_send("$PASHS,NME,ALL,A,OFF"); /* silence outbound chatter */
+ case 'R': /* raw = 57600, normal+XPG+POS+SAT+MCA+PBN+SNV */
+ monitor_nmea_send("$PASHS,NME,ALL,A,OFF"); /* silence outbound chatter */
monitor_nmea_send("$PASHS,NME,ALL,B,OFF");
monitor_nmea_send("$PASHS,NME,GGA,A,ON");
monitor_nmea_send("$PASHS,NME,GSA,A,ON");
@@ -395,17 +401,17 @@ static int ashtech_command(char line[])
monitor_nmea_send("$PASHS,NME,ZDA,A,ON");
monitor_nmea_send("$PASHS,INI,%d,%d,,,0,",
- ASHTECH_SPEED_57600, ASHTECH_SPEED_9600);
- (void)sleep(6); /* it takes 4-6 sec for the receiver to reboot */
- monitor_nmea_send("$PASHS,WAS,ON"); /* enable WAAS */
+ ASHTECH_SPEED_57600, ASHTECH_SPEED_9600);
+ (void)sleep(6); /* it takes 4-6 sec for the receiver to reboot */
+ monitor_nmea_send("$PASHS,WAS,ON"); /* enable WAAS */
- monitor_nmea_send("$PASHS,NME,POS,A,ON"); /* Ashtech PVT solution */
- monitor_nmea_send("$PASHS,NME,SAT,A,ON"); /* Ashtech Satellite status */
- monitor_nmea_send("$PASHS,NME,MCA,A,ON"); /* MCA measurements */
- monitor_nmea_send("$PASHS,NME,PBN,A,ON"); /* ECEF PVT solution */
- monitor_nmea_send("$PASHS,NME,SNV,A,ON,10"); /* Almanac data */
+ monitor_nmea_send("$PASHS,NME,POS,A,ON"); /* Ashtech PVT solution */
+ monitor_nmea_send("$PASHS,NME,SAT,A,ON"); /* Ashtech Satellite status */
+ monitor_nmea_send("$PASHS,NME,MCA,A,ON"); /* MCA measurements */
+ monitor_nmea_send("$PASHS,NME,PBN,A,ON"); /* ECEF PVT solution */
+ monitor_nmea_send("$PASHS,NME,SNV,A,ON,10"); /* Almanac data */
- monitor_nmea_send("$PASHS,NME,XMG,A,ON"); /* exception messages */
+ monitor_nmea_send("$PASHS,NME,XMG,A,ON"); /* exception messages */
break;
default:
@@ -425,7 +431,7 @@ const struct monitor_object_t ashtech_mmt = {
.command = NULL,
#endif /* ALLOW_CONTROLSEND */
.wrap = nmea_wrap,
- .min_y = 21, .min_x = 80,
+ .min_y = 21,.min_x = 80,
.driver = &ashtech,
};
#endif /* ASHTECH_ENABLE */
@@ -438,7 +444,7 @@ const struct monitor_object_t fv18_mmt = {
.update = nmea_update,
.command = NULL,
.wrap = nmea_wrap,
- .min_y = 21, .min_x = 80,
+ .min_y = 21,.min_x = 80,
.driver = &fv18,
};
#endif /* FV18_ENABLE */
@@ -451,7 +457,7 @@ const struct monitor_object_t gpsclock_mmt = {
.update = nmea_update,
.command = NULL,
.wrap = nmea_wrap,
- .min_y = 21, .min_x = 80,
+ .min_y = 21,.min_x = 80,
.driver = &gpsclock,
};
#endif /* GPSCLOCK_ENABLE */
@@ -464,7 +470,7 @@ const struct monitor_object_t mtk3301_mmt = {
.update = nmea_update,
.command = NULL,
.wrap = nmea_wrap,
- .min_y = 21, .min_x = 80,
+ .min_y = 21,.min_x = 80,
.driver = &mtk3301,
};
#endif /* MTK3301_ENABLE */
diff --git a/monitor_oncore.c b/monitor_oncore.c
index 6cb81527..719773a5 100644
--- a/monitor_oncore.c
+++ b/monitor_oncore.c
@@ -34,16 +34,14 @@ extern const struct gps_type_t oncore_binary;
static WINDOW *Ea1win, *Eawin, *Bbwin, *Enwin, *Bowin, *Aywin, *Aswin, *Atwin;
static unsigned char EaSVlines[8];
-static const char *antenna[] =
-{
+static const char *antenna[] = {
"OK (conn)",
"OC (short)",
"UC (open)",
"OU (short)"
};
-static const char *sv_mode[] =
-{
+static const char *sv_mode[] = {
"srch",
"acq",
"AGCs",
@@ -55,36 +53,31 @@ static const char *sv_mode[] =
"avl"
};
-static const char *pps_ctrl[] =
-{
+static const char *pps_ctrl[] = {
"off",
"on",
"on if >= 1 SV",
"on if TRAIM ok"
};
-static const char *pps_sync[] =
-{
+static const char *pps_sync[] = {
"UTC",
"GPS"
};
-static const char *traim_sol[] =
-{
+static const char *traim_sol[] = {
"OK",
"ALARM",
"UNKNOWN"
};
-static const char *traim_status[] =
-{
+static const char *traim_status[] = {
"detect & isolate",
"detect",
"insufficient"
};
-static const char *pos_hold_mode[] =
-{
+static const char *pos_hold_mode[] = {
"off",
"on",
"survey"
@@ -100,21 +93,21 @@ static bool oncore_initialize(void)
unsigned int i;
/*@ -onlytrans @*/
- Ea1win = subwin(devicewin, 5, 80, 1, 0);
- Eawin = subwin(devicewin, MAXTRACKSATS+3, 27, 6, 0);
- Bbwin = subwin(devicewin, MAXVISSATS+3, 22, 6, 28);
- Enwin = subwin(devicewin, 10, 29, 6, 51);
- Bowin = subwin(devicewin, 4, 11, 17, 0);
- Aywin = subwin(devicewin, 4, 15, 17, 12);
- Atwin = subwin(devicewin, 5, 9, 16, 51);
- Aswin = subwin(devicewin, 5, 19, 16, 61);
+ Ea1win = subwin(devicewin, 5, 80, 1, 0);
+ Eawin = subwin(devicewin, MAXTRACKSATS + 3, 27, 6, 0);
+ Bbwin = subwin(devicewin, MAXVISSATS + 3, 22, 6, 28);
+ Enwin = subwin(devicewin, 10, 29, 6, 51);
+ Bowin = subwin(devicewin, 4, 11, 17, 0);
+ Aywin = subwin(devicewin, 4, 15, 17, 12);
+ Atwin = subwin(devicewin, 5, 9, 16, 51);
+ Aswin = subwin(devicewin, 5, 19, 16, 61);
/*@ +onlytrans @*/
- if (Ea1win==NULL || Eawin==NULL || Bbwin==NULL || Enwin==NULL
- || Bowin==NULL ||Aswin==NULL || Atwin==NULL)
+ if (Ea1win == NULL || Eawin == NULL || Bbwin == NULL || Enwin == NULL
+ || Bowin == NULL || Aswin == NULL || Atwin == NULL)
return false;
- (void)syncok(Ea1win,true);
+ (void)syncok(Ea1win, true);
(void)syncok(Eawin, true);
(void)syncok(Bbwin, true);
(void)syncok(Enwin, true);
@@ -124,30 +117,33 @@ static bool oncore_initialize(void)
(void)syncok(Atwin, true);
(void)wborder(Ea1win, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)wattrset(Ea1win, A_BOLD);
- (void)mvwaddstr(Ea1win, 1, 1, "Time: Lat: Lon:");
- (void)mvwaddstr(Ea1win, 2, 1, "Antenna: DOP: Speed: Course:");
- (void)mvwaddstr(Ea1win, 3, 1, "SV/vis: Status: Alt:");
+ (void)wattrset(Ea1win, A_BOLD);
+ (void)mvwaddstr(Ea1win, 1, 1,
+ "Time: Lat: Lon:");
+ (void)mvwaddstr(Ea1win, 2, 1,
+ "Antenna: DOP: Speed: Course:");
+ (void)mvwaddstr(Ea1win, 3, 1,
+ "SV/vis: Status: Alt:");
(void)mvwprintw(Ea1win, 4, 4, " @@Ea (pos) ");
(void)wattrset(Ea1win, A_NORMAL);
(void)wborder(Eawin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)wattrset(Eawin, A_BOLD);
+ (void)wattrset(Eawin, A_BOLD);
(void)mvwprintw(Eawin, 1, 1, "Ch PRN mode S/N ????????");
(void)mvwprintw(Eawin, 10, 4, " @@Ea (sat) ");
for (i = 0; i < 8; i++) {
- (void)mvwprintw(Eawin, (int)(i+2), 1, "%2d",i);
+ (void)mvwprintw(Eawin, (int)(i + 2), 1, "%2d", i);
}
(void)wattrset(Eawin, A_NORMAL);
(void)wborder(Bbwin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)wattrset(Bbwin, A_BOLD);
+ (void)wattrset(Bbwin, A_BOLD);
(void)mvwprintw(Bbwin, 1, 1, "PRN Az El doppl ??");
(void)mvwprintw(Bbwin, 14, 4, " @@Bb ");
(void)wattrset(Bbwin, A_NORMAL);
(void)wborder(Enwin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)wattrset(Enwin, A_BOLD);
+ (void)wattrset(Enwin, A_BOLD);
(void)mvwprintw(Enwin, 1, 1, "Time RAIM: ");
(void)mvwprintw(Enwin, 2, 1, "Alarm limit:");
(void)mvwprintw(Enwin, 3, 1, "PPS ctrl:");
@@ -160,25 +156,25 @@ static bool oncore_initialize(void)
(void)wattrset(Enwin, A_NORMAL);
(void)wborder(Bowin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)wattrset(Bowin, A_BOLD);
+ (void)wattrset(Bowin, A_BOLD);
(void)mvwprintw(Bowin, 1, 1, "UTC:");
(void)mvwprintw(Bowin, 3, 2, " @@Bo ");
(void)wattrset(Bowin, A_NORMAL);
(void)wborder(Aywin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)wattrset(Aywin, A_BOLD);
+ (void)wattrset(Aywin, A_BOLD);
(void)mvwprintw(Aywin, 1, 1, "PPS delay:");
(void)mvwprintw(Aywin, 3, 4, " @@Ay ");
(void)wattrset(Aywin, A_NORMAL);
(void)wborder(Atwin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)wattrset(Atwin, A_BOLD);
+ (void)wattrset(Atwin, A_BOLD);
(void)mvwprintw(Atwin, 1, 1, "PHold:");
(void)mvwprintw(Atwin, 4, 1, " @@At ");
(void)wattrset(Atwin, A_NORMAL);
(void)wborder(Aswin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)wattrset(Aswin, A_BOLD);
+ (void)wattrset(Aswin, A_BOLD);
(void)mvwprintw(Aswin, 1, 1, "Lat:");
(void)mvwprintw(Aswin, 2, 1, "Lon:");
(void)mvwprintw(Aswin, 3, 1, "Alt:");
@@ -198,257 +194,251 @@ static void oncore_update(void)
assert(Eawin != NULL);
buf = session.packet.outbuffer;
- type = ONCTYPE(buf[2],buf[3]);
- switch (type)
+ type = ONCTYPE(buf[2], buf[3]);
+ switch (type) {
+ case ONCTYPE('E', 'a'):
{
- case ONCTYPE('E','a'):
- {
- double lat, lon, alt;
- float speed, track;
- float dop;
- unsigned short year;
- unsigned char mon, day, hour, min, sec;
- unsigned int nsec;
- unsigned char dopt, nvis, nsat, status;
- char statusbuf[64]; /* 6+9+3+3+10+5+7+12+1=56 */
-
- mon = (unsigned char)getub(buf, 4);
- day = (unsigned char)getub(buf, 5);
- year = (unsigned short)getbeuw(buf, 6);
- hour = (unsigned char)getub(buf, 8);
- min = (unsigned char)getub(buf, 9);
- sec = (unsigned char)getub(buf, 10);
- nsec = (unsigned int)getbeul(buf, 11);
-
- lat = getbesl(buf, 15) / 3600000.0;
- lon = getbesl(buf, 19) / 3600000.0;
- alt = getbesl(buf, 23) / 100.0;
- speed = (float)(getbeuw(buf, 31) / 100.0);
- track = (float)(getbeuw(buf, 33) / 10.0);
- dop = (float)(getbeuw(buf, 35) / 10.0);
- dopt = (unsigned char)getub(buf, 37);
- nvis = (unsigned char)getub(buf, 38);
- nsat = (unsigned char)getub(buf, 39);
- status = (unsigned char)getub(buf, 72);
-
- (void)mvwprintw(Ea1win, 1, 7, "%04d-%02d-%02d %02d:%02d:%02d.%09d",
- year,mon,day,hour,min,sec,nsec);
- (void)mvwprintw(Ea1win, 1, 47, "%10.6lf %c",
- fabs(lat),lat < 0 ? 'S' : lat > 0 ? 'N' : ' ');
- (void)mvwprintw(Ea1win, 1, 66, "%10.6lf %c",
- fabs(lon),lat < 0 ? 'W' : lon > 0 ? 'E' : ' ');
-
- (void)mvwprintw(Ea1win, 2, 50, "%6.2f m/s",speed);
- (void)mvwprintw(Ea1win, 2, 70, "%5.1f",track);
- (void)mvwprintw(Ea1win, 3, 68, "%8.2f m",alt);
-
- /*@ -predboolothers @*/
- (void)snprintf (statusbuf, sizeof (statusbuf), "%s%s%s%s%s%s%s%s",
- status & 0x80 ? "PProp " : "",
- status & 0x40 ? "PoorGeom " : "",
- status & 0x20 ? "3D " : "",
- status & 0x10 ? "2D " : "",
- status & 0x08 ? "Acq/PHold " : "",
- status & 0x04 ? "Diff " : "",
- status & 0x02 ? "Ins (<3 SV) " : "",
- status & 0x01 ? "BadAlm " : "");
- /*@ +predboolothers @*/
-
- (void)mvwprintw(Ea1win, 3, 24, "%-37s",statusbuf);
-
- (void)mvwprintw(Ea1win, 2, 10, "%-10s",antenna[dopt >> 6]);
-
- /*@ -predboolothers @*/
- (void)mvwprintw(Ea1win, 2, 27, "%s %4.1f",
- dopt & 1 ? "hdop" : "pdop",
- dop);
- /*@ +predboolothers @*/
-
- (void)mvwprintw(Ea1win, 3, 10, "%d/%d ",nsat,nvis);
- }
+ double lat, lon, alt;
+ float speed, track;
+ float dop;
+ unsigned short year;
+ unsigned char mon, day, hour, min, sec;
+ unsigned int nsec;
+ unsigned char dopt, nvis, nsat, status;
+ char statusbuf[64]; /* 6+9+3+3+10+5+7+12+1=56 */
+
+ mon = (unsigned char)getub(buf, 4);
+ day = (unsigned char)getub(buf, 5);
+ year = (unsigned short)getbeuw(buf, 6);
+ hour = (unsigned char)getub(buf, 8);
+ min = (unsigned char)getub(buf, 9);
+ sec = (unsigned char)getub(buf, 10);
+ nsec = (unsigned int)getbeul(buf, 11);
+
+ lat = getbesl(buf, 15) / 3600000.0;
+ lon = getbesl(buf, 19) / 3600000.0;
+ alt = getbesl(buf, 23) / 100.0;
+ speed = (float)(getbeuw(buf, 31) / 100.0);
+ track = (float)(getbeuw(buf, 33) / 10.0);
+ dop = (float)(getbeuw(buf, 35) / 10.0);
+ dopt = (unsigned char)getub(buf, 37);
+ nvis = (unsigned char)getub(buf, 38);
+ nsat = (unsigned char)getub(buf, 39);
+ status = (unsigned char)getub(buf, 72);
+
+ (void)mvwprintw(Ea1win, 1, 7, "%04d-%02d-%02d %02d:%02d:%02d.%09d",
+ year, mon, day, hour, min, sec, nsec);
+ (void)mvwprintw(Ea1win, 1, 47, "%10.6lf %c",
+ fabs(lat), lat < 0 ? 'S' : lat > 0 ? 'N' : ' ');
+ (void)mvwprintw(Ea1win, 1, 66, "%10.6lf %c",
+ fabs(lon), lat < 0 ? 'W' : lon > 0 ? 'E' : ' ');
+
+ (void)mvwprintw(Ea1win, 2, 50, "%6.2f m/s", speed);
+ (void)mvwprintw(Ea1win, 2, 70, "%5.1f", track);
+ (void)mvwprintw(Ea1win, 3, 68, "%8.2f m", alt);
+
+ /*@ -predboolothers @*/
+ (void)snprintf(statusbuf, sizeof(statusbuf), "%s%s%s%s%s%s%s%s",
+ status & 0x80 ? "PProp " : "",
+ status & 0x40 ? "PoorGeom " : "",
+ status & 0x20 ? "3D " : "",
+ status & 0x10 ? "2D " : "",
+ status & 0x08 ? "Acq/PHold " : "",
+ status & 0x04 ? "Diff " : "",
+ status & 0x02 ? "Ins (<3 SV) " : "",
+ status & 0x01 ? "BadAlm " : "");
+ /*@ +predboolothers @*/
+
+ (void)mvwprintw(Ea1win, 3, 24, "%-37s", statusbuf);
+
+ (void)mvwprintw(Ea1win, 2, 10, "%-10s", antenna[dopt >> 6]);
+
+ /*@ -predboolothers @*/
+ (void)mvwprintw(Ea1win, 2, 27, "%s %4.1f",
+ dopt & 1 ? "hdop" : "pdop", dop);
+ /*@ +predboolothers @*/
+
+ (void)mvwprintw(Ea1win, 3, 10, "%d/%d ", nsat, nvis);
+ }
for (i = 0; i < 8; i++) {
unsigned char sv, mode, sn, status;
off = 40 + 4 * i;
- sv = (unsigned char)getub(buf, off);
- mode = (unsigned char)getub(buf, off+1);
- sn = (unsigned char)getub(buf, off+2);
- status = (unsigned char)getub(buf, off+3);
- (void)wmove(Eawin, (int)(i+2), 3);
- (void)wprintw(Eawin, " %3d",sv);
+ sv = (unsigned char)getub(buf, off);
+ mode = (unsigned char)getub(buf, off + 1);
+ sn = (unsigned char)getub(buf, off + 2);
+ status = (unsigned char)getub(buf, off + 3);
+ (void)wmove(Eawin, (int)(i + 2), 3);
+ (void)wprintw(Eawin, " %3d", sv);
EaSVlines[i] = sv;
- if (mode <= (unsigned char) 8)
- (void)wprintw(Eawin, " %4s",sv_mode[mode]);
+ if (mode <= (unsigned char)8)
+ (void)wprintw(Eawin, " %4s", sv_mode[mode]);
else
- (void)wprintw(Eawin, " -");
- (void)wprintw(Eawin, " %3d",sn);
+ (void)wprintw(Eawin, " -");
+ (void)wprintw(Eawin, " %3d", sn);
/*@ -predboolothers @*/
- (void)wprintw(Eawin, " %c%c%c%c%c%c%c%c",
- (status & 0x80) ? 'p' : ' ', /* used for pos fix */
- (status & 0x40) ? 'M' : ' ', /* momentum alert */
- (status & 0x20) ? 's' : ' ', /* anti-spoof */
- (status & 0x10) ? 'U' : ' ', /* unhealthy */
- (status & 0x08) ? 'I' : ' ', /* inaccurate */
- (status & 0x04) ? 'S' : ' ', /* spare */
- (status & 0x02) ? 't' : ' ', /* used for time sol */
- (status & 0x01) ? 'P' : ' '); /* parity error */
+ (void)wprintw(Eawin, " %c%c%c%c%c%c%c%c", (status & 0x80) ? 'p' : ' ', /* used for pos fix */
+ (status & 0x40) ? 'M' : ' ', /* momentum alert */
+ (status & 0x20) ? 's' : ' ', /* anti-spoof */
+ (status & 0x10) ? 'U' : ' ', /* unhealthy */
+ (status & 0x08) ? 'I' : ' ', /* inaccurate */
+ (status & 0x04) ? 'S' : ' ', /* spare */
+ (status & 0x02) ? 't' : ' ', /* used for time sol */
+ (status & 0x01) ? 'P' : ' '); /* parity error */
/*@ +predboolothers @*/
}
monitor_log("Ea =");
break;
- case ONCTYPE('B','b'):
- {
- unsigned int Bblines[12];
- unsigned int Bblines_mask;
- unsigned int next_line;
- unsigned char sv;
- unsigned int ch;
-
- ch = (unsigned int)getub(buf, 4);
- if (ch > 12)
- ch = 12;
- /* Try to align the entries for each SV of the Bb message at
- * the same lines as in the Ea message.
- */
- memset(Bblines, 0, sizeof(Bblines));
- Bblines_mask = 0;
- for (i = 0; i < ch; i++) {
- off = 5 + 7 * i;
- sv = (unsigned char)getub(buf, off);
- /*@ -boolops @*/
- for (j = 0; j < 8; j++)
- if (EaSVlines[j] == sv &&
- !(Bblines_mask & (1 << (j+2)))) {
- Bblines[i] = j+2;
- Bblines_mask |= 1 << Bblines[i];
- }
- /*@ +boolops @*/
- }
- /* SVs not seen in Ea fill lines left over. */
- next_line = 2;
- for (i = 0; i < ch; i++) {
- if (Bblines[i] == 0) {
- while (Bblines_mask & (1 << next_line))
- next_line++;
- Bblines[i] = next_line++;
+ case ONCTYPE('B', 'b'):
+ {
+ unsigned int Bblines[12];
+ unsigned int Bblines_mask;
+ unsigned int next_line;
+ unsigned char sv;
+ unsigned int ch;
+
+ ch = (unsigned int)getub(buf, 4);
+ if (ch > 12)
+ ch = 12;
+ /* Try to align the entries for each SV of the Bb message at
+ * the same lines as in the Ea message.
+ */
+ memset(Bblines, 0, sizeof(Bblines));
+ Bblines_mask = 0;
+ for (i = 0; i < ch; i++) {
+ off = 5 + 7 * i;
+ sv = (unsigned char)getub(buf, off);
+ /*@ -boolops @*/
+ for (j = 0; j < 8; j++)
+ if (EaSVlines[j] == sv && !(Bblines_mask & (1 << (j + 2)))) {
+ Bblines[i] = j + 2;
Bblines_mask |= 1 << Bblines[i];
}
+ /*@ +boolops @*/
+ }
+ /* SVs not seen in Ea fill lines left over. */
+ next_line = 2;
+ for (i = 0; i < ch; i++) {
+ if (Bblines[i] == 0) {
+ while (Bblines_mask & (1 << next_line))
+ next_line++;
+ Bblines[i] = next_line++;
+ Bblines_mask |= 1 << Bblines[i];
}
- /* Ready to print on precalculated lines. */
- for (i = 0; i < ch; i++) {
- int doppl, el, az, health;
-
- off = 5 + 7 * i;
- sv = (unsigned char)getub(buf, off);
- doppl = (int)getbesw(buf, off+1);
- el = (int)getub(buf, off+3);
- az = (int)getbeuw(buf, off+4);
- health = (int)getub(buf, off+5);
-
- (void)wmove(Bbwin, (int)Bblines[i], 1);
- (void)wprintw(Bbwin, "%3d %3d %2d %5d %c%c",
- sv,az,el,doppl,
- (health & 0x02) ? 'U' : ' ', /* unhealthy */
- (health & 0x01) ? 'R' : ' '); /* removed */
- }
-
- for (i = 2; i < 14; i++)
- /*@ -boolops @*/
- if (!(Bblines_mask & (1 << i))) {
- (void)wmove(Bbwin, (int)i, 1);
- (void)wprintw(Bbwin, " ");
- }
- /*@ +boolops @*/
}
+ /* Ready to print on precalculated lines. */
+ for (i = 0; i < ch; i++) {
+ int doppl, el, az, health;
+
+ off = 5 + 7 * i;
+ sv = (unsigned char)getub(buf, off);
+ doppl = (int)getbesw(buf, off + 1);
+ el = (int)getub(buf, off + 3);
+ az = (int)getbeuw(buf, off + 4);
+ health = (int)getub(buf, off + 5);
+
+ (void)wmove(Bbwin, (int)Bblines[i], 1);
+ (void)wprintw(Bbwin, "%3d %3d %2d %5d %c%c", sv, az, el, doppl, (health & 0x02) ? 'U' : ' ', /* unhealthy */
+ (health & 0x01) ? 'R' : ' '); /* removed */
+ }
+
+ for (i = 2; i < 14; i++)
+ /*@ -boolops @*/
+ if (!(Bblines_mask & (1 << i))) {
+ (void)wmove(Bbwin, (int)i, 1);
+ (void)wprintw(Bbwin, " ");
+ }
+ /*@ +boolops @*/
+ }
monitor_log("Bb =");
break;
- case ONCTYPE('E','n'):
- {
- unsigned char traim, ctrl, pulse, sync, sol_stat, status;
- float alarm, sigma;
-
- traim = (unsigned char)getub(buf, 5);
- alarm = (float)(getbeuw(buf, 6) / 10.);
- ctrl = (unsigned char)getub(buf, 8);
- pulse = (unsigned char)getub(buf, 9);
- sync = (unsigned char)getub(buf, 10);
- sol_stat = (unsigned char)getub(buf, 11);
- status = (unsigned char)getub(buf, 12);
- sigma = (float)(getbeuw(buf, 13));
-
- /*@ -predboolothers @*/
- (void)mvwprintw(Enwin, 1, 24, "%3s",traim ? "on" : "off");
- (void)mvwprintw(Enwin, 2, 18, "%6.1f us",alarm);
- (void)mvwprintw(Enwin, 3, 13, "%14s",pps_ctrl[ctrl]);
- (void)mvwprintw(Enwin, 4, 24, "%3s",pulse ? "on" : "off");
- (void)mvwprintw(Enwin, 5, 24, "%3s",pps_sync[sync]);
- (void)mvwprintw(Enwin, 6, 20, "%7s",traim_sol[sol_stat]);
- (void)mvwprintw(Enwin, 7, 11, "%16s",traim_status[status]);
- (void)mvwprintw(Enwin, 8, 18, "%6.3f us",sigma);
- /*@ +predboolothers @*/
- }
+ case ONCTYPE('E', 'n'):
+ {
+ unsigned char traim, ctrl, pulse, sync, sol_stat, status;
+ float alarm, sigma;
+
+ traim = (unsigned char)getub(buf, 5);
+ alarm = (float)(getbeuw(buf, 6) / 10.);
+ ctrl = (unsigned char)getub(buf, 8);
+ pulse = (unsigned char)getub(buf, 9);
+ sync = (unsigned char)getub(buf, 10);
+ sol_stat = (unsigned char)getub(buf, 11);
+ status = (unsigned char)getub(buf, 12);
+ sigma = (float)(getbeuw(buf, 13));
+
+ /*@ -predboolothers @*/
+ (void)mvwprintw(Enwin, 1, 24, "%3s", traim ? "on" : "off");
+ (void)mvwprintw(Enwin, 2, 18, "%6.1f us", alarm);
+ (void)mvwprintw(Enwin, 3, 13, "%14s", pps_ctrl[ctrl]);
+ (void)mvwprintw(Enwin, 4, 24, "%3s", pulse ? "on" : "off");
+ (void)mvwprintw(Enwin, 5, 24, "%3s", pps_sync[sync]);
+ (void)mvwprintw(Enwin, 6, 20, "%7s", traim_sol[sol_stat]);
+ (void)mvwprintw(Enwin, 7, 11, "%16s", traim_status[status]);
+ (void)mvwprintw(Enwin, 8, 18, "%6.3f us", sigma);
+ /*@ +predboolothers @*/
+ }
monitor_log("En =");
break;
- case ONCTYPE('B','o'):
- {
- unsigned char utc_offset;
+ case ONCTYPE('B', 'o'):
+ {
+ unsigned char utc_offset;
- utc_offset = (unsigned char)getub(buf, 4);
+ utc_offset = (unsigned char)getub(buf, 4);
- if (utc_offset != (unsigned char) 0)
- (void)mvwprintw(Bowin, 2, 2, "GPS%+4d",utc_offset);
- else
- (void)mvwprintw(Bowin, 2, 2, "unknown",utc_offset);
- }
+ if (utc_offset != (unsigned char)0)
+ (void)mvwprintw(Bowin, 2, 2, "GPS%+4d", utc_offset);
+ else
+ (void)mvwprintw(Bowin, 2, 2, "unknown", utc_offset);
+ }
monitor_log("Bo =");
break;
- case ONCTYPE('A','y'):
- {
- double pps_delay;
+ case ONCTYPE('A', 'y'):
+ {
+ double pps_delay;
- pps_delay = getbesl(buf, 4) / 1000000.0;
+ pps_delay = getbesl(buf, 4) / 1000000.0;
- (void)mvwprintw(Aywin, 2, 2, " %7.3f ms",pps_delay);
- }
+ (void)mvwprintw(Aywin, 2, 2, " %7.3f ms", pps_delay);
+ }
monitor_log("Ay =");
break;
- case ONCTYPE('A','t'):
- {
- unsigned char mode;
+ case ONCTYPE('A', 't'):
+ {
+ unsigned char mode;
- mode = (unsigned char)getub(buf, 4);
+ mode = (unsigned char)getub(buf, 4);
- (void)mvwprintw(Atwin, 2, 1, "%6s",pos_hold_mode[mode]);
- }
+ (void)mvwprintw(Atwin, 2, 1, "%6s", pos_hold_mode[mode]);
+ }
monitor_log("At =");
break;
- case ONCTYPE('A','s'):
- {
- double lat, lon, alt;
+ case ONCTYPE('A', 's'):
+ {
+ double lat, lon, alt;
- lat = getbesl(buf, 4) / 3600000.0;
- lon = getbesl(buf, 8) / 3600000.0;
- alt = getbesl(buf, 12) / 100.0;
+ lat = getbesl(buf, 4) / 3600000.0;
+ lon = getbesl(buf, 8) / 3600000.0;
+ alt = getbesl(buf, 12) / 100.0;
- (void)mvwprintw(Aswin, 1, 5, "%10.6lf %c",
- fabs(lat),lat < 0 ? 'S' : lat > 0 ? 'N' : ' ');
- (void)mvwprintw(Aswin, 2, 5, "%10.6lf %c",
- fabs(lon),lat < 0 ? 'W' : lon > 0 ? 'E' : ' ');
- (void)mvwprintw(Aswin, 3, 7, "%8.2f m",alt);
- }
+ (void)mvwprintw(Aswin, 1, 5, "%10.6lf %c",
+ fabs(lat), lat < 0 ? 'S' : lat > 0 ? 'N' : ' ');
+ (void)mvwprintw(Aswin, 2, 5, "%10.6lf %c",
+ fabs(lon), lat < 0 ? 'W' : lon > 0 ? 'E' : ' ');
+ (void)mvwprintw(Aswin, 3, 7, "%8.2f m", alt);
+ }
monitor_log("As =");
break;
@@ -459,7 +449,7 @@ static void oncore_update(void)
}
}
-static int oncore_command(char line[] UNUSED)
+static int oncore_command(char line[]UNUSED)
{
return COMMAND_UNKNOWN;
}
@@ -481,7 +471,7 @@ const struct monitor_object_t oncore_mmt = {
.update = oncore_update,
.command = oncore_command,
.wrap = oncore_wrap,
- .min_y = 20, .min_x = 80, /* size of the device window */
+ .min_y = 20,.min_x = 80, /* size of the device window */
.driver = &oncore_binary,
};
diff --git a/monitor_proto.c b/monitor_proto.c
index 55f4e916..6afb2021 100644
--- a/monitor_proto.c
+++ b/monitor_proto.c
@@ -52,8 +52,9 @@ static bool PROTO_initialize(void)
* devicewin, just below the status and command line at top of
* screen, and (2) packetwin, taking up the rest of the screen below
* it; packetwin will be enabled for scrolling. Note, however,
- * that you cannot update packetwin safely, as it may be NULL
- * if the screen has no lines left over after allocating devicewin.
+ * that you cannot necessarily update packetwin safely, as it may be NULL
+ * if the screen has no lines left over after allocating devicewin;
+ * you'll need to check this in your code.
*
* Use this method to paint windowframes and legends on the
* freshly initialized device window. You can also use this
@@ -93,7 +94,7 @@ static int PROTO_command(char line[])
* NULL, gpsmon will behave sanely, accepting no device-specific commands.
*
* It is a useful convention to use uppercase letters for
- * driver-specfic commands and leave lowercase ones for the
+ * driver-specific commands and leave lowercase ones for the
* generic gpsmon ones.
*/
diff --git a/monitor_sirf.c b/monitor_sirf.c
index d342a95e..7a0430fc 100644
--- a/monitor_sirf.c
+++ b/monitor_sirf.c
@@ -35,11 +35,10 @@ extern const struct gps_type_t sirf_binary;
static WINDOW *mid2win, *mid4win, *mid6win, *mid7win, *mid9win, *mid13win;
static WINDOW *mid19win, *mid27win;
static bool dispmode = false, subframe_enabled = false;
-static int nfix,fix[20];
+static int nfix, fix[20];
/*@ -nullassign @*/
-static char *verbpat[] =
-{
+static char *verbpat[] = {
"#Time:",
"@R Time:",
"CSTD: New almanac for",
@@ -49,10 +48,10 @@ static char *verbpat[] =
"rtcaj tow ",
NULL
};
+
/*@ +nullassign @*/
-static char *dgpsvec[] =
-{
+static char *dgpsvec[] = {
"None",
"SBAS",
"Serial",
@@ -75,16 +74,17 @@ static bool sirf_initialize(void)
unsigned int i;
/*@ -onlytrans @*/
- mid2win = subwin(devicewin, 7, 80, 1, 0);
- mid4win = subwin(devicewin, MAXSATS+3, 30, 8, 0);
- mid6win = subwin(devicewin, 3, 50, 8, 30);
- mid7win = subwin(devicewin, 4, 50, 11, 30);
- mid9win = subwin(devicewin, 3, 50, 15, 30);
- mid13win = subwin(devicewin, 3, 50, 18, 30);
- mid19win = newwin(16, 50, 8, 30);
- mid27win = subwin(devicewin, 3, 50, 21, 30);
- if (mid2win==NULL || mid4win==NULL || mid6win==NULL || mid9win==NULL
- || mid13win==NULL || mid19win==NULL || mid27win==NULL)
+ mid2win = subwin(devicewin, 7, 80, 1, 0);
+ mid4win = subwin(devicewin, MAXSATS + 3, 30, 8, 0);
+ mid6win = subwin(devicewin, 3, 50, 8, 30);
+ mid7win = subwin(devicewin, 4, 50, 11, 30);
+ mid9win = subwin(devicewin, 3, 50, 15, 30);
+ mid13win = subwin(devicewin, 3, 50, 18, 30);
+ mid19win = newwin(16, 50, 8, 30);
+ mid27win = subwin(devicewin, 3, 50, 21, 30);
+ if (mid2win == NULL || mid4win == NULL || mid6win == NULL
+ || mid9win == NULL || mid13win == NULL || mid19win == NULL
+ || mid27win == NULL)
return false;
(void)syncok(mid2win, true);
@@ -97,39 +97,43 @@ static bool sirf_initialize(void)
/*@ -nullpass @*/
(void)wborder(mid2win, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)wattrset(mid2win, A_BOLD);
- (void)wmove(mid2win, 0,1);
- display(mid2win, 0, 12, " X ");
- display(mid2win, 0, 21, " Y ");
- display(mid2win, 0, 30, " Z ");
- display(mid2win, 0, 43, " North ");
- display(mid2win, 0, 54, " East ");
- display(mid2win, 0, 65, " Alt ");
-
- (void)wmove(mid2win, 1,1);
- (void)wprintw(mid2win, "Pos: m m");
- (void)wmove(mid2win, 2,1);
- (void)wprintw(mid2win, "Vel: m/s climb m/s");
- (void)wmove(mid2win, 3,1);
- (void)wprintw(mid2win, "Week+TOW: Day: Heading: speed m/s");
- (void)wmove(mid2win, 4,1);
- (void)wprintw(mid2win, "Skew: TZ: HDOP: M1: M2: ");
- (void)wmove(mid2win, 5,1);
+ (void)wattrset(mid2win, A_BOLD);
+ (void)wmove(mid2win, 0, 1);
+ display(mid2win, 0, 12, " X ");
+ display(mid2win, 0, 21, " Y ");
+ display(mid2win, 0, 30, " Z ");
+ display(mid2win, 0, 43, " North ");
+ display(mid2win, 0, 54, " East ");
+ display(mid2win, 0, 65, " Alt ");
+
+ (void)wmove(mid2win, 1, 1);
+ (void)wprintw(mid2win,
+ "Pos: m m");
+ (void)wmove(mid2win, 2, 1);
+ (void)wprintw(mid2win,
+ "Vel: m/s climb m/s");
+ (void)wmove(mid2win, 3, 1);
+ (void)wprintw(mid2win,
+ "Week+TOW: Day: Heading: speed m/s");
+ (void)wmove(mid2win, 4, 1);
+ (void)wprintw(mid2win,
+ "Skew: TZ: HDOP: M1: M2: ");
+ (void)wmove(mid2win, 5, 1);
(void)wprintw(mid2win, "Fix:");
display(mid2win, 6, 24, " Packet type 2 (0x02) ");
(void)wattrset(mid2win, A_NORMAL);
(void)wborder(mid4win, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)wattrset(mid4win, A_BOLD);
+ (void)wattrset(mid4win, A_BOLD);
display(mid4win, 1, 1, "Ch PRN Az El Stat C/N ? A");
for (i = 0; i < MAXSATS; i++) {
- display(mid4win, (int)(i+2), 1, "%2d",i);
+ display(mid4win, (int)(i + 2), 1, "%2d", i);
}
display(mid4win, 14, 4, " Packet Type 4 (0x04) ");
(void)wattrset(mid4win, A_NORMAL);
(void)wborder(mid19win, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)wattrset(mid19win, A_BOLD);
+ (void)wattrset(mid19win, A_BOLD);
display(mid19win, 1, 1, "Alt. hold mode:");
display(mid19win, 2, 1, "Alt. hold source:");
display(mid19win, 3, 1, "Alt. source input:");
@@ -138,48 +142,48 @@ static bool sirf_initialize(void)
display(mid19win, 6, 1, "Track smooth mode:");
display(mid19win, 7, 1, "Static Navigation:");
display(mid19win, 8, 1, "3SV Least Squares:");
- display(mid19win, 9 ,1, "DOP Mask mode:");
- display(mid19win, 10,1, "Nav. Elev. mask:");
- display(mid19win, 11,1, "Nav. Power mask:");
- display(mid19win, 12,1, "DGPS Source:");
- display(mid19win, 13,1, "DGPS Mode:");
- display(mid19win, 14,1, "DGPS Timeout:");
- display(mid19win, 1, 26,"LP Push-to-Fix:");
- display(mid19win, 2, 26,"LP On Time:");
- display(mid19win, 3, 26,"LP Interval:");
- display(mid19win, 4, 26,"U. Tasks Enab.:");
- display(mid19win, 5, 26,"U. Task Inter.:");
- display(mid19win, 6, 26,"LP Pwr Cyc En:");
- display(mid19win, 7, 26,"LP Max Acq Srch:");
- display(mid19win, 8, 26,"LP Max Off Time:");
- display(mid19win, 9, 26,"APM enabled:");
- display(mid19win,10, 26,"# of Fixes:");
- display(mid19win,11, 26,"Time btw Fixes:");
- display(mid19win,12, 26,"H/V Error Max:");
- display(mid19win,13, 26,"Rsp Time Max:");
- display(mid19win,14, 26,"Time/Accu:");
+ display(mid19win, 9, 1, "DOP Mask mode:");
+ display(mid19win, 10, 1, "Nav. Elev. mask:");
+ display(mid19win, 11, 1, "Nav. Power mask:");
+ display(mid19win, 12, 1, "DGPS Source:");
+ display(mid19win, 13, 1, "DGPS Mode:");
+ display(mid19win, 14, 1, "DGPS Timeout:");
+ display(mid19win, 1, 26, "LP Push-to-Fix:");
+ display(mid19win, 2, 26, "LP On Time:");
+ display(mid19win, 3, 26, "LP Interval:");
+ display(mid19win, 4, 26, "U. Tasks Enab.:");
+ display(mid19win, 5, 26, "U. Task Inter.:");
+ display(mid19win, 6, 26, "LP Pwr Cyc En:");
+ display(mid19win, 7, 26, "LP Max Acq Srch:");
+ display(mid19win, 8, 26, "LP Max Off Time:");
+ display(mid19win, 9, 26, "APM enabled:");
+ display(mid19win, 10, 26, "# of Fixes:");
+ display(mid19win, 11, 26, "Time btw Fixes:");
+ display(mid19win, 12, 26, "H/V Error Max:");
+ display(mid19win, 13, 26, "Rsp Time Max:");
+ display(mid19win, 14, 26, "Time/Accu:");
display(mid19win, 15, 8, " Packet type 19 (0x13) ");
(void)wattrset(mid19win, A_NORMAL);
(void)wborder(mid6win, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)wattrset(mid6win, A_BOLD);
+ (void)wattrset(mid6win, A_BOLD);
display(mid6win, 1, 1, "Version:");
display(mid6win, 2, 8, " Packet Type 6 (0x06) ");
(void)wattrset(mid6win, A_NORMAL);
(void)wborder(mid7win, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)wattrset(mid7win, A_BOLD);
- display(mid7win, 1, 1, "SVs: ");
- display(mid7win, 1, 9, "Drift: ");
+ (void)wattrset(mid7win, A_BOLD);
+ display(mid7win, 1, 1, "SVs: ");
+ display(mid7win, 1, 9, "Drift: ");
display(mid7win, 1, 23, "Bias: ");
- display(mid7win, 2, 1, "Estimated GPS Time: ");
+ display(mid7win, 2, 1, "Estimated GPS Time: ");
display(mid7win, 3, 8, " Packet type 7 (0x07) ");
(void)wattrset(mid7win, A_NORMAL);
(void)wborder(mid9win, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)wattrset(mid9win, A_BOLD);
- display(mid9win, 1, 1, "Max: ");
+ (void)wattrset(mid9win, A_BOLD);
+ display(mid9win, 1, 1, "Max: ");
display(mid9win, 1, 13, "Lat: ");
display(mid9win, 1, 25, "Time: ");
display(mid9win, 1, 39, "MS: ");
@@ -187,14 +191,14 @@ static bool sirf_initialize(void)
(void)wattrset(mid9win, A_NORMAL);
(void)wborder(mid13win, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)wattrset(mid13win, A_BOLD);
+ (void)wattrset(mid13win, A_BOLD);
display(mid13win, 1, 1, "SVs: ");
display(mid13win, 1, 9, "=");
display(mid13win, 2, 8, " Packet type 13 (0x0D) ");
(void)wattrset(mid13win, A_NORMAL);
(void)wborder(mid27win, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)wattrset(mid27win, A_BOLD);
+ (void)wattrset(mid27win, A_BOLD);
display(mid27win, 1, 1, "DGPS source: ");
display(mid27win, 1, 31, "Corrections: ");
display(mid27win, 2, 8, " Packet type 27 (0x1B) ");
@@ -222,13 +226,14 @@ static void decode_time(int week, int tow)
m = (m - s) / 6000;
- (void)wmove(mid2win, 3,10);
- (void)wprintw(mid2win, "%4d+%9.2f", week, (double)tow/100);
+ (void)wmove(mid2win, 3, 10);
+ (void)wprintw(mid2win, "%4d+%9.2f", week, (double)tow / 100);
(void)wmove(mid2win, 3, 30);
- (void)wprintw(mid2win, "%d %02d:%02d:%05.2f", day, h,m,(double)s/100);
+ (void)wprintw(mid2win, "%d %02d:%02d:%05.2f", day, h, m, (double)s / 100);
(void)wmove(mid2win, 4, 8);
(void)wattrset(mid2win, A_UNDERLINE);
- (void)wprintw(mid2win, "%f", timestamp()-gpstime_to_unix(week,tow/100.0));
+ (void)wprintw(mid2win, "%f",
+ timestamp() - gpstime_to_unix(week, tow / 100.0));
(void)wmove(mid2win, 4, 29);
(void)wprintw(mid2win, "%d", gmt_offset);
(void)wattrset(mid2win, A_NORMAL);
@@ -239,104 +244,120 @@ static void decode_ecef(double x, double y, double z,
{
const double a = WGS84A;
const double b = WGS84B;
- const double e2 = (a*a - b*b) / (a*a);
- const double e_2 = (a*a - b*b) / (b*b);
- double lambda,p,theta,phi,n,h,vnorth,veast,vup,speed,heading;
+ const double e2 = (a * a - b * b) / (a * a);
+ const double e_2 = (a * a - b * b) / (b * b);
+ double lambda, p, theta, phi, n, h, vnorth, veast, vup, speed, heading;
- lambda = atan2(y,x);
+ lambda = atan2(y, x);
/*@ -evalorder @*/
- p = sqrt(pow(x,2) + pow(y,2));
- theta = atan2(z*a,p*b);
- phi = atan2(z + e_2*b*pow(sin(theta),3),p - e2*a*pow(cos(theta),3));
- n = a / sqrt(1.0 - e2*pow(sin(phi),2));
+ p = sqrt(pow(x, 2) + pow(y, 2));
+ theta = atan2(z * a, p * b);
+ phi =
+ atan2(z + e_2 * b * pow(sin(theta), 3),
+ p - e2 * a * pow(cos(theta), 3));
+ n = a / sqrt(1.0 - e2 * pow(sin(phi), 2));
h = p / cos(phi) - n;
- h -= wgs84_separation((double)(RAD_2_DEG*phi),(double)(RAD_2_DEG*lambda));
- vnorth = -vx*sin(phi)*cos(lambda)-vy*sin(phi)*sin(lambda)+vz*cos(phi);
- veast = -vx*sin(lambda)+vy*cos(lambda);
- vup = vx*cos(phi)*cos(lambda)+vy*cos(phi)*sin(lambda)+vz*sin(phi);
- speed = sqrt(pow(vnorth,2) + pow(veast,2));
- heading = atan2(veast,vnorth);
+ h -= wgs84_separation((double)(RAD_2_DEG * phi),
+ (double)(RAD_2_DEG * lambda));
+ vnorth =
+ -vx * sin(phi) * cos(lambda) - vy * sin(phi) * sin(lambda) +
+ vz * cos(phi);
+ veast = -vx * sin(lambda) + vy * cos(lambda);
+ vup =
+ vx * cos(phi) * cos(lambda) + vy * cos(phi) * sin(lambda) +
+ vz * sin(phi);
+ speed = sqrt(pow(vnorth, 2) + pow(veast, 2));
+ heading = atan2(veast, vnorth);
/*@ +evalorder @*/
if (heading < 0)
heading += 2 * GPS_PI;
(void)wattrset(mid2win, A_UNDERLINE);
- (void)wmove(mid2win, 1,40);
- (void)wprintw(mid2win, "%9.5f %9.5f",(double)(RAD_2_DEG*phi),
- (double)(RAD_2_DEG*lambda));
+ (void)wmove(mid2win, 1, 40);
+ (void)wprintw(mid2win, "%9.5f %9.5f", (double)(RAD_2_DEG * phi),
+ (double)(RAD_2_DEG * lambda));
(void)mvwaddch(mid2win, 1, 49, ACS_DEGREE);
(void)mvwaddch(mid2win, 1, 59, ACS_DEGREE);
- (void)wmove(mid2win, 1,61);
- (void)wprintw(mid2win, "%8d",(int)h);
+ (void)wmove(mid2win, 1, 61);
+ (void)wprintw(mid2win, "%8d", (int)h);
- (void)wmove(mid2win, 2,40);
- (void)wprintw(mid2win, "%9.1f %9.1f",vnorth,veast);
- (void)wmove(mid2win, 2,61);
- (void)wprintw(mid2win, "%8.1f",vup);
+ (void)wmove(mid2win, 2, 40);
+ (void)wprintw(mid2win, "%9.1f %9.1f", vnorth, veast);
+ (void)wmove(mid2win, 2, 61);
+ (void)wprintw(mid2win, "%8.1f", vup);
- (void)wmove(mid2win, 3,54);
- (void)wprintw(mid2win, "%5.1f",(double)(RAD_2_DEG*heading));
+ (void)wmove(mid2win, 3, 54);
+ (void)wprintw(mid2win, "%5.1f", (double)(RAD_2_DEG * heading));
(void)mvwaddch(mid2win, 3, 59, ACS_DEGREE);
- (void)wmove(mid2win, 3,61);
- (void)wprintw(mid2win, "%8.1f",speed);
+ (void)wmove(mid2win, 3, 61);
+ (void)wprintw(mid2win, "%8.1f", speed);
(void)wattrset(mid2win, A_NORMAL);
}
/*@ -globstate */
static void sirf_update(void)
{
- int i,j,ch,off,cn;
+ int i, j, ch, off, cn;
unsigned char *buf;
size_t len;
assert(mid27win != NULL);
buf = session.packet.outbuffer + 4;
len = session.packet.outbuflen - 8;
- switch (buf[0])
- {
- case 0x02: /* Measured Navigation Data */
- (void)wmove(mid2win, 1,6); /* ECEF position */
- (void)wprintw(mid2win, "%8d %8d %8d",getbesl(buf, 1),getbesl(buf, 5),getbesl(buf, 9));
- (void)wmove(mid2win, 2,6); /* ECEF velocity */
+ switch (buf[0]) {
+ case 0x02: /* Measured Navigation Data */
+ (void)wmove(mid2win, 1, 6); /* ECEF position */
+ (void)wprintw(mid2win, "%8d %8d %8d", getbesl(buf, 1),
+ getbesl(buf, 5), getbesl(buf, 9));
+ (void)wmove(mid2win, 2, 6); /* ECEF velocity */
(void)wprintw(mid2win, "%8.1f %8.1f %8.1f",
- (double)getbesw(buf, 13)/8,(double)getbesw(buf, 15)/8,(double)getbesw(buf, 17)/8);
- decode_ecef((double)getbesl(buf, 1),(double)getbesl(buf, 5),(double)getbesl(buf, 9),
- (double)getbesw(buf, 13)/8,(double)getbesw(buf, 15)/8,(double)getbesw(buf, 17)/8);
- decode_time((int)getbeuw(buf, 22),getbesl(buf, 24));
+ (double)getbesw(buf, 13) / 8, (double)getbesw(buf,
+ 15) / 8,
+ (double)getbesw(buf, 17) / 8);
+ decode_ecef((double)getbesl(buf, 1), (double)getbesl(buf, 5),
+ (double)getbesl(buf, 9), (double)getbesw(buf, 13) / 8,
+ (double)getbesw(buf, 15) / 8, (double)getbesw(buf,
+ 17) / 8);
+ decode_time((int)getbeuw(buf, 22), getbesl(buf, 24));
/* line 4 */
- (void)wmove(mid2win, 4,49);
- (void)wprintw(mid2win, "%4.1f",(double)getub(buf, 20)/5); /* HDOP */
- (void)wmove(mid2win, 4,58);
- (void)wprintw(mid2win, "%02x",getub(buf, 19)); /* Mode 1 */
- (void)wmove(mid2win, 4,70);
- (void)wprintw(mid2win, "%02x",getub(buf, 21)); /* Mode 2 */
- (void)wmove(mid2win, 5,7);
+ (void)wmove(mid2win, 4, 49);
+ (void)wprintw(mid2win, "%4.1f", (double)getub(buf, 20) / 5); /* HDOP */
+ (void)wmove(mid2win, 4, 58);
+ (void)wprintw(mid2win, "%02x", getub(buf, 19)); /* Mode 1 */
+ (void)wmove(mid2win, 4, 70);
+ (void)wprintw(mid2win, "%02x", getub(buf, 21)); /* Mode 2 */
+ (void)wmove(mid2win, 5, 7);
nfix = (int)getub(buf, 28);
- (void)wprintw(mid2win, "%d = ",nfix); /* SVs in fix */
+ (void)wprintw(mid2win, "%d = ", nfix); /* SVs in fix */
for (i = 0; i < MAXSATS; i++) { /* SV list */
if (i < nfix)
- (void)wprintw(mid2win, "%3d",fix[i] = (int)getub(buf, 29+i));
+ (void)wprintw(mid2win, "%3d", fix[i] =
+ (int)getub(buf, 29 + i));
else
(void)wprintw(mid2win, " ");
}
monitor_log("MND 0x02=");
break;
- case 0x04: /* Measured Tracking Data */
- decode_time((int)getbeuw(buf, 1),getbesl(buf, 3));
+ case 0x04: /* Measured Tracking Data */
+ decode_time((int)getbeuw(buf, 1), getbesl(buf, 3));
ch = (int)getub(buf, 7);
for (i = 0; i < ch; i++) {
- int sv,st;
-
+ int sv, st;
+
off = 8 + 15 * i;
- (void)wmove(mid4win, i+2, 3);
+ (void)wmove(mid4win, i + 2, 3);
sv = (int)getub(buf, off);
- (void)wprintw(mid4win, " %3d",sv);
+ (void)wprintw(mid4win, " %3d", sv);
- (void)wprintw(mid4win, " %3d%3d %04x",((int)getub(buf, off+1)*3)/2,(int)getub(buf, off+2)/2,(int)getbesw(buf, off+3));
+ (void)wprintw(mid4win, " %3d%3d %04x",
+ ((int)getub(buf, off + 1) * 3) / 2, (int)getub(buf,
+ off +
+ 2) /
+ 2, (int)getbesw(buf, off + 3));
st = ' ';
- if ((int)getbeuw(buf, off+3) == 0xbf)
+ if ((int)getbeuw(buf, off + 3) == 0xbf)
st = 'T';
for (j = 0; j < nfix; j++)
if (sv == fix[j]) {
@@ -347,79 +368,80 @@ static void sirf_update(void)
cn = 0;
for (j = 0; j < 10; j++)
- cn += (int)getub(buf, off+5+j);
+ cn += (int)getub(buf, off + 5 + j);
- (void)wprintw(mid4win, "%5.1f %c",(double)cn/10,st);
+ (void)wprintw(mid4win, "%5.1f %c", (double)cn / 10, st);
- if (sv == 0) /* not tracking? */
+ if (sv == 0) /* not tracking? */
(void)wprintw(mid4win, " "); /* clear other info */
}
monitor_log("MTD 0x04=");
break;
#ifdef __UNUSED__
- case 0x05: /* raw track data */
+ case 0x05: /* raw track data */
for (off = 1; off < len; off += 51) {
ch = getbeul(buf, off);
- (void)wmove(mid4win, ch+2, 19);
+ (void)wmove(mid4win, ch + 2, 19);
cn = 0;
for (j = 0; j < 10; j++)
- cn += getub(buf, off+34+j);
+ cn += getub(buf, off + 34 + j);
- printw("%5.1f",(double)cn/10);
+ printw("%5.1f", (double)cn / 10);
- printw("%9d%3d%5d",getbeul(buf, off+8),(int)getbeuw(buf, off+12),(int)getbeuw(buf, off+14));
- printw("%8.5f %10.5f",
- (double)getbeul(buf, off+16)/65536,(double)getbeul(buf, off+20)/1024);
+ printw("%9d%3d%5d", getbeul(buf, off + 8),
+ (int)getbeuw(buf, off + 12), (int)getbeuw(buf, off + 14));
+ printw("%8.5f %10.5f", (double)getbeul(buf, off + 16) / 65536,
+ (double)getbeul(buf, off + 20) / 1024);
}
monitor_log("RTD 0x05=");
break;
#endif /* __UNUSED */
- case 0x06: /* firmware version */
- display(mid6win, 1, 10, "%s",buf + 1);
+ case 0x06: /* firmware version */
+ display(mid6win, 1, 10, "%s", buf + 1);
monitor_log("FV 0x06=");
break;
- case 0x07: /* Response - Clock Status Data */
- decode_time((int)getbeuw(buf, 1),getbesl(buf, 3));
- display(mid7win, 1, 5, "%2d", getub(buf, 7)); /* SVs */
+ case 0x07: /* Response - Clock Status Data */
+ decode_time((int)getbeuw(buf, 1), getbesl(buf, 3));
+ display(mid7win, 1, 5, "%2d", getub(buf, 7)); /* SVs */
display(mid7win, 1, 16, "%lu", getbeul(buf, 8)); /* Clock drift */
display(mid7win, 1, 29, "%lu", getbeul(buf, 12)); /* Clock Bias */
display(mid7win, 2, 21, "%lu", getbeul(buf, 16)); /* Estimated Time */
monitor_log("CSD 0x07=");
break;
- case 0x08: /* 50 BPS data */
+ case 0x08: /* 50 BPS data */
ch = (int)getub(buf, 1);
- display(mid4win, ch+2, 27, "Y");
+ display(mid4win, ch + 2, 27, "Y");
monitor_log("50B 0x08=");
subframe_enabled = true;
break;
- case 0x09: /* Throughput */
- display(mid9win, 1, 6, "%.3f",(double)getbeuw(buf, 1)/186); /*SegStatMax*/
- display(mid9win, 1, 18, "%.3f",(double)getbeuw(buf, 3)/186); /*SegStatLat*/
- display(mid9win, 1, 31, "%.3f",(double)getbeuw(buf, 5)/186); /*SegStatTime*/
- display(mid9win, 1, 42, "%3d",(int)getbeuw(buf, 7)); /* Last Millisecond */
+ case 0x09: /* Throughput */
+ display(mid9win, 1, 6, "%.3f", (double)getbeuw(buf, 1) / 186); /*SegStatMax */
+ display(mid9win, 1, 18, "%.3f", (double)getbeuw(buf, 3) / 186); /*SegStatLat */
+ display(mid9win, 1, 31, "%.3f", (double)getbeuw(buf, 5) / 186); /*SegStatTime */
+ display(mid9win, 1, 42, "%3d", (int)getbeuw(buf, 7)); /* Last Millisecond */
monitor_log("THR 0x09=");
break;
- case 0x0b: /* Command Acknowledgement */
+ case 0x0b: /* Command Acknowledgement */
monitor_log("ACK 0x0b=");
break;
- case 0x0c: /* Command NAcknowledgement */
+ case 0x0c: /* Command NAcknowledgement */
monitor_log("NAK 0x0c=");
break;
- case 0x0d: /* Visible List */
- display(mid13win, 1, 6, "%02d",getub(buf, 1));
+ case 0x0d: /* Visible List */
+ display(mid13win, 1, 6, "%02d", getub(buf, 1));
(void)wmove(mid13win, 1, 10);
for (i = 0; i < MAXSATS; i++) {
if (i < (int)getub(buf, 1))
- (void)wprintw(mid13win, " %2d",getub(buf, 2 + 5 * i));
+ (void)wprintw(mid13win, " %2d", getub(buf, 2 + 5 * i));
else
(void)wprintw(mid13win, " ");
}
@@ -429,38 +451,38 @@ static void sirf_update(void)
case 0x13:
#define YESNO(n) (((int)getub(buf, n) != 0)?'Y':'N')
display(mid19win, 1, 20, "%d", getub(buf, 5)); /* Alt. hold mode */
- display(mid19win, 2, 20, "%d", getub(buf, 6)); /* Alt. hold source*/
- display(mid19win, 3, 20, "%dm", (int)getbeuw(buf, 7)); /* Alt. source input */
- if (getub(buf, 9) != (uint8_t)'\0')
- display(mid19win, 4, 20, "%dsec", getub(buf, 10)); /* Degraded timeout*/
- else
- display(mid19win, 4, 20, "N/A ");
- display(mid19win, 5, 20, "%dsec",getub(buf, 11)); /* DR timeout*/
- display(mid19win, 6, 20, "%c", YESNO(12));/* Track smooth mode*/
- display(mid19win, 7, 20, "%c", YESNO(13)); /* Static Nav.*/
- display(mid19win, 8, 20, "0x%x", getub(buf, 14)); /* 3SV Least Squares*/
- display(mid19win, 9 ,20, "0x%x", getub(buf, 19)); /* DOP Mask mode*/
- display(mid19win, 10,20, "0x%x", (int)getbeuw(buf, 20)); /* Nav. Elev. mask*/
- display(mid19win, 11,20, "0x%x", getub(buf, 22)); /* Nav. Power mask*/
- display(mid19win, 12,20, "0x%x", getub(buf, 27)); /* DGPS Source*/
- display(mid19win, 13,20, "0x%x", getub(buf, 28)); /* DGPS Mode*/
- display(mid19win, 14,20, "%dsec",getub(buf, 29)); /* DGPS Timeout*/
- display(mid19win, 1, 42, "%c", YESNO(34));/* LP Push-to-Fix */
- display(mid19win, 2, 42, "%dms", getbeul(buf, 35)); /* LP On Time */
- display(mid19win, 3, 42, "%d", getbeul(buf, 39)); /* LP Interval */
- display(mid19win, 4, 42, "%c", YESNO(43));/* User Tasks enabled */
- display(mid19win, 5, 42, "%d", getbeul(buf, 44)); /* User Task Interval */
- display(mid19win, 6, 42, "%c", YESNO(48));/* LP Power Cycling Enabled */
- display(mid19win, 7, 42, "%d", getbeul(buf, 49));/* LP Max Acq Search Time */
- display(mid19win, 8, 42, "%d", getbeul(buf, 53));/* LP Max Off Time */
- display(mid19win, 9, 42, "%c", YESNO(57));/* APM Enabled */
- display(mid19win,10, 42, "%d", (int)getbeuw(buf, 58));/* # of fixes */
- display(mid19win,11, 42, "%d", (int)getbeuw(buf, 60));/* Time Between fixes */
- display(mid19win,12, 42, "%d", getub(buf, 62));/* H/V Error Max */
- display(mid19win,13, 42, "%d", getub(buf, 63));/* Response Time Max */
- display(mid19win,14, 42, "%d", getub(buf, 64));/* Time/Accu & Duty Cycle Priority */
+ display(mid19win, 2, 20, "%d", getub(buf, 6)); /* Alt. hold source */
+ display(mid19win, 3, 20, "%dm", (int)getbeuw(buf, 7)); /* Alt. source input */
+ if (getub(buf, 9) != (uint8_t) '\0')
+ display(mid19win, 4, 20, "%dsec", getub(buf, 10)); /* Degraded timeout */
+ else
+ display(mid19win, 4, 20, "N/A ");
+ display(mid19win, 5, 20, "%dsec", getub(buf, 11)); /* DR timeout */
+ display(mid19win, 6, 20, "%c", YESNO(12)); /* Track smooth mode */
+ display(mid19win, 7, 20, "%c", YESNO(13)); /* Static Nav. */
+ display(mid19win, 8, 20, "0x%x", getub(buf, 14)); /* 3SV Least Squares */
+ display(mid19win, 9, 20, "0x%x", getub(buf, 19)); /* DOP Mask mode */
+ display(mid19win, 10, 20, "0x%x", (int)getbeuw(buf, 20)); /* Nav. Elev. mask */
+ display(mid19win, 11, 20, "0x%x", getub(buf, 22)); /* Nav. Power mask */
+ display(mid19win, 12, 20, "0x%x", getub(buf, 27)); /* DGPS Source */
+ display(mid19win, 13, 20, "0x%x", getub(buf, 28)); /* DGPS Mode */
+ display(mid19win, 14, 20, "%dsec", getub(buf, 29)); /* DGPS Timeout */
+ display(mid19win, 1, 42, "%c", YESNO(34)); /* LP Push-to-Fix */
+ display(mid19win, 2, 42, "%dms", getbeul(buf, 35)); /* LP On Time */
+ display(mid19win, 3, 42, "%d", getbeul(buf, 39)); /* LP Interval */
+ display(mid19win, 4, 42, "%c", YESNO(43)); /* User Tasks enabled */
+ display(mid19win, 5, 42, "%d", getbeul(buf, 44)); /* User Task Interval */
+ display(mid19win, 6, 42, "%c", YESNO(48)); /* LP Power Cycling Enabled */
+ display(mid19win, 7, 42, "%d", getbeul(buf, 49)); /* LP Max Acq Search Time */
+ display(mid19win, 8, 42, "%d", getbeul(buf, 53)); /* LP Max Off Time */
+ display(mid19win, 9, 42, "%c", YESNO(57)); /* APM Enabled */
+ display(mid19win, 10, 42, "%d", (int)getbeuw(buf, 58)); /* # of fixes */
+ display(mid19win, 11, 42, "%d", (int)getbeuw(buf, 60)); /* Time Between fixes */
+ display(mid19win, 12, 42, "%d", getub(buf, 62)); /* H/V Error Max */
+ display(mid19win, 13, 42, "%d", getub(buf, 63)); /* Response Time Max */
+ display(mid19win, 14, 42, "%d", getub(buf, 64)); /* Time/Accu & Duty Cycle Priority */
#undef YESNO
- break;
+ break;
case 0x1b:
/******************************************************************
@@ -504,12 +526,12 @@ static void sirf_update(void)
total 3 x 12 = 36 bytes
******************************************************************/
- display(mid27win, 1, 14, "%d (%s)",
+ display(mid27win, 1, 14, "%d (%s)",
getub(buf, 1), dgpsvec[(int)getub(buf, 1)]);
/*@ -type @*/
//(void) wmove(mid27win, 2, 0);
for (i = j = 0; i < 12; i++) {
- if (getub(buf, 16+3*i) != '\0') {
+ if (getub(buf, 16 + 3 * i) != '\0') {
//(void)wprintw(mid27win, " %d=%d", getub(buf, 16+3*i), getbesw(buf, 16+3*i+1));
j++;
}
@@ -519,61 +541,62 @@ static void sirf_update(void)
monitor_log("DST 0x1b=");
break;
- case 0x1C: /* NL Measurement Data */
- case 0x1D: /* DGPS Data */
- case 0x1E: /* SV State Data */
- case 0x1F: /* NL Initialized Data */
+ case 0x1C: /* NL Measurement Data */
+ case 0x1D: /* DGPS Data */
+ case 0x1E: /* SV State Data */
+ case 0x1F: /* NL Initialized Data */
subframe_enabled = true;
break;
- case 0x29: /* Geodetic Navigation Message */
+ case 0x29: /* Geodetic Navigation Message */
monitor_log("GNM 0x29=");
break;
- case 0x32: /* SBAS Parameters */
+ case 0x32: /* SBAS Parameters */
monitor_log("SBP 0x32=");
break;
- case 0x34: /* PPS Time */
+ case 0x34: /* PPS Time */
monitor_log("PPS 0x34=");
break;
#ifdef __UNUSED__
case 0x62:
attrset(A_BOLD);
- move(2,40);
- printw("%9.5f %9.5f",(double)(RAD_2_DEG*1e8*getbesl(buf, 1)),
- (double)(RAD_2_DEG*1e8*getbesl(buf, 5)));
- move(2,63);
- printw("%8d",getbesl(buf, 9)/1000);
+ move(2, 40);
+ printw("%9.5f %9.5f", (double)(RAD_2_DEG * 1e8 * getbesl(buf, 1)),
+ (double)(RAD_2_DEG * 1e8 * getbesl(buf, 5)));
+ move(2, 63);
+ printw("%8d", getbesl(buf, 9) / 1000);
- move(3,63);
+ move(3, 63);
- printw("%8.1f",(double)getbesl(buf, 17)/1000);
+ printw("%8.1f", (double)getbesl(buf, 17) / 1000);
- move(4,54);
+ move(4, 54);
if (getbeul(buf, 13) > 50) {
- double heading = RAD_2_DEG*1e8*getbesl(buf, 21);
+ double heading = RAD_2_DEG * 1e8 * getbesl(buf, 21);
if (heading < 0)
heading += 360;
- printw("%5.1f",heading);
+ printw("%5.1f", heading);
} else
printw(" 0.0");
- move(4,63);
- printw("%8.1f",(double)getbesl(buf, 13)/1000);
+ move(4, 63);
+ printw("%8.1f", (double)getbesl(buf, 13) / 1000);
attrset(A_NORMAL);
- move(5,13);
+ move(5, 13);
printw("%04d-%02d-%02d %02d:%02d:%02d.%02d",
- (int)getbeuw(buf, 26),getub(buf, 28),getub(buf, 29),getub(buf, 30),getub(buf, 31),
- (unsigned short)getbeuw(buf, 32)/1000,
- ((unsigned short)getbeuw(buf, 32)%1000)/10);
+ (int)getbeuw(buf, 26), getub(buf, 28), getub(buf, 29),
+ getub(buf, 30), getub(buf, 31), (unsigned short)getbeuw(buf,
+ 32) /
+ 1000, ((unsigned short)getbeuw(buf, 32) % 1000) / 10);
{
- struct timeval clk,gps;
+ struct timeval clk, gps;
struct tm tm;
- gettimeofday(&clk,NULL);
+ gettimeofday(&clk, NULL);
- memset(&tm,0,sizeof(tm));
- tm.tm_sec = (unsigned short)getbeuw(buf, 32)/1000;
+ memset(&tm, 0, sizeof(tm));
+ tm.tm_sec = (unsigned short)getbeuw(buf, 32) / 1000;
tm.tm_min = (int)getub(buf, 31);
tm.tm_hour = (int)getub(buf, 30);
tm.tm_mday = (int)getub(buf, 29);
@@ -581,39 +604,41 @@ static void sirf_update(void)
tm.tm_year = (int)getbeuw(buf, 26) - 1900;
gps.tv_sec = mkgmtime(&tm);
- gps.tv_usec = (((unsigned short)getbeuw(buf, 32)%1000)/10) * 10000;
+ gps.tv_usec =
+ (((unsigned short)getbeuw(buf, 32) % 1000) / 10) * 10000;
- move(5,2);
+ move(5, 2);
printw(" ");
- move(5,2);
-#if 1
- printw("%ld",(gps.tv_usec - clk.tv_usec) +
+ move(5, 2);
+#if 1
+ printw("%ld", (gps.tv_usec - clk.tv_usec) +
((gps.tv_sec - clk.tv_sec) % 3600) * 1000000);
#else
- printw("%ld %ld %ld %ld",gps.tv_sec % 3600,gps.tv_usec,
- clk.tv_sec % 3600,clk.tv_usec);
+ printw("%ld %ld %ld %ld", gps.tv_sec % 3600, gps.tv_usec,
+ clk.tv_sec % 3600, clk.tv_usec);
#endif
}
monitor_log("??? 0x62=");
break;
#endif /* __UNUSED__ */
- case 0xff: /* Development Data */
+ case 0xff: /* Development Data */
/*@ +ignoresigns @*/
- while (len > 0 && buf[len-1] == '\n')
+ while (len > 0 && buf[len - 1] == '\n')
len--;
- while (len > 0 && buf[len-1] == ' ')
+ while (len > 0 && buf[len - 1] == ' ')
len--;
/*@ -ignoresigns @*/
buf[len] = '\0';
j = 1;
for (i = 0; verbpat[i] != NULL; i++)
- if (strncmp((char *)(buf+1),verbpat[i],strlen(verbpat[i])) == 0) {
+ if (strncmp((char *)(buf + 1), verbpat[i], strlen(verbpat[i])) ==
+ 0) {
j = 0;
break;
}
if (j != 0)
- monitor_log("%s\n",buf+1);
+ monitor_log("%s\n", buf + 1);
monitor_log("DD 0xff=");
break;
@@ -636,6 +661,7 @@ static void sirf_update(void)
}
/*@ +nullpass -nullderef @*/
}
+
/*@ +globstate */
#ifdef ALLOW_CONTROLSEND
@@ -644,8 +670,7 @@ static int sirf_command(char line[])
unsigned char buf[BUFSIZ];
int v;
- switch (line[0])
- {
+ switch (line[0]) {
case 'A': /* toggle 50bps subframe data */
(void)memset(buf, '\0', sizeof(buf));
putbyte(buf, 0, 0x80);
@@ -655,17 +680,17 @@ static int sirf_command(char line[])
return COMMAND_MATCH;
case 'M': /* static navigation */
- putbyte(buf, 0,0x8f); /* id */
- putbyte(buf, 1, atoi(line+1));
+ putbyte(buf, 0, 0x8f); /* id */
+ putbyte(buf, 1, atoi(line + 1));
(void)monitor_control_send(buf, 2);
return COMMAND_MATCH;
case 'D': /* MID 4 rate change (undocumented) */
- v = atoi(line+1);
+ v = atoi(line + 1);
if (v > 30)
return COMMAND_MATCH;
- putbyte(buf, 0,0xa6);
- putbyte(buf, 1,0);
+ putbyte(buf, 0, 0xa6);
+ putbyte(buf, 1, 0);
putbyte(buf, 2, 4); /* satellite picture */
putbyte(buf, 3, v);
putbyte(buf, 4, 0);
@@ -705,7 +730,7 @@ const struct monitor_object_t sirf_mmt = {
.command = NULL,
#endif /* ALLOW_CONTROLSEND */
.wrap = sirf_wrap,
- .min_y = 23, .min_x = 80,
+ .min_y = 23,.min_x = 80,
.driver = &sirf_binary,
};
#endif /* defined(SIRF_ENABLE) && defined(BINARY_ENABLE) */
diff --git a/monitor_superstar2.c b/monitor_superstar2.c
index 725e271d..340f59f8 100644
--- a/monitor_superstar2.c
+++ b/monitor_superstar2.c
@@ -33,79 +33,78 @@ static WINDOW *satwin;
static bool superstar2_initialize(void)
{
- int i;
-
- /*@ -onlytrans @*/
- /* "heavily inspired" by monitor_nmea.c */
- if ((satwin = derwin(devicewin, 15, 27, 7, 0)) == NULL)
- return false;
- (void)wborder(satwin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)syncok(satwin, true);
- (void)wattrset(satwin, A_BOLD);
- (void)mvwprintw(satwin, 1, 1, "Ch PRN Az El S/N Fl U");
- for (i = 0; i < 12; i++)
- (void)mvwprintw(satwin, (int)(i+2), 1, "%2d",i);
- (void)mvwprintw(satwin, 14, 1, " Satellite Data & Status ");
- (void)wattrset(satwin, A_NORMAL);
- /*@ +onlytrans @*/
-
- return true;
+ int i;
+
+ /*@ -onlytrans @*/
+ /* "heavily inspired" by monitor_nmea.c */
+ if ((satwin = derwin(devicewin, 15, 27, 7, 0)) == NULL)
+ return false;
+ (void)wborder(satwin, 0, 0, 0, 0, 0, 0, 0, 0), (void)syncok(satwin, true);
+ (void)wattrset(satwin, A_BOLD);
+ (void)mvwprintw(satwin, 1, 1, "Ch PRN Az El S/N Fl U");
+ for (i = 0; i < 12; i++)
+ (void)mvwprintw(satwin, (int)(i + 2), 1, "%2d", i);
+ (void)mvwprintw(satwin, 14, 1, " Satellite Data & Status ");
+ (void)wattrset(satwin, A_NORMAL);
+ /*@ +onlytrans @*/
+
+ return true;
}
static void display_superstar2_svinfo(unsigned char *buf, size_t data_len)
{
- int i;
-
- if (data_len != 67)
- return;
-
- for (i = 0; i < 12; i++) {
- /* get info for one channel/satellite */
- int off = i*5 + 5;
- unsigned char fl, porn, ss;
- char el;
- unsigned short az;
-
- /*@ +charint */
- if ((porn = (unsigned char)getub(buf, off) & 0x1f) == 0)
- porn = ((unsigned char)getub(buf, off+3) >> 1) + 87;
- /*@ -charint */
-
- ss = (unsigned char)getub(buf, off+4);
- el = getsb(buf, off+1);
- az = (unsigned short)(getub(buf, off+2) +
- ((getub(buf, off+3) & 0x1) << 1));
- fl = (unsigned char)getub(buf, off) & 0xe0;
- (void)wmove(satwin, i+2, 4);
- /*@ +charint */
- (void)wprintw(satwin, "%3u %3d %2d %02d %02x %c",
- porn, az, el, ss, fl,
- ((fl & 0x60) == 0x60)? 'Y' : ' ');
- /*@ -charint */
- }
- (void)wnoutrefresh(satwin);
+ int i;
+
+ if (data_len != 67)
return;
+
+ for (i = 0; i < 12; i++) {
+ /* get info for one channel/satellite */
+ int off = i * 5 + 5;
+ unsigned char fl, porn, ss;
+ char el;
+ unsigned short az;
+
+ /*@ +charint */
+ if ((porn = (unsigned char)getub(buf, off) & 0x1f) == 0)
+ porn = ((unsigned char)getub(buf, off + 3) >> 1) + 87;
+ /*@ -charint */
+
+ ss = (unsigned char)getub(buf, off + 4);
+ el = getsb(buf, off + 1);
+ az = (unsigned short)(getub(buf, off + 2) +
+ ((getub(buf, off + 3) & 0x1) << 1));
+ fl = (unsigned char)getub(buf, off) & 0xe0;
+ (void)wmove(satwin, i + 2, 4);
+ /*@ +charint */
+ (void)wprintw(satwin, "%3u %3d %2d %02d %02x %c",
+ porn, az, el, ss, fl,
+ ((fl & 0x60) == 0x60) ? 'Y' : ' ');
+ /*@ -charint */
+ }
+ (void)wnoutrefresh(satwin);
+ return;
}
static void superstar2_update(void)
{
- unsigned char *buf;
- size_t len;
- unsigned char type;
-
- buf = session.packet.outbuffer;
- len = session.packet.outbuflen;
- type = buf[SUPERSTAR2_TYPE_OFFSET];
- switch (type) {
- case SUPERSTAR2_SVINFO:
- display_superstar2_svinfo(buf, len-3);
- break;
- default:
- break;
- }
+ unsigned char *buf;
+ size_t len;
+ unsigned char type;
+
+ buf = session.packet.outbuffer;
+ len = session.packet.outbuflen;
+ type = buf[SUPERSTAR2_TYPE_OFFSET];
+ switch (type) {
+ case SUPERSTAR2_SVINFO:
+ display_superstar2_svinfo(buf, len - 3);
+ break;
+ default:
+ break;
+ }
}
-static int superstar2_command(char line[] UNUSED)
+static int superstar2_command(char line[]UNUSED)
{
return COMMAND_UNKNOWN;
}
@@ -119,7 +118,7 @@ const struct monitor_object_t superstar2_mmt = {
.update = superstar2_update,
.command = superstar2_command,
.wrap = superstar2_wrap,
- .min_y = 23, .min_x = 80, /* size of the device window */
+ .min_y = 23,.min_x = 80, /* size of the device window */
.driver = &superstar2_binary,
};
#endif
diff --git a/monitor_tnt.c b/monitor_tnt.c
new file mode 100644
index 00000000..a7fe523a
--- /dev/null
+++ b/monitor_tnt.c
@@ -0,0 +1,147 @@
+/*
+ * monitor_tnt.c - gpsmon support for True North Revolution devices.
+ *
+ * This file is Copyright (c) 2010 by the GPSD project
+ * BSD terms apply: see the file COPYING in the distribution root for details.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <ctype.h>
+#ifndef S_SPLINT_S
+#include <unistd.h>
+#endif /* S_SPLINT_S */
+#include <stdarg.h>
+#include <stdbool.h>
+#include <assert.h>
+
+#include "gpsd_config.h"
+
+#ifdef HAVE_NCURSES_H
+#include <ncurses.h>
+#else
+#include <curses.h>
+#endif /* HAVE_NCURSES_H */
+#include "gpsd.h"
+
+#include "bits.h"
+#include "gpsmon.h"
+
+#ifdef TNT_ENABLE
+extern const struct gps_type_t trueNorth;
+
+static WINDOW *thtmwin;
+
+static bool tnt_initialize(void)
+{
+ /*@ -onlytrans @*/
+ thtmwin = derwin(devicewin, 6, 80, 0, 0);
+ (void)wborder(thtmwin, 0, 0, 0, 0, 0, 0, 0, 0),
+ (void)syncok(thtmwin, true);
+ (void)wattrset(thtmwin, A_BOLD);
+ (void)mvwaddstr(thtmwin, 0, 35, " PTNTHTM ");
+ (void)mvwaddstr(thtmwin, 1, 1, "Heading: ");
+ (void)mvwaddstr(thtmwin, 2, 1, "Pitch: ");
+ (void)mvwaddstr(thtmwin, 3, 1, "Roll: ");
+ (void)mvwaddstr(thtmwin, 4, 1, "Dip: ");
+
+ (void)mvwaddstr(thtmwin, 1, 40, "Magnetometer Status: ");
+ (void)mvwaddstr(thtmwin, 2, 40, "Pitch Status: ");
+ (void)mvwaddstr(thtmwin, 3, 40, "Roll Status ");
+ (void)mvwaddstr(thtmwin, 4, 40, "Horizontal Field: ");
+ (void)wattrset(thtmwin, A_NORMAL);
+ /*@ +onlytrans @*/
+ return true;
+}
+
+static void tnt_update(void)
+{
+ /*
+ * We have to do our own field parsing because the way this
+ * gets valled, nmea_parse() is never called on the sentence.
+ */
+ (void)nmea_parse((char *)session.packet.outbuffer, &session);
+
+ (void)mvwaddstr(thtmwin, 1, 19, session.driver.nmea.field[1]);
+ (void)mvwaddstr(thtmwin, 2, 19, session.driver.nmea.field[3]);
+ (void)mvwaddstr(thtmwin, 3, 19, session.driver.nmea.field[5]);
+ (void)mvwaddstr(thtmwin, 4, 19, session.driver.nmea.field[7]);
+
+ (void)mvwaddstr(thtmwin, 1, 61, session.driver.nmea.field[2]);
+ (void)mvwaddstr(thtmwin, 2, 61, session.driver.nmea.field[4]);
+ (void)mvwaddstr(thtmwin, 3, 61, session.driver.nmea.field[6]);
+ (void)mvwaddstr(thtmwin, 4, 61, session.driver.nmea.field[8]);
+}
+
+static int tnt_command(char line[])
+{
+ /*
+ * Interpret a command line. Whatever characters the user types will
+ * be echoed in the command buffer at the top right of the display. When
+ * he/she presses enter the command line will be passed to this function
+ * for interpretation. Note: packet receipt is suspended while this
+ * function is executing.
+ *
+ * This method is optional. If you set the command method pointer to
+ * NULL, gpsmon will behave sanely, accepting no device-specific commands.
+ *
+ * It is a useful convention to use uppercase letters for
+ * driver-specific commands and leave lowercase ones for the
+ * generic gpsmon ones.
+ */
+
+ /*
+ * Return COMMAND_UNKNOWN to tell gpsmon you can't interpret the line, and
+ * it will be passed to the generic command interpreter to be handled there.
+ * You can alse return COMMAND_MATCH to tell it you handled the command,
+ * or COMMAND_TERMINATE to tell gpsmon you handled it and gpsmon should
+ * terminate.
+ */
+ return COMMAND_UNKNOWN;
+}
+
+static void tnt_wrap(void)
+{
+ (void)delwin(thtmwin);
+}
+
+/*
+ * Use mmt = monitor method table as a suffix for naming these things
+ * Yours will need to be added to the monitor_objects table in gpsmon.c,
+ * then of course you need to link your module into gpsmon.
+ */
+const struct monitor_object_t tnt_mmt = {
+ .initialize = tnt_initialize,
+ .update = tnt_update,
+ .command = tnt_command,
+ .wrap = tnt_wrap,
+ .min_y = 6,.min_x = 80, /* size of the device window */
+ .driver = &trueNorth,
+};
+#endif /* TNT_ENABLE */
+
+/*
+ * Helpers:
+ *
+ * bool monitor_control_send(unsigned char *buf, size_t len)
+ * Ship a packet payload to the device. Calls the driver send_control()
+ * method to add headers/trailers/checksum; also dumps the sent
+ * packet to the packet window, if the send_control() is playing
+ * nice by using session.msgbuf to assemble the message.
+ *
+ * void monitor_log(const char *fmt, ...)
+ * Write a message to the packet window. Safe if the packet window
+ * is not on screen.
+ *
+ * void monitor_complain(const char *fmt, ...)
+ * Post an error message to the command window, wait till user presses a key.
+ * You get to make sure the message will fit.
+ *
+ * void monitor_fixframe(WINDOW *win)
+ * Fix the frame of win to the right of the current location by redrawing
+ * ACS_VLINE there. Useful after doing wclrtoeol() and writing on the
+ * line.
+ *
+ * The libgpsd session object is accessible as the global variable 'session'.
+ */
diff --git a/monitor_ubx.c b/monitor_ubx.c
index 88fa7430..1d461228 100644
--- a/monitor_ubx.c
+++ b/monitor_ubx.c
@@ -34,226 +34,224 @@ static WINDOW *satwin, *navsolwin, *dopwin;
#define display (void)mvwprintw
static bool ubx_initialize(void)
{
- int i;
-
- /*@ -onlytrans @*/
- /* "heavily inspired" by monitor_nmea.c */
- if ((satwin = derwin(devicewin, 19, 28, 0, 0)) == NULL)
- return false;
- (void)wborder(satwin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)syncok(satwin, true);
- (void)wattrset(satwin, A_BOLD);
- (void)mvwprintw(satwin, 1, 1, "Ch PRN Az El S/N Flag U");
- for (i = 0; i < 16; i++)
- (void)mvwprintw(satwin, (int)(i+2), 1, "%2d",i);
- (void)mvwprintw(satwin, 18, 7, " NAV_SVINFO ");
- (void)wattrset(satwin, A_NORMAL);
- /*@ -onlytrans @*/
-
- /* "heavily inspired" by monitor_nmea.c */
- if ((navsolwin = derwin(devicewin, 13, 51, 0, 28)) == NULL)
- return false;
- (void)wborder(navsolwin, 0, 0, 0, 0, 0, 0, 0, 0),
+ int i;
+
+ /*@ -onlytrans @*/
+ /* "heavily inspired" by monitor_nmea.c */
+ if ((satwin = derwin(devicewin, 19, 28, 0, 0)) == NULL)
+ return false;
+ (void)wborder(satwin, 0, 0, 0, 0, 0, 0, 0, 0), (void)syncok(satwin, true);
+ (void)wattrset(satwin, A_BOLD);
+ (void)mvwprintw(satwin, 1, 1, "Ch PRN Az El S/N Flag U");
+ for (i = 0; i < 16; i++)
+ (void)mvwprintw(satwin, (int)(i + 2), 1, "%2d", i);
+ (void)mvwprintw(satwin, 18, 7, " NAV_SVINFO ");
+ (void)wattrset(satwin, A_NORMAL);
+ /*@ -onlytrans @*/
+
+ /* "heavily inspired" by monitor_nmea.c */
+ if ((navsolwin = derwin(devicewin, 13, 51, 0, 28)) == NULL)
+ return false;
+ (void)wborder(navsolwin, 0, 0, 0, 0, 0, 0, 0, 0),
(void)wattrset(navsolwin, A_BOLD);
- (void)wmove(navsolwin, 1,1);
- (void)wprintw(navsolwin, "ECEF Pos:");
- (void)wmove(navsolwin, 2,1);
- (void)wprintw(navsolwin, "ECEF Vel:");
-
- (void)wmove(navsolwin, 4,1);
- (void)wprintw(navsolwin, "LTP Pos:");
- (void)wmove(navsolwin, 5,1);
- (void)wprintw(navsolwin, "LTP Vel:");
-
- (void)wmove(navsolwin, 7,1);
- (void)wprintw(navsolwin, "Time UTC:");
- (void)wmove(navsolwin, 8,1);
- (void)wprintw(navsolwin, "Time GPS: Day:");
-
- (void)wmove(navsolwin, 10,1);
- (void)wprintw(navsolwin, "Est Pos Err m Est Vel Err m/s");
- (void)wmove(navsolwin, 11,1);
- (void)wprintw(navsolwin, "PRNs: ## PDOP: xx.x Fix 0x.. Flags 0x..");
-
- display(navsolwin, 12, 20, " NAV_SOL ");
- (void)wattrset(navsolwin, A_NORMAL);
-
- if ((dopwin = derwin(devicewin, 3, 51, 13, 28)) == NULL)
- return false;
- (void)wborder(dopwin, 0, 0, 0, 0, 0, 0, 0, 0),
+ (void)wmove(navsolwin, 1, 1);
+ (void)wprintw(navsolwin, "ECEF Pos:");
+ (void)wmove(navsolwin, 2, 1);
+ (void)wprintw(navsolwin, "ECEF Vel:");
+
+ (void)wmove(navsolwin, 4, 1);
+ (void)wprintw(navsolwin, "LTP Pos:");
+ (void)wmove(navsolwin, 5, 1);
+ (void)wprintw(navsolwin, "LTP Vel:");
+
+ (void)wmove(navsolwin, 7, 1);
+ (void)wprintw(navsolwin, "Time UTC:");
+ (void)wmove(navsolwin, 8, 1);
+ (void)wprintw(navsolwin, "Time GPS: Day:");
+
+ (void)wmove(navsolwin, 10, 1);
+ (void)wprintw(navsolwin, "Est Pos Err m Est Vel Err m/s");
+ (void)wmove(navsolwin, 11, 1);
+ (void)wprintw(navsolwin, "PRNs: ## PDOP: xx.x Fix 0x.. Flags 0x..");
+
+ display(navsolwin, 12, 20, " NAV_SOL ");
+ (void)wattrset(navsolwin, A_NORMAL);
+
+ if ((dopwin = derwin(devicewin, 3, 51, 13, 28)) == NULL)
+ return false;
+ (void)wborder(dopwin, 0, 0, 0, 0, 0, 0, 0, 0),
(void)wattrset(dopwin, A_BOLD);
- (void)wmove(dopwin, 1,1);
- (void)wprintw(dopwin, "DOP [H] [V] [P] [T] [G]");
- display(dopwin, 2, 20, " NAV_DOP ");
- (void)wattrset(dopwin, A_NORMAL);
+ (void)wmove(dopwin, 1, 1);
+ (void)wprintw(dopwin, "DOP [H] [V] [P] [T] [G]");
+ display(dopwin, 2, 20, " NAV_DOP ");
+ (void)wattrset(dopwin, A_NORMAL);
- return true;
+ return true;
}
static void display_nav_svinfo(unsigned char *buf, size_t data_len)
{
- int i, nchan;
-
- if (data_len < 152 )
- return;
-
- nchan = (int)getub(buf, 4);
- if (nchan > 16)
- nchan = 16;
-
- for (i = 0; i < nchan; i++) {
- int off = 8 + 12 * i;
- unsigned char ss, prn;
- char el;
- short az;
- unsigned short fl;
-
- prn = (unsigned char)getub(buf, off+1);
- fl = (unsigned short)getleuw(buf, off+2);
- ss = (unsigned char)getub(buf, off+4);
- el = getsb(buf, off+5);
- az = getlesw(buf, off+6);
- (void)wmove(satwin, (int)(i+2), 4);
- (void)wprintw(satwin, "%3d %3d %3d %2d %04x %c",
- prn, az, el, ss, fl,
- (fl & UBX_SAT_USED)? 'Y' : ' ');
- }
- (void)wnoutrefresh(satwin);
+ int i, nchan;
+
+ if (data_len < 152)
return;
+
+ nchan = (int)getub(buf, 4);
+ if (nchan > 16)
+ nchan = 16;
+
+ for (i = 0; i < nchan; i++) {
+ int off = 8 + 12 * i;
+ unsigned char ss, prn;
+ char el;
+ short az;
+ unsigned short fl;
+
+ prn = (unsigned char)getub(buf, off + 1);
+ fl = (unsigned short)getleuw(buf, off + 2);
+ ss = (unsigned char)getub(buf, off + 4);
+ el = getsb(buf, off + 5);
+ az = getlesw(buf, off + 6);
+ (void)wmove(satwin, (int)(i + 2), 4);
+ (void)wprintw(satwin, "%3d %3d %3d %2d %04x %c",
+ prn, az, el, ss, fl, (fl & UBX_SAT_USED) ? 'Y' : ' ');
+ }
+ (void)wnoutrefresh(satwin);
+ return;
}
/*@ -mustfreeonly -compdestroy @*/
static void display_nav_sol(unsigned char *buf, size_t data_len)
{
- unsigned short gw = 0;
- unsigned int tow = 0, flags;
- double epx, epy, epz, evx, evy, evz;
- unsigned char navmode;
- double t;
- time_t tt;
- struct gps_data_t g;
- double separation;
-
- if (data_len != 52)
- return;
-
- navmode = (unsigned char)getub(buf, 10);
- flags = (unsigned int)getub(buf, 11);
-
- if ((flags & (UBX_SOL_VALID_WEEK |UBX_SOL_VALID_TIME)) != 0) {
- tow = (unsigned int)getleul(buf, 0);
- gw = (unsigned short)getlesw(buf, 8);
- t = gpstime_to_unix((int)gw, tow/1000.0);
- tt = (time_t)trunc(t);
- }
-
- epx = (double)(getlesl(buf, 12)/100.0);
- epy = (double)(getlesl(buf, 16)/100.0);
- epz = (double)(getlesl(buf, 20)/100.0);
- evx = (double)(getlesl(buf, 28)/100.0);
- evy = (double)(getlesl(buf, 32)/100.0);
- evz = (double)(getlesl(buf, 36)/100.0);
- ecef_to_wgs84fix(&g.fix, &separation,
- epx, epy, epz, evx, evy, evz);
- g.fix.epx = g.fix.epy = (double)(getlesl(buf, 24)/100.0);
- g.fix.eps = (double)(getlesl(buf, 40)/100.0);
- g.dop.pdop = (double)(getleuw(buf, 44)/100.0);
- g.satellites_used = (int)getub(buf, 47);
-
- (void)wmove(navsolwin, 1, 11);
- (void)wprintw(navsolwin, "%+10.2fm %+10.2fm %+10.2fm", epx, epy, epz);
- (void)wmove(navsolwin, 2, 11);
- (void)wprintw(navsolwin, "%+9.2fm/s %+9.2fm/s %+9.2fm/s", evx, evy, evz);
-
- (void)wmove(navsolwin, 4, 11);
- (void)wprintw(navsolwin, "%12.9f %13.9f %8.2fm",
- g.fix.latitude, g.fix.longitude, g.fix.altitude);
- (void)mvwaddch(navsolwin, 4, 23, ACS_DEGREE);
- (void)mvwaddch(navsolwin, 4, 39, ACS_DEGREE);
- (void)wmove(navsolwin, 5, 11);
- (void)wprintw(navsolwin, "%6.2fm/s %5.1fo %6.2fm/s",
- g.fix.speed, g.fix.track, g.fix.climb);
- (void)mvwaddch(navsolwin, 5, 26, ACS_DEGREE);
-
- (void)wmove(navsolwin, 7, 11);
- /*@ -compdef @*/
- (void)wprintw(navsolwin, "%s", ctime(&tt));
- /*@ +compdef @*/
- (void)wmove(navsolwin, 8, 11);
- if ((flags & (UBX_SOL_VALID_WEEK |UBX_SOL_VALID_TIME)) != 0) {
- (void)wprintw(navsolwin, "%d+%10.3lf", gw, (double)(tow/1000.0));
- (void)wmove(navsolwin, 8, 36);
- (void)wprintw(navsolwin, "%d", (tow/86400000) );
- }
-
- /* relies on the fact that expx and epy are aet to same value */
- (void)wmove(navsolwin, 10, 12);
- (void)wprintw(navsolwin, "%7.2f", g.fix.epx);
- (void)wmove(navsolwin, 10, 33);
- (void)wprintw(navsolwin, "%6.2f", g.fix.epv);
- (void)wmove(navsolwin, 11, 7);
- (void)wprintw(navsolwin, "%2d", g.satellites_used);
- (void)wmove(navsolwin, 11, 15);
- (void)wprintw(navsolwin, "%5.1f", g.dop.pdop);
- (void)wmove(navsolwin, 11, 25);
- (void)wprintw(navsolwin, "0x%02x", navmode);
- (void)wmove(navsolwin, 11, 36);
- (void)wprintw(navsolwin, "0x%02x", flags);
- (void)wnoutrefresh(navsolwin);
+ unsigned short gw = 0;
+ unsigned int tow = 0, flags;
+ double epx, epy, epz, evx, evy, evz;
+ unsigned char navmode;
+ double t;
+ time_t tt;
+ struct gps_data_t g;
+ double separation;
+
+ if (data_len != 52)
+ return;
+
+ navmode = (unsigned char)getub(buf, 10);
+ flags = (unsigned int)getub(buf, 11);
+
+ if ((flags & (UBX_SOL_VALID_WEEK | UBX_SOL_VALID_TIME)) != 0) {
+ tow = (unsigned int)getleul(buf, 0);
+ gw = (unsigned short)getlesw(buf, 8);
+ t = gpstime_to_unix((int)gw, tow / 1000.0);
+ tt = (time_t) trunc(t);
+ }
+
+ epx = (double)(getlesl(buf, 12) / 100.0);
+ epy = (double)(getlesl(buf, 16) / 100.0);
+ epz = (double)(getlesl(buf, 20) / 100.0);
+ evx = (double)(getlesl(buf, 28) / 100.0);
+ evy = (double)(getlesl(buf, 32) / 100.0);
+ evz = (double)(getlesl(buf, 36) / 100.0);
+ ecef_to_wgs84fix(&g.fix, &separation, epx, epy, epz, evx, evy, evz);
+ g.fix.epx = g.fix.epy = (double)(getlesl(buf, 24) / 100.0);
+ g.fix.eps = (double)(getlesl(buf, 40) / 100.0);
+ g.dop.pdop = (double)(getleuw(buf, 44) / 100.0);
+ g.satellites_used = (int)getub(buf, 47);
+
+ (void)wmove(navsolwin, 1, 11);
+ (void)wprintw(navsolwin, "%+10.2fm %+10.2fm %+10.2fm", epx, epy, epz);
+ (void)wmove(navsolwin, 2, 11);
+ (void)wprintw(navsolwin, "%+9.2fm/s %+9.2fm/s %+9.2fm/s", evx, evy, evz);
+
+ (void)wmove(navsolwin, 4, 11);
+ (void)wprintw(navsolwin, "%12.9f %13.9f %8.2fm",
+ g.fix.latitude, g.fix.longitude, g.fix.altitude);
+ (void)mvwaddch(navsolwin, 4, 23, ACS_DEGREE);
+ (void)mvwaddch(navsolwin, 4, 39, ACS_DEGREE);
+ (void)wmove(navsolwin, 5, 11);
+ (void)wprintw(navsolwin, "%6.2fm/s %5.1fo %6.2fm/s",
+ g.fix.speed, g.fix.track, g.fix.climb);
+ (void)mvwaddch(navsolwin, 5, 26, ACS_DEGREE);
+
+ (void)wmove(navsolwin, 7, 11);
+ /*@ -compdef @*/
+ (void)wprintw(navsolwin, "%s", ctime(&tt));
+ /*@ +compdef @*/
+ (void)wmove(navsolwin, 8, 11);
+ if ((flags & (UBX_SOL_VALID_WEEK | UBX_SOL_VALID_TIME)) != 0) {
+ (void)wprintw(navsolwin, "%d+%10.3lf", gw, (double)(tow / 1000.0));
+ (void)wmove(navsolwin, 8, 36);
+ (void)wprintw(navsolwin, "%d", (tow / 86400000));
+ }
+
+ /* relies on the fact that expx and epy are aet to same value */
+ (void)wmove(navsolwin, 10, 12);
+ (void)wprintw(navsolwin, "%7.2f", g.fix.epx);
+ (void)wmove(navsolwin, 10, 33);
+ (void)wprintw(navsolwin, "%6.2f", g.fix.epv);
+ (void)wmove(navsolwin, 11, 7);
+ (void)wprintw(navsolwin, "%2d", g.satellites_used);
+ (void)wmove(navsolwin, 11, 15);
+ (void)wprintw(navsolwin, "%5.1f", g.dop.pdop);
+ (void)wmove(navsolwin, 11, 25);
+ (void)wprintw(navsolwin, "0x%02x", navmode);
+ (void)wmove(navsolwin, 11, 36);
+ (void)wprintw(navsolwin, "0x%02x", flags);
+ (void)wnoutrefresh(navsolwin);
}
+
/*@ +mustfreeonly +compdestroy @*/
static void display_nav_dop(unsigned char *buf, size_t data_len)
{
- if (data_len != 18)
- return;
- (void)wmove(dopwin, 1,9);
- (void)wprintw(dopwin, "%4.1f", getleuw(buf, 12)/100.0);
- (void)wmove(dopwin, 1,18);
- (void)wprintw(dopwin, "%4.1f", getleuw(buf, 10)/100.0);
- (void)wmove(dopwin, 1,27);
- (void)wprintw(dopwin, "%4.1f", getleuw(buf, 6)/100.0);
- (void)wmove(dopwin, 1,36);
- (void)wprintw(dopwin, "%4.1f", getleuw(buf, 8)/100.0);
- (void)wmove(dopwin, 1,45);
- (void)wprintw(dopwin, "%4.1f", getleuw(buf, 4)/100.0);
- (void)wnoutrefresh(dopwin);
+ if (data_len != 18)
+ return;
+ (void)wmove(dopwin, 1, 9);
+ (void)wprintw(dopwin, "%4.1f", getleuw(buf, 12) / 100.0);
+ (void)wmove(dopwin, 1, 18);
+ (void)wprintw(dopwin, "%4.1f", getleuw(buf, 10) / 100.0);
+ (void)wmove(dopwin, 1, 27);
+ (void)wprintw(dopwin, "%4.1f", getleuw(buf, 6) / 100.0);
+ (void)wmove(dopwin, 1, 36);
+ (void)wprintw(dopwin, "%4.1f", getleuw(buf, 8) / 100.0);
+ (void)wmove(dopwin, 1, 45);
+ (void)wprintw(dopwin, "%4.1f", getleuw(buf, 4) / 100.0);
+ (void)wnoutrefresh(dopwin);
}
static void ubx_update(void)
{
- unsigned char *buf;
- size_t data_len;
- unsigned short msgid;
-
- buf = session.packet.outbuffer;
- msgid = (unsigned short)((buf[2] << 8) | buf[3]);
- data_len = (size_t)getlesw(buf, 4);
- switch (msgid) {
- case UBX_NAV_SVINFO:
- display_nav_svinfo(&buf[6], data_len);
- break;
- case UBX_NAV_DOP:
- display_nav_dop(&buf[6], data_len);
- break;
- case UBX_NAV_SOL:
- display_nav_sol(&buf[6], data_len);
- break;
- default:
- break;
- }
+ unsigned char *buf;
+ size_t data_len;
+ unsigned short msgid;
+
+ buf = session.packet.outbuffer;
+ msgid = (unsigned short)((buf[2] << 8) | buf[3]);
+ data_len = (size_t) getlesw(buf, 4);
+ switch (msgid) {
+ case UBX_NAV_SVINFO:
+ display_nav_svinfo(&buf[6], data_len);
+ break;
+ case UBX_NAV_DOP:
+ display_nav_dop(&buf[6], data_len);
+ break;
+ case UBX_NAV_SOL:
+ display_nav_sol(&buf[6], data_len);
+ break;
+ default:
+ break;
+ }
}
-static int ubx_command(char line[] UNUSED)
+static int ubx_command(char line[]UNUSED)
{
- return COMMAND_UNKNOWN;
+ return COMMAND_UNKNOWN;
}
static void ubx_wrap(void)
{
- (void)delwin(satwin);
- return;
+ (void)delwin(satwin);
+ return;
}
const struct monitor_object_t ubx_mmt = {
@@ -261,7 +259,7 @@ const struct monitor_object_t ubx_mmt = {
.update = ubx_update,
.command = ubx_command,
.wrap = ubx_wrap,
- .min_y = 23, .min_x = 80, /* size of the device window */
+ .min_y = 23,.min_x = 80, /* size of the device window */
.driver = &ubx_binary,
};
#endif
diff --git a/net_dgpsip.c b/net_dgpsip.c
index 9f839bf3..0217c0bb 100644
--- a/net_dgpsip.c
+++ b/net_dgpsip.c
@@ -7,20 +7,20 @@
#include "gpsd_config.h"
#include <sys/types.h>
#ifndef S_SPLINT_S
- #ifdef HAVE_SYS_SOCKET_H
- #include <sys/socket.h>
- #else
- #define AF_UNSPEC 0
- #endif /* HAVE_SYS_SOCKET_H */
- #include <unistd.h>
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#else
+#define AF_UNSPEC 0
+#endif /* HAVE_SYS_SOCKET_H */
+#include <unistd.h>
#endif /* S_SPLINT_S */
#include <sys/time.h>
#include <stdio.h>
#include <math.h>
#ifndef S_SPLINT_S
- #ifdef HAVE_NETDB_H
- #include <netdb.h>
- #endif /* HAVE_NETDB_H */
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif /* HAVE_NETDB_H */
#endif /* S_SPLINT_S */
#include <string.h>
#include <errno.h>
@@ -37,30 +37,37 @@ int dgpsip_open(struct gps_context_t *context, const char *dgpsserver)
int opts;
if ((colon = strchr(dgpsserver, ':')) != NULL) {
- dgpsport = colon+1;
+ dgpsport = colon + 1;
*colon = '\0';
}
if (!getservbyname(dgpsport, "tcp"))
dgpsport = DEFAULT_RTCM_PORT;
- context->dsock = netlib_connectsock(AF_UNSPEC, dgpsserver, dgpsport, "tcp");
+ context->dsock =
+ netlib_connectsock(AF_UNSPEC, dgpsserver, dgpsport, "tcp");
if (context->dsock >= 0) {
- gpsd_report(LOG_PROG,"connection to DGPS server %s established.\n",dgpsserver);
+ gpsd_report(LOG_PROG, "connection to DGPS server %s established.\n",
+ dgpsserver);
(void)gethostname(hn, sizeof(hn));
/* greeting required by some RTCM104 servers; others will ignore it */
- (void)snprintf(buf,sizeof(buf), "HELO %s gpsd %s\r\nR\r\n",hn,VERSION);
- if (write(context->dsock, buf, strlen(buf)) == (ssize_t)strlen(buf))
+ (void)snprintf(buf, sizeof(buf), "HELO %s gpsd %s\r\nR\r\n", hn,
+ VERSION);
+ if (write(context->dsock, buf, strlen(buf)) == (ssize_t) strlen(buf))
context->netgnss_service = netgnss_dgpsip;
else
- gpsd_report(LOG_ERROR, "hello to DGPS server %s failed\n", dgpsserver);
+ gpsd_report(LOG_ERROR, "hello to DGPS server %s failed\n",
+ dgpsserver);
} else
- gpsd_report(LOG_ERROR, "can't connect to DGPS server %s, netlib error %d.\n", dgpsserver, context->dsock);
+ gpsd_report(LOG_ERROR,
+ "can't connect to DGPS server %s, netlib error %d.\n",
+ dgpsserver, context->dsock);
opts = fcntl(context->dsock, F_GETFL);
if (opts >= 0)
(void)fcntl(context->dsock, F_SETFL, opts | O_NONBLOCK);
return context->dsock;
}
+
/*@ +branchstate */
void dgpsip_report(struct gps_device_t *session)
@@ -74,11 +81,12 @@ void dgpsip_report(struct gps_device_t *session)
session->context->sentdgps = true;
if (session->context->dsock > -1) {
char buf[BUFSIZ];
- (void)snprintf(buf, sizeof(buf), "R %0.8f %0.8f %0.2f\r\n",
- session->gpsdata.fix.latitude,
- session->gpsdata.fix.longitude,
+ (void)snprintf(buf, sizeof(buf), "R %0.8f %0.8f %0.2f\r\n",
+ session->gpsdata.fix.latitude,
+ session->gpsdata.fix.longitude,
session->gpsdata.fix.altitude);
- if (write(session->context->dsock, buf, strlen(buf)) == (ssize_t)strlen(buf))
+ if (write(session->context->dsock, buf, strlen(buf)) ==
+ (ssize_t) strlen(buf))
gpsd_report(LOG_IO, "=> dgps %s", buf);
else
gpsd_report(LOG_IO, "write to dgps FAILED");
@@ -89,7 +97,8 @@ void dgpsip_report(struct gps_device_t *session)
#define DGPS_THRESHOLD 1600000 /* max. useful dist. from DGPS server (m) */
#define SERVER_SAMPLE 12 /* # of servers within threshold to check */
-struct dgps_server_t {
+struct dgps_server_t
+{
double lat, lon;
char server[257];
double dist;
@@ -97,12 +106,11 @@ struct dgps_server_t {
static int srvcmp(const void *s, const void *t)
{
- return (int)(((const struct dgps_server_t *)s)->dist - ((const struct dgps_server_t *)t)->dist); /* fixes: warning: cast discards qualifiers from pointer target type */
+ return (int)(((const struct dgps_server_t *)s)->dist - ((const struct dgps_server_t *)t)->dist); /* fixes: warning: cast discards qualifiers from pointer target type */
}
void dgpsip_autoconnect(struct gps_context_t *context,
- double lat, double lon,
- const char *serverlist)
+ double lat, double lon, const char *serverlist)
/* tell the library to talk to the nearest DGPSIP server */
{
struct dgps_server_t keep[SERVER_SAMPLE], hold, *sp, *tp;
@@ -124,7 +132,8 @@ void dgpsip_autoconnect(struct gps_context_t *context,
char *cp = strchr(buf, '#');
if (cp != NULL)
*cp = '\0';
- if (sscanf(buf,"%lf %lf %256s",&hold.lat, &hold.lon, hold.server)==3) {
+ if (sscanf(buf, "%lf %lf %256s", &hold.lat, &hold.lon, hold.server) ==
+ 3) {
hold.dist = earth_distance(lat, lon, hold.lat, hold.lon);
tp = NULL;
/*
@@ -134,7 +143,8 @@ void dgpsip_autoconnect(struct gps_context_t *context,
* In this way we end up with the closest possible set.
*/
for (sp = keep; sp < keep + SERVER_SAMPLE; sp++)
- if (hold.dist < sp->dist && (tp==NULL || hold.dist > tp->dist))
+ if (hold.dist < sp->dist
+ && (tp == NULL || hold.dist > tp->dist))
tp = sp;
if (tp != NULL)
memcpy(tp, &hold, sizeof(struct dgps_server_t));
@@ -143,7 +153,8 @@ void dgpsip_autoconnect(struct gps_context_t *context,
(void)fclose(sfp);
if (keep[0].server[0] == '\0') {
- gpsd_report(LOG_ERROR, "no DGPS servers within %dm.\n", (int)(DGPS_THRESHOLD/1000));
+ gpsd_report(LOG_ERROR, "no DGPS servers within %dm.\n",
+ (int)(DGPS_THRESHOLD / 1000));
context->dsock = -2; /* don't try this again */
return;
}
@@ -153,7 +164,8 @@ void dgpsip_autoconnect(struct gps_context_t *context,
qsort((void *)keep, SERVER_SAMPLE, sizeof(struct dgps_server_t), srvcmp);
for (sp = keep; sp < keep + SERVER_SAMPLE; sp++) {
if (sp->server[0] != '\0') {
- gpsd_report(LOG_INF,"%s is %dkm away.\n",sp->server,(int)(sp->dist/1000));
+ gpsd_report(LOG_INF, "%s is %dkm away.\n", sp->server,
+ (int)(sp->dist / 1000));
if (dgpsip_open(context, sp->server) >= 0)
break;
}
diff --git a/net_gnss_dispatch.c b/net_gnss_dispatch.c
index c8b5a7d1..064247e6 100644
--- a/net_gnss_dispatch.c
+++ b/net_gnss_dispatch.c
@@ -8,9 +8,9 @@
#include "gpsd_config.h"
#include <sys/types.h>
#ifndef S_SPLINT_S
- #ifdef HAVE_SYS_SOCKET_H
- #include <sys/socket.h>
- #endif
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
#include <unistd.h>
#endif /* S_SPLINT_S */
#include <string.h>
@@ -38,35 +38,40 @@ int netgnss_uri_open(struct gps_context_t *context, char *netgnss_service)
/* open a connection to a DGNSS service */
{
#ifdef NTRIP_ENABLE
- if (strncmp(netgnss_service, NETGNSS_NTRIP, strlen(NETGNSS_NTRIP))==0)
+ if (strncmp(netgnss_service, NETGNSS_NTRIP, strlen(NETGNSS_NTRIP)) == 0)
return ntrip_open(context, netgnss_service + strlen(NETGNSS_NTRIP));
#endif
- if (strncmp(netgnss_service, NETGNSS_DGPSIP, strlen(NETGNSS_DGPSIP))==0)
+ if (strncmp(netgnss_service, NETGNSS_DGPSIP, strlen(NETGNSS_DGPSIP)) == 0)
return dgpsip_open(context, netgnss_service + strlen(NETGNSS_DGPSIP));
#ifndef REQUIRE_DGNSS_PROTO
return dgpsip_open(context, netgnss_service);
#else
- gpsd_report(LOG_ERROR, "Unknown or unspecified DGNSS protocol for service %s\n",
+ gpsd_report(LOG_ERROR,
+ "Unknown or unspecified DGNSS protocol for service %s\n",
netgnss_service);
return -1;
#endif
}
+
/*@ +branchstate */
int netgnss_poll(struct gps_context_t *context)
/* poll the DGNSS service for a correction report */
{
if (context->dsock > -1) {
- context->rtcmbytes = read(context->dsock, context->rtcmbuf, sizeof(context->rtcmbuf));
- if ((context->rtcmbytes == -1 && errno != EAGAIN) ||
- (context->rtcmbytes == 0)) {
+ ssize_t rtcmbytes =
+ read(context->dsock, context->rtcmbuf, sizeof(context->rtcmbuf));
+ if ((rtcmbytes == -1 && errno != EAGAIN) || (rtcmbytes == 0)) {
(void)shutdown(context->dsock, SHUT_RDWR);
(void)close(context->dsock);
+ context->rtcmbytes = 0;
return -1;
- } else
+ } else {
+ context->rtcmbytes = (size_t) rtcmbytes;
context->rtcmtime = timestamp();
+ }
}
return 0;
}
@@ -82,28 +87,34 @@ void netgnss_report(struct gps_device_t *session)
#endif
}
-void netgnss_autoconnect(struct gps_context_t *context, double lat, double lon)
+void netgnss_autoconnect(struct gps_context_t *context, double lat,
+ double lon)
{
if (context->netgnss_service == netgnss_dgpsip) {
dgpsip_autoconnect(context, lat, lon, DGPSIP_SERVER_LIST);
}
}
+/* *INDENT-OFF* */
void rtcm_relay(struct gps_device_t *session)
/* pass a DGNSS connection report to a session */
{
- if (session->gpsdata.gps_fd !=-1
- && session->context->rtcmbytes > -1
+ if (session->gpsdata.gps_fd != -1
+ && session->context->rtcmbytes > 0
&& session->rtcmtime < session->context->rtcmtime
&& session->device_type->rtcm_writer != NULL) {
if (session->device_type->rtcm_writer(session,
session->context->rtcmbuf,
- (size_t)session->context->rtcmbytes) == 0)
+ session->context->rtcmbytes) ==
+ 0)
gpsd_report(LOG_ERROR, "Write to RTCM sink failed\n");
else {
session->rtcmtime = timestamp();
- gpsd_report(LOG_IO, "<= DGPS: %zd bytes of RTCM relayed.\n", session->context->rtcmbytes);
+ gpsd_report(LOG_IO, "<= DGPS: %zd bytes of RTCM relayed.\n",
+ session->context->rtcmbytes);
}
}
}
+/* *INDENT-ON* */
+/* end */
diff --git a/net_ntrip.c b/net_ntrip.c
index 7702f7ff..100fe012 100644
--- a/net_ntrip.c
+++ b/net_ntrip.c
@@ -7,20 +7,20 @@
#include "gpsd_config.h"
#include <sys/types.h>
#ifndef S_SPLINT_S
- #ifdef HAVE_SYS_SOCKET_H
- #include <sys/socket.h>
- #else
- #define AF_UNSPEC 0
- #endif /* HAVE_SYS_SOCKET_H */
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#else
+#define AF_UNSPEC 0
+#endif /* HAVE_SYS_SOCKET_H */
#include <unistd.h>
#endif /* S_SPLINT_S */
#include <sys/time.h>
#include <stdio.h>
#include <math.h>
#ifndef S_SPLINT_S
- #ifdef HAVE_NETDB_H
- #include <netdb.h>
- #endif
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif
#endif /* S_SPLINT_S */
#include <string.h>
#include <errno.h>
@@ -29,15 +29,27 @@
#include "gpsd.h"
#include "bsd-base64.h"
-struct ntrip_stream_t {
+struct ntrip_stream_t
+{
char mountpoint[101];
- enum { fmt_rtcm2, fmt_rtcm2_0, fmt_rtcm2_1, fmt_rtcm2_2, fmt_rtcm2_3, fmt_rtcm3, fmt_unknown } format;
+ enum
+ {
+ fmt_rtcm2,
+ fmt_rtcm2_0,
+ fmt_rtcm2_1,
+ fmt_rtcm2_2,
+ fmt_rtcm2_3,
+ fmt_rtcm3,
+ fmt_unknown
+ } format;
int carrier;
double latitude;
double longitude;
int nmea;
- enum { cmp_enc_none, cmp_enc_unknown } compr_encryp;
- enum { auth_none, auth_basic, auth_digest, auth_unknown } authentication;
+ enum
+ { cmp_enc_none, cmp_enc_unknown } compr_encryp;
+ enum
+ { auth_none, auth_basic, auth_digest, auth_unknown } authentication;
int fee;
int bitrate;
};
@@ -55,12 +67,14 @@ struct ntrip_stream_t {
static struct ntrip_stream_t ntrip_stream;
/*@ -temptrans -mustfreefresh @*/
-static /*@null@*/char *ntrip_field_iterate(/*@null@*/char *start, /*@null@*/char *prev, const char *eol)
+static /*@null@*/ char *ntrip_field_iterate( /*@null@ */ char *start,
+ /*@null@*/ char *prev,
+ const char *eol)
{
char *s, *t, *u;
if (start)
- s = start;
+ s = start;
else {
if (!prev)
return NULL;
@@ -77,15 +91,16 @@ static /*@null@*/char *ntrip_field_iterate(/*@null@*/char *start, /*@null@*/char
if ((t = strstr(t, ";")))
*t = '\0';
- gpsd_report(LOG_RAW, "Next Ntrip source table field %s\n", s);
+ gpsd_report(LOG_RAW, "Next Ntrip source table field %s\n", s);
return s;
}
+
/*@ +temptrans +mustfreefresh @*/
/*@ -mustfreefresh @*/
static void ntrip_str_parse(char *str, size_t len,
- /*@out@*/struct ntrip_stream_t *hold)
+ /*@out@*/ struct ntrip_stream_t *hold)
{
char *s, *eol = str + len;
@@ -98,17 +113,17 @@ static void ntrip_str_parse(char *str, size_t len,
s = ntrip_field_iterate(NULL, s, eol);
/* <format> */
if ((s = ntrip_field_iterate(NULL, s, eol))) {
- if (strcasecmp("RTCM 2", s)==0)
+ if (strcasecmp("RTCM 2", s) == 0)
hold->format = fmt_rtcm2;
- else if (strcasecmp("RTCM 2.0", s)==0)
+ else if (strcasecmp("RTCM 2.0", s) == 0)
hold->format = fmt_rtcm2_0;
- else if (strcasecmp("RTCM 2.1", s)==0)
+ else if (strcasecmp("RTCM 2.1", s) == 0)
hold->format = fmt_rtcm2_1;
- else if (strcasecmp("RTCM 2.2", s)==0)
+ else if (strcasecmp("RTCM 2.2", s) == 0)
hold->format = fmt_rtcm2_2;
- else if (strcasecmp("RTCM 2.3", s)==0)
+ else if (strcasecmp("RTCM 2.3", s) == 0)
hold->format = fmt_rtcm2_3;
- else if (strcasecmp("RTCM 3.0", s)==0)
+ else if (strcasecmp("RTCM 3.0", s) == 0)
hold->format = fmt_rtcm3;
else
hold->format = fmt_unknown;
@@ -142,18 +157,18 @@ static void ntrip_str_parse(char *str, size_t len,
s = ntrip_field_iterate(NULL, s, eol);
/* <compr-encryp> */
if ((s = ntrip_field_iterate(NULL, s, eol))) {
- if (strcasecmp("none", s)==0)
+ if (strcasecmp("none", s) == 0)
hold->compr_encryp = cmp_enc_none;
else
hold->compr_encryp = cmp_enc_unknown;
}
/* <authentication> */
if ((s = ntrip_field_iterate(NULL, s, eol))) {
- if (strcasecmp("N", s)==0)
+ if (strcasecmp("N", s) == 0)
hold->authentication = auth_none;
- else if (strcasecmp("B", s)==0)
+ else if (strcasecmp("B", s) == 0)
hold->authentication = auth_basic;
- else if (strcasecmp("D", s)==0)
+ else if (strcasecmp("D", s) == 0)
hold->authentication = auth_digest;
else
hold->authentication = auth_unknown;
@@ -169,6 +184,7 @@ static void ntrip_str_parse(char *str, size_t len,
/* ...<misc> */
while ((s = ntrip_field_iterate(NULL, s, eol)));
}
+
/*@ +mustfreefresh @*/
static int ntrip_sourcetable_parse(int fd, char *buf, ssize_t blen,
@@ -185,9 +201,9 @@ static int ntrip_sourcetable_parse(int fd, char *buf, ssize_t blen,
char *eol;
ssize_t rlen;
- memset(&buf[len], 0, (size_t)(blen - len));
+ memset(&buf[len], 0, (size_t) (blen - len));
- if ((rlen = recv(fd, &buf[len], (size_t)(blen - 1 - len), 0)) == -1) {
+ if ((rlen = recv(fd, &buf[len], (size_t) (blen - 1 - len), 0)) == -1) {
if (errno == EINTR)
continue;
return -1;
@@ -202,22 +218,26 @@ static int ntrip_sourcetable_parse(int fd, char *buf, ssize_t blen,
if (!srctbl) {
/* parse SOURCETABLE */
- if (strncmp(line,NTRIP_SOURCETABLE,strlen(NTRIP_SOURCETABLE))==0) {
+ if (strncmp(line, NTRIP_SOURCETABLE, strlen(NTRIP_SOURCETABLE)) ==
+ 0) {
srctbl = true;
- llen = (ssize_t)strlen(NTRIP_SOURCETABLE);
+ llen = (ssize_t) strlen(NTRIP_SOURCETABLE);
line += llen;
len -= llen;
} else {
- gpsd_report(LOG_WARN, "Received unexpexted Ntrip reply %s.\n", buf);
+ gpsd_report(LOG_WARN, "Received unexpexted Ntrip reply %s.\n",
+ buf);
return -1;
}
}
if (!srctbl)
- return -1;
+ return -1;
while (len > 0) {
/* parse ENDSOURCETABLE */
- if (strncmp(line, NTRIP_ENDSOURCETABLE, strlen(NTRIP_ENDSOURCETABLE))==0)
+ if (strncmp
+ (line, NTRIP_ENDSOURCETABLE,
+ strlen(NTRIP_ENDSOURCETABLE)) == 0)
goto done;
if (!(eol = strstr(line, NTRIP_BR)))
@@ -226,14 +246,15 @@ static int ntrip_sourcetable_parse(int fd, char *buf, ssize_t blen,
gpsd_report(LOG_IO, "next Ntrip source table line %s\n", line);
*eol = '\0';
- llen = (ssize_t)(eol - line);
+ llen = (ssize_t) (eol - line);
/* todo: parse headers */
/* parse STR */
- if (strncmp(line, NTRIP_STR, strlen(NTRIP_STR))==0) {
- ntrip_str_parse(line + strlen(NTRIP_STR), (size_t)(llen - strlen(NTRIP_STR)), &hold);
- if (stream!=NULL && strcmp(stream, hold.mountpoint)==0) {
+ if (strncmp(line, NTRIP_STR, strlen(NTRIP_STR)) == 0) {
+ ntrip_str_parse(line + strlen(NTRIP_STR),
+ (size_t) (llen - strlen(NTRIP_STR)), &hold);
+ if (stream != NULL && strcmp(stream, hold.mountpoint) == 0) {
/* todo: support for RTCM 3.0, SBAS (WAAS, EGNOS), ... */
if (hold.format == fmt_unknown) {
gpsd_report(LOG_ERROR,
@@ -260,7 +281,7 @@ static int ntrip_sourcetable_parse(int fd, char *buf, ssize_t blen,
match = true;
}
/* todo: compare stream location to own location to
- find nearest stream if user hasn't provided one */
+ * find nearest stream if user hasn't provided one */
}
/* todo: parse CAS */
/* else if (strncmp(line, NTRIP_CAS, strlen(NTRIP_CAS))==0); */
@@ -271,51 +292,52 @@ static int ntrip_sourcetable_parse(int fd, char *buf, ssize_t blen,
llen += strlen(NTRIP_BR);
line += llen;
len -= llen;
- gpsd_report(LOG_RAW, "Remaining Ntrip source table buffer %zd %s\n", len, line);
+ gpsd_report(LOG_RAW,
+ "Remaining Ntrip source table buffer %zd %s\n", len,
+ line);
}
/* message too big to fit into buffer */
if (len == blen - 1)
return -1;
if (len > 0)
- memcpy(buf, &buf[rlen-len], (size_t)len);
+ memcpy(buf, &buf[rlen - len], (size_t) len);
}
-done:
+ done:
return match ? 0 : -1;
}
static int ntrip_stream_probe(const char *caster,
const char *port,
- const char *stream,
- struct ntrip_stream_t *keep)
+ const char *stream, struct ntrip_stream_t *keep)
{
int ret;
socket_t dsock;
char buf[BUFSIZ];
if ((dsock = netlib_connectsock(AF_UNSPEC, caster, port, "tcp")) == -1) {
- printf("ntrip stream connect error %d\n", dsock);
- return -1;
+ printf("ntrip stream connect error %d\n", dsock);
+ return -1;
}
(void)snprintf(buf, sizeof(buf),
"GET / HTTP/1.1\r\n"
"User-Agent: NTRIP gpsd/%s\r\n"
- "Connection: close\r\n"
- "\r\n",
- VERSION);
- if (write(dsock, buf, strlen(buf)) != (ssize_t)strlen(buf)) {
- printf("ntrip stream write error %d\n", dsock);
- return -1;
+ "Connection: close\r\n" "\r\n", VERSION);
+ if (write(dsock, buf, strlen(buf)) != (ssize_t) strlen(buf)) {
+ printf("ntrip stream write error %d\n", dsock);
+ return -1;
}
- ret = ntrip_sourcetable_parse(dsock, buf, (ssize_t)sizeof(buf), stream, keep);
+ ret =
+ ntrip_sourcetable_parse(dsock, buf, (ssize_t) sizeof(buf), stream,
+ keep);
(void)close(dsock);
return ret;
}
static int ntrip_auth_encode(const struct ntrip_stream_t *stream,
- const char *auth,
- /*@out@*/char buf[],
+ const char *auth,
+ /*@out@*/ char buf[],
size_t size)
{
memset(buf, 0, size);
@@ -326,7 +348,9 @@ static int ntrip_auth_encode(const struct ntrip_stream_t *stream,
if (!auth)
return -1;
memset(authenc, 0, sizeof(authenc));
- if (b64_ntop((unsigned char *) auth, strlen(auth), authenc, sizeof(authenc) - 1) < 0)
+ if (b64_ntop
+ ((unsigned char *)auth, strlen(auth), authenc,
+ sizeof(authenc) - 1) < 0)
return -1;
(void)snprintf(buf, size - 1, "Authorization: Basic %s\r\n", authenc);
} else {
@@ -335,11 +359,11 @@ static int ntrip_auth_encode(const struct ntrip_stream_t *stream,
return 0;
}
-/*@ -nullpass @*/ /* work around a splint bug */
-static int ntrip_stream_open(const char *caster,
- const char *port,
- /*@null@*/const char *auth,
- struct gps_context_t *context,
+/* *INDENT-OFF* */
+/*@ -nullpass @*//* work around a splint bug */
+static int ntrip_stream_open(const char *caster, const char *port,
+ /*@null@*/ const char *auth,
+ struct gps_context_t *context,
struct ntrip_stream_t *stream)
{
char buf[BUFSIZ];
@@ -348,10 +372,11 @@ static int ntrip_stream_open(const char *caster,
if (ntrip_auth_encode(stream, auth, authstr, sizeof(authstr)) < 0) {
gpsd_report(LOG_ERROR, "User-ID and password needed for %s:%s/%s\n",
- caster, port, stream->mountpoint);
+ caster, port, stream->mountpoint);
return -1;
}
- if ((context->dsock = netlib_connectsock(AF_UNSPEC, caster, port, "tcp")) < 0)
+ if ((context->dsock =
+ netlib_connectsock(AF_UNSPEC, caster, port, "tcp")) < 0)
return -1;
(void)snprintf(buf, sizeof(buf),
@@ -360,11 +385,10 @@ static int ntrip_stream_open(const char *caster,
"Accept: rtk/rtcm, dgps/rtcm\r\n"
"%s"
"Connection: close\r\n"
- "\r\n",
- stream->mountpoint, VERSION, authstr);
- if (write(context->dsock, buf, strlen(buf)) != (ssize_t)strlen(buf)) {
- printf("ntrip stream write error on %d\n", context->dsock);
- return -1;
+ "\r\n", stream->mountpoint, VERSION, authstr);
+ if (write(context->dsock, buf, strlen(buf)) != (ssize_t) strlen(buf)) {
+ printf("ntrip stream write error on %d\n", context->dsock);
+ return -1;
}
memset(buf, 0, sizeof(buf));
@@ -373,20 +397,23 @@ static int ntrip_stream_open(const char *caster,
/* parse 401 Unauthorized */
if (strstr(buf, NTRIP_UNAUTH)) {
- gpsd_report(LOG_ERROR, "%s not authorized for Ntrip stream %s:%s/%s\n",
- auth, caster, port, stream->mountpoint);
+ gpsd_report(LOG_ERROR,
+ "%s not authorized for Ntrip stream %s:%s/%s\n", auth,
+ caster, port, stream->mountpoint);
goto close;
}
/* parse SOURCETABLE */
if (strstr(buf, NTRIP_SOURCETABLE)) {
- gpsd_report(LOG_ERROR, "Broadcaster doesn't recognize Ntrip stream %s:%s/%s\n",
- caster, port, stream->mountpoint);
+ gpsd_report(LOG_ERROR,
+ "Broadcaster doesn't recognize Ntrip stream %s:%s/%s\n",
+ caster, port, stream->mountpoint);
goto close;
}
/* parse ICY 200 OK */
if (!strstr(buf, NTRIP_ICY)) {
- gpsd_report(LOG_ERROR, "Unknown reply %s from Ntrip service %s:%s/%s\n",
- buf, caster, port, stream->mountpoint);
+ gpsd_report(LOG_ERROR,
+ "Unknown reply %s from Ntrip service %s:%s/%s\n", buf,
+ caster, port, stream->mountpoint);
goto close;
}
opts = fcntl(context->dsock, F_GETFL);
@@ -399,10 +426,12 @@ static int ntrip_stream_open(const char *caster,
context->netgnss_privdata = stream;
#endif
return context->dsock;
-close:
+ close:
(void)close(context->dsock);
return -1;
}
+/* *INDENT-ON* */
+
/*@ +nullpass @*/
/*@ -branchstate @*/
@@ -417,12 +446,13 @@ int ntrip_open(struct gps_context_t *context, char *caster)
/*@ -boolops @*/
if ((amp = strchr(caster, '@')) != NULL) {
- if (((colon = strchr(caster, ':')) != NULL) && colon < amp) {
+ if (((colon = strchr(caster, ':')) != NULL) && colon < amp) {
auth = caster;
*amp = '\0';
caster = amp + 1;
} else {
- gpsd_report(LOG_ERROR, "can't extract user-ID and password from %s\n",
+ gpsd_report(LOG_ERROR,
+ "can't extract user-ID and password from %s\n",
caster);
return -1;
}
@@ -433,7 +463,8 @@ int ntrip_open(struct gps_context_t *context, char *caster)
stream = slash + 1;
} else {
/* todo: add autoconnect like in dgpsip.c */
- gpsd_report(LOG_ERROR, "can't extract Ntrip stream from %s\n", caster);
+ gpsd_report(LOG_ERROR, "can't extract Ntrip stream from %s\n",
+ caster);
return -1;
}
if ((colon = strchr(caster, ':')) != NULL) {
@@ -446,19 +477,22 @@ int ntrip_open(struct gps_context_t *context, char *caster)
port = DEFAULT_RTCM_PORT;
}
if (ntrip_stream_probe(caster, port, stream, &ntrip_stream)) {
- gpsd_report(LOG_ERROR, "unable to probe for data about stream %s:%s/%s\n",
+ gpsd_report(LOG_ERROR,
+ "unable to probe for data about stream %s:%s/%s\n",
caster, port, stream);
return -1;
}
ret = ntrip_stream_open(caster, port, auth, context, &ntrip_stream);
if (ret >= 0)
- gpsd_report(LOG_PROG,"connection to Ntrip broadcaster %s established.\n",
+ gpsd_report(LOG_PROG,
+ "connection to Ntrip broadcaster %s established.\n",
caster);
else
gpsd_report(LOG_ERROR, "can't connect to Ntrip stream %s:%s/%s.\n",
caster, port, stream);
return ret;
}
+
/*@ +branchstate @*/
void ntrip_report(struct gps_device_t *session)
@@ -469,13 +503,14 @@ void ntrip_report(struct gps_device_t *session)
* 10 is an arbitrary number, the point is to have gotten several good
* fixes before reporting usage to our Ntrip caster.
*/
- if (stream!=NULL && stream->nmea!=0
+ if (stream != NULL && stream->nmea != 0
&& session->context->fixcnt > 10 && !session->context->sentdgps) {
session->context->sentdgps = true;
if (session->context->dsock > -1) {
char buf[BUFSIZ];
gpsd_position_fix_dump(session, buf, sizeof(buf));
- if (write(session->context->dsock, buf, strlen(buf)) == (ssize_t)strlen(buf))
+ if (write(session->context->dsock, buf, strlen(buf)) ==
+ (ssize_t) strlen(buf))
gpsd_report(LOG_IO, "=> dgps %s", buf);
else
gpsd_report(LOG_IO, "ntrip report write failed");
diff --git a/netlib.c b/netlib.c
index 1571a53d..f9a854be 100644
--- a/netlib.c
+++ b/netlib.c
@@ -21,12 +21,12 @@
#endif
#endif /* S_SPLINT_S */
#ifndef S_SPLINT_S
- #ifdef HAVE_NETDB_H
- #include <netdb.h>
- #endif /* HAVE_NETDB_H */
- #ifdef HAVE_ARPA_INET_H
- #include <arpa/inet.h>
- #endif /* HAVE_ARPA_INET_H */
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif /* HAVE_NETDB_H */
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h>
+#endif /* HAVE_ARPA_INET_H */
#endif /* S_SPLINT_S */
#include <errno.h>
#include <stdlib.h>
@@ -43,7 +43,8 @@
#endif
/*@-mustfreefresh -usedef@*/
-socket_t netlib_connectsock(int af, const char *host, const char *service, const char *protocol)
+socket_t netlib_connectsock(int af, const char *host, const char *service,
+ const char *protocol)
{
struct protoent *ppe;
struct addrinfo hints;
@@ -66,8 +67,8 @@ socket_t netlib_connectsock(int af, const char *host, const char *service, const
hints.ai_family = af;
hints.ai_socktype = type;
hints.ai_protocol = proto;
-#ifndef S_SPLINT_S
- if((ret = getaddrinfo(host, service, &hints, &result))) {
+#ifndef S_SPLINT_S
+ if ((ret = getaddrinfo(host, service, &hints, &result))) {
return NL_NOHOST;
}
#endif /* S_SPLINT_S */
@@ -85,21 +86,24 @@ socket_t netlib_connectsock(int af, const char *host, const char *service, const
/*@-type@*/
for (rp = result; rp != NULL; rp = rp->ai_next) {
ret = NL_NOCONNECT;
- if((s = socket(rp->ai_family, rp->ai_socktype,
- rp->ai_protocol)) < 0)
+ if ((s = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol)) < 0)
ret = NL_NOSOCK;
- else if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one))==-1)
+ else if (setsockopt
+ (s, SOL_SOCKET, SO_REUSEADDR, (char *)&one,
+ sizeof(one)) == -1)
ret = NL_NOSOCKOPT;
else if (connect(s, rp->ai_addr, rp->ai_addrlen) == 0) {
ret = 0;
break;
}
- if (s > 0)
+ if (s > 0) {
+ gpsd_report(LOG_SPIN, "close(%d) in netlib_connectsock()\n", s);
(void)close(s);
+ }
}
/*@+type@*/
-#ifndef S_SPLINT_S
+#ifndef S_SPLINT_S
freeaddrinfo(result);
#endif /* S_SPLINT_S */
if (ret)
@@ -107,39 +111,50 @@ socket_t netlib_connectsock(int af, const char *host, const char *service, const
#ifdef IPTOS_LOWDELAY
{
- int opt = IPTOS_LOWDELAY;
- /*@ -unrecog @*/
- (void)setsockopt(s, IPPROTO_IP, IP_TOS, &opt, sizeof opt);
- /*@ +unrecog @*/
+ int opt = IPTOS_LOWDELAY;
+ /*@ -unrecog @*/
+ (void)setsockopt(s, IPPROTO_IP, IP_TOS, &opt, sizeof opt);
+ /*@ +unrecog @*/
}
#endif
#ifdef TCP_NODELAY
if (type == SOCK_STREAM)
setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char *)&one, sizeof one);
#endif
+
+ gpsd_report(LOG_SPIN, "netlib_connectsock() returns socket on fd %d\n",
+ s);
return s;
/*@ +type +mustfreefresh @*/
}
+
/*@+mustfreefresh +usedef@*/
char /*@observer@*/ *netlib_errstr(const int err)
{
switch (err) {
- case NL_NOSERVICE: return "can't get service entry";
- case NL_NOHOST: return "can't get host entry";
- case NL_NOPROTO: return "can't get protocol entry";
- case NL_NOSOCK: return "can't create socket";
- case NL_NOSOCKOPT: return "error SETSOCKOPT SO_REUSEADDR";
- case NL_NOCONNECT: return "can't connect to host/port pair";
- default: return "unknown error";
+ case NL_NOSERVICE:
+ return "can't get service entry";
+ case NL_NOHOST:
+ return "can't get host entry";
+ case NL_NOPROTO:
+ return "can't get protocol entry";
+ case NL_NOSOCK:
+ return "can't create socket";
+ case NL_NOSOCKOPT:
+ return "error SETSOCKOPT SO_REUSEADDR";
+ case NL_NOCONNECT:
+ return "can't connect to host/port pair";
+ default:
+ return "unknown error";
}
}
char *netlib_sock2ip(int fd)
{
sockaddr_t fsin;
- socklen_t alen = (socklen_t)sizeof(fsin);
- /*@i1@*/static char ip[INET6_ADDRSTRLEN];
+ socklen_t alen = (socklen_t) sizeof(fsin);
+ /*@i1@*/ static char ip[INET6_ADDRSTRLEN];
int r;
r = getpeername(fd, &(fsin.sa), &alen);
@@ -148,24 +163,25 @@ char *netlib_sock2ip(int fd)
switch (fsin.sa.sa_family) {
case AF_INET:
r = !inet_ntop(fsin.sa_in.sin_family, &(fsin.sa_in.sin_addr),
- ip, sizeof(ip));
+ ip, sizeof(ip));
break;
#ifdef IPV6_ENABLE
case AF_INET6:
r = !inet_ntop(fsin.sa_in6.sin6_family, &(fsin.sa_in6.sin6_addr),
- ip, sizeof(ip));
+ ip, sizeof(ip));
break;
#endif
default:
gpsd_report(LOG_ERROR, "Unhandled address family %d in %s\n",
- fsin.sa.sa_family, __FUNCTION__);
- (void)strlcpy(ip,"<unknown AF>", sizeof(ip));
+ fsin.sa.sa_family, __FUNCTION__);
+ (void)strlcpy(ip, "<unknown AF>", sizeof(ip));
return ip;
}
}
- if (r != 0){
- gpsd_report(LOG_INF, "getpeername() = %d, error = %s (%d)\n", r, strerror(errno), errno);
- (void)strlcpy(ip,"<unknown>", sizeof(ip));
+ if (r != 0) {
+ gpsd_report(LOG_INF, "getpeername() = %d, error = %s (%d)\n", r,
+ strerror(errno), errno);
+ (void)strlcpy(ip, "<unknown>", sizeof(ip));
}
/*@ +branchstate +unrecog @*/
return ip;
diff --git a/ntpshm.c b/ntpshm.c
index 57bcdd6b..980064d0 100644
--- a/ntpshm.c
+++ b/ntpshm.c
@@ -26,37 +26,38 @@
#endif
#ifdef HAVE_SYS_IPC_H
- #include <sys/ipc.h>
+#include <sys/ipc.h>
#endif /* HAVE_SYS_IPC_H */
#ifdef HAVE_SYS_SHM_H
- #include <sys/shm.h>
+#include <sys/shm.h>
#endif /* HAVE_SYS_SHM_H */
-#define PPS_MAX_OFFSET 100000 /* microseconds the PPS can 'pull' */
-#define PUT_MAX_OFFSET 1000000 /* microseconds for lost lock */
+#define PPS_MAX_OFFSET 100000 /* microseconds the PPS can 'pull' */
+#define PUT_MAX_OFFSET 1000000 /* microseconds for lost lock */
#define NTPD_BASE 0x4e545030 /* "NTP0" */
-#define SHM_UNIT 0 /* SHM driver unit number (0..3) */
-
-struct shmTime {
- int mode; /* 0 - if valid set
- * use values,
- * clear valid
- * 1 - if valid set
- * if count before and after read of values is equal,
- * use values
- * clear valid
- */
- int count;
+#define SHM_UNIT 0 /* SHM driver unit number (0..3) */
+
+struct shmTime
+{
+ int mode; /* 0 - if valid set
+ * use values,
+ * clear valid
+ * 1 - if valid set
+ * if count before and after read of values is equal,
+ * use values
+ * clear valid
+ */
+ int count;
time_t clockTimeStampSec;
- int clockTimeStampUSec;
+ int clockTimeStampUSec;
time_t receiveTimeStampSec;
- int receiveTimeStampUSec;
- int leap;
- int precision;
- int nsamples;
- int valid;
- int pad[10];
+ int receiveTimeStampUSec;
+ int leap;
+ int precision;
+ int nsamples;
+ int valid;
+ int pad[10];
};
/* Note: you can start gpsd as non-root, and have it work with ntpd.
@@ -120,29 +121,31 @@ static /*@null@*/ struct shmTime *getShmTime(int unit)
int shmid;
unsigned int perms;
// set the SHM perms the way ntpd does
- if ( unit < 2 ) {
- // we are root, be careful
+ if (unit < 2) {
+ // we are root, be careful
perms = 0600;
} else {
- // we are not root, try to work anyway
+ // we are not root, try to work anyway
perms = 0666;
}
- shmid=shmget ((key_t)(NTPD_BASE+unit),
- sizeof (struct shmTime), (int)(IPC_CREAT|perms));
+ shmid = shmget((key_t) (NTPD_BASE + unit),
+ sizeof(struct shmTime), (int)(IPC_CREAT | perms));
if (shmid == -1) {
gpsd_report(LOG_ERROR, "NTPD shmget(%ld, %zd, %o) fail: %s\n",
- (long int)(NTPD_BASE+unit), sizeof (struct shmTime), (int)perms, strerror(errno));
+ (long int)(NTPD_BASE + unit), sizeof(struct shmTime),
+ (int)perms, strerror(errno));
return NULL;
} else {
- struct shmTime *p=(struct shmTime *)shmat (shmid, 0, 0);
+ struct shmTime *p = (struct shmTime *)shmat(shmid, 0, 0);
/*@ -mustfreefresh */
if ((int)(long)p == -1) {
- gpsd_report(LOG_ERROR, "NTPD shmat failed: %s\n", strerror(errno));
+ gpsd_report(LOG_ERROR, "NTPD shmat failed: %s\n",
+ strerror(errno));
return NULL;
}
- gpsd_report(LOG_PROG, "NTPD shmat(%d,0,0) succeeded, segment %d\n",
- shmid, unit);
+ gpsd_report(LOG_PROG, "NTPD shmat(%d,0,0) succeeded, segment %d\n",
+ shmid, unit);
return p;
/*@ +mustfreefresh */
}
@@ -156,14 +159,14 @@ void ntpshm_init(struct gps_context_t *context, bool enablepps)
for (i = 0; i < NTPSHMSEGS; i++) {
// Only grab the first two when running as root.
- if ( 2 <= i || 0 == getuid()) {
+ if (2 <= i || 0 == getuid()) {
context->shmTime[i] = getShmTime(i);
}
}
- memset(context->shmTimeInuse,0,sizeof(context->shmTimeInuse));
+ memset(context->shmTimeInuse, 0, sizeof(context->shmTimeInuse));
# ifdef PPS_ENABLE
context->shmTimePPS = enablepps;
-# endif /* PPS_ENABLE */
+# endif /* PPS_ENABLE */
context->enable_ntpshm = true;
}
@@ -176,9 +179,9 @@ int ntpshm_alloc(struct gps_context_t *context)
if (context->shmTime[i] != NULL && !context->shmTimeInuse[i]) {
context->shmTimeInuse[i] = true;
- memset((void *)context->shmTime[i],0,sizeof(struct shmTime));
+ memset((void *)context->shmTime[i], 0, sizeof(struct shmTime));
context->shmTime[i]->mode = 1;
- context->shmTime[i]->precision = -1; /* initially 0.5 sec */
+ context->shmTime[i]->precision = -1; /* initially 0.5 sec */
context->shmTime[i]->nsamples = 3; /* stages of median filter */
return i;
@@ -187,7 +190,7 @@ int ntpshm_alloc(struct gps_context_t *context)
return -1;
}
-bool ntpshm_free(struct gps_context_t *context, int segment)
+bool ntpshm_free(struct gps_context_t * context, int segment)
/* free NTP SHM segment */
{
if (segment < 0 || segment >= NTPSHMSEGS)
@@ -203,18 +206,21 @@ int ntpshm_put(struct gps_device_t *session, double fixtime, double fudge)
{
struct shmTime *shmTime = NULL;
struct timeval tv;
- double seconds,microseconds;
+ double seconds, microseconds;
+ // gpsd_report(LOG_PROG, "NTP: doing ntpshm_put(,%g, %g)\n", fixtime, fudge);
if (session->shmindex < 0 ||
- (shmTime = session->context->shmTime[session->shmindex]) == NULL)
+ (shmTime = session->context->shmTime[session->shmindex]) == NULL) {
+ gpsd_report(LOG_RAW, "NTPD missing shm\n");
return 0;
+ }
- (void)gettimeofday(&tv,NULL);
+ (void)gettimeofday(&tv, NULL);
fixtime += fudge;
- microseconds = 1000000.0 * modf(fixtime,&seconds);
- if ( shmTime->clockTimeStampSec == (time_t)seconds) {
+ microseconds = 1000000.0 * modf(fixtime, &seconds);
+ if (shmTime->clockTimeStampSec == (time_t) seconds) {
gpsd_report(LOG_RAW, "NTPD ntpshm_put: skipping duplicate second\n");
- return 0;
+ return 0;
}
/* we use the shmTime mode 1 protocol
@@ -233,22 +239,22 @@ int ntpshm_put(struct gps_device_t *session, double fixtime, double fudge)
*/
shmTime->valid = 0;
shmTime->count++;
- shmTime->clockTimeStampSec = (time_t)seconds;
+ shmTime->clockTimeStampSec = (time_t) seconds;
shmTime->clockTimeStampUSec = (int)microseconds;
- shmTime->receiveTimeStampSec = (time_t)tv.tv_sec;
+ shmTime->receiveTimeStampSec = (time_t) tv.tv_sec;
shmTime->receiveTimeStampUSec = (int)tv.tv_usec;
/* setting the precision here does not seem to help anything, too
- hard to calculate properly anyway. Let ntpd figure it out.
- Any NMEA will be about -1 or -2.
- Garmin GPS-18/USB is around -6 or -7.
- */
+ * hard to calculate properly anyway. Let ntpd figure it out.
+ * Any NMEA will be about -1 or -2.
+ * Garmin GPS-18/USB is around -6 or -7.
+ */
shmTime->count++;
shmTime->valid = 1;
- gpsd_report(LOG_RAW,
- "NTPD ntpshm_put: Clock: %lu.%06lu @ %lu.%06lu, fudge: %0.3f\n"
- , (unsigned long)seconds , (unsigned long)microseconds
- , (unsigned long)tv.tv_sec, (unsigned long)tv.tv_usec, fudge);
+ gpsd_report(LOG_RAW,
+ "NTPD ntpshm_put: Clock: %lu.%06lu @ %lu.%06lu, fudge: %0.3f\n",
+ (unsigned long)seconds, (unsigned long)microseconds,
+ (unsigned long)tv.tv_sec, (unsigned long)tv.tv_usec, fudge);
return 1;
}
@@ -266,7 +272,7 @@ int ntpshm_pps(struct gps_device_t *session, struct timeval *tv)
double offset;
long l_offset;
- if ( 0 > session->shmindex || 0 > session->shmTimeP ||
+ if (0 > session->shmindex || 0 > session->shmTimeP ||
(shmTime = session->context->shmTime[session->shmindex]) == NULL ||
(shmTimeP = session->context->shmTime[session->shmTimeP]) == NULL)
return 0;
@@ -277,7 +283,7 @@ int ntpshm_pps(struct gps_device_t *session, struct timeval *tv)
/* FIXME, does not handle 5Hz yet */
-#ifdef S_SPLINT_S /* avoids an internal error in splint 3.1.1 */
+#ifdef S_SPLINT_S /* avoids an internal error in splint 3.1.1 */
l_offset = 0;
#else
l_offset = tv->tv_sec - shmTime->receiveTimeStampSec;
@@ -285,16 +291,16 @@ int ntpshm_pps(struct gps_device_t *session, struct timeval *tv)
/*@ -ignorequals @*/
l_offset *= 1000000;
l_offset += tv->tv_usec - shmTime->receiveTimeStampUSec;
- if ( 0 > l_offset || 1000000 < l_offset ) {
- gpsd_report(LOG_RAW, "PPS ntpshm_pps: no current GPS seconds: %ld\n"
- , (long)l_offset);
+ if (0 > l_offset || 1000000 < l_offset) {
+ gpsd_report(LOG_RAW, "PPS ntpshm_pps: no current GPS seconds: %ld\n",
+ (long)l_offset);
return -1;
}
/*@+relaxtypes@*/
seconds = shmTime->clockTimeStampSec + 1;
offset = fabs((tv->tv_sec - seconds)
- +((double)(tv->tv_usec - 0)/1000000.0));
+ + ((double)(tv->tv_usec - 0) / 1000000.0));
/*@-relaxtypes@*/
@@ -316,7 +322,7 @@ int ntpshm_pps(struct gps_device_t *session, struct timeval *tv)
shmTimeP->count++;
shmTimeP->clockTimeStampSec = seconds;
shmTimeP->clockTimeStampUSec = (int)microseconds;
- shmTimeP->receiveTimeStampSec = (time_t)tv->tv_sec;
+ shmTimeP->receiveTimeStampSec = (time_t) tv->tv_sec;
shmTimeP->receiveTimeStampUSec = (int)tv->tv_usec;
/* precision is a placebo, ntpd does not really use it
* real world accuracty is around 16uS, thus -16 precision */
@@ -327,11 +333,10 @@ int ntpshm_pps(struct gps_device_t *session, struct timeval *tv)
/* this is more an offset jitter/dispersion than precision,
* but still useful for debug */
precision = offset != 0 ? (int)(ceil(log(offset) / M_LN2)) : -20;
- gpsd_report(LOG_RAW
- , "PPS ntpshm_pps %lu.%03lu @ %lu.%06lu, preci %d\n"
- , (unsigned long)seconds, (unsigned long)microseconds/1000
- , (unsigned long)tv->tv_sec, (unsigned long)tv->tv_usec
- , precision);
+ gpsd_report(LOG_RAW, "PPS ntpshm_pps %lu.%03lu @ %lu.%06lu, preci %d\n",
+ (unsigned long)seconds, (unsigned long)microseconds / 1000,
+ (unsigned long)tv->tv_sec, (unsigned long)tv->tv_usec,
+ precision);
return 1;
}
#endif /* PPS_ENABLE */
diff --git a/packet.c b/packet.c
index 7474350a..d6e0aa56 100644
--- a/packet.c
+++ b/packet.c
@@ -38,12 +38,12 @@ PERMISSIONS
#include <string.h>
#include <errno.h>
#ifndef S_SPLINT_S
- #ifdef HAVE_NETINET_IN_H
- #include <netinet/in.h> /* for htons() */
- #endif /* HAVE_NETNET_IN_H */
- #ifdef HAVE_ARPA_INET_H
- #include <arpa/inet.h> /* for htons() */
- #endif /* HAVE_ARPA_INET_H */
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h> /* for htons() */
+#endif /* HAVE_NETNET_IN_H */
+#ifdef HAVE_ARPA_INET_H
+#include <arpa/inet.h> /* for htons() */
+#endif /* HAVE_ARPA_INET_H */
#endif /* S_SPLINT_S */
#include "bits.h"
@@ -101,7 +101,8 @@ PERMISSIONS
*
*/
-enum {
+enum
+{
#include "packet_states.h"
};
@@ -110,18 +111,16 @@ enum {
#define STX (unsigned char)0x02
#define ETX (unsigned char)0x03
-static void nextstate(struct gps_packet_t *lexer,
- unsigned char c)
+static void nextstate(struct gps_packet_t *lexer, unsigned char c)
{
#ifdef RTCM104V2_ENABLE
- enum isgpsstat_t isgpsstat;
+ enum isgpsstat_t isgpsstat;
#endif /* RTCM104V2_ENABLE */
#ifdef SUPERSTAR2_ENABLE
static unsigned char ctmp;
#endif /* SUPERSTAR2_ENABLE */
/*@ +charint -casebreak @*/
- switch(lexer->state)
- {
+ switch (lexer->state) {
case GROUND_STATE:
if (c == '#') {
lexer->state = COMMENT_BODY;
@@ -286,32 +285,32 @@ static void nextstate(struct gps_packet_t *lexer,
case AT1_LEADER:
switch (c) {
#ifdef ONCORE_ENABLE
- case '@':
- lexer->state = ONCORE_AT2;
- break;
+ case '@':
+ lexer->state = ONCORE_AT2;
+ break;
#endif /* ONCORE_ENABLE */
#ifdef TNT_ENABLE
- case '*':
- /* TNT has similar structure like NMEA packet, '*' before optional checksum ends the packet */
- /* '*' cannot be received from GARMIN working in TEXT mode, use this diference for selection */
- /* this is not GARMIN TEXT packet, could be TNT */
- lexer->state = NMEA_LEADER_END;
- break;
+ case '*':
+ /* TNT has similar structure like NMEA packet, '*' before optional checksum ends the packet */
+ /* '*' cannot be received from GARMIN working in TEXT mode, use this diference for selection */
+ /* this is not GARMIN TEXT packet, could be TNT */
+ lexer->state = NMEA_LEADER_END;
+ break;
#endif /* TNT_ENABLE */
#if defined(GARMINTXT_ENABLE)
- case '\r':
- /* stay in this state, next character should be '\n' */
- /* in the theory we can stop search here and don't wait for '\n' */
- lexer->state = AT1_LEADER;
- break;
- case '\n':
- /* end of packet found */
- lexer->state = GTXT_RECOGNIZED;
- break;
+ case '\r':
+ /* stay in this state, next character should be '\n' */
+ /* in the theory we can stop search here and don't wait for '\n' */
+ lexer->state = AT1_LEADER;
+ break;
+ case '\n':
+ /* end of packet found */
+ lexer->state = GTXT_RECOGNIZED;
+ break;
#endif /* GARMINTXT_ENABLE */
- default:
- if (!isprint(c))
- lexer->state = GROUND_STATE;
+ default:
+ if (!isprint(c))
+ lexer->state = GROUND_STATE;
}
break;
#endif /* defined(TNT_ENABLE) || defined(GARMINTXT_ENABLE) || defined(ONCORE_ENABLE) */
@@ -347,7 +346,7 @@ static void nextstate(struct gps_packet_t *lexer,
else if (c == '!')
lexer->state = NMEA_BANG;
#ifdef UBX_ENABLE
- else if (c == 0xb5) /* LEA-5H can and will output NMEA and UBX back to back */
+ else if (c == 0xb5) /* LEA-5H can and will output NMEA and UBX back to back */
lexer->state = UBX_LEADER_1;
#endif
else
@@ -491,7 +490,7 @@ static void nextstate(struct gps_packet_t *lexer,
else
lexer->state = GROUND_STATE;
break;
- case SIRF_ACK_LEAD_2:
+ case SIRF_ACK_LEAD_2:
if (c == 'k')
lexer->state = NMEA_LEADER_END;
else
@@ -506,7 +505,7 @@ static void nextstate(struct gps_packet_t *lexer,
lexer->state = GROUND_STATE;
break;
case SIRF_LEADER_2:
- lexer->length = (size_t)(c << 8);
+ lexer->length = (size_t) (c << 8);
lexer->state = SIRF_LENGTH_1;
break;
case SIRF_LENGTH_1:
@@ -551,11 +550,11 @@ static void nextstate(struct gps_packet_t *lexer,
lexer->state = GROUND_STATE;
break;
case SUPERSTAR2_ID2:
- lexer->length = (size_t)c; /* how many data bytes follow this byte */
+ lexer->length = (size_t) c; /* how many data bytes follow this byte */
if (lexer->length)
lexer->state = SUPERSTAR2_PAYLOAD;
else
- lexer->state = SUPERSTAR2_CKSUM1; /* no data, jump to checksum */
+ lexer->state = SUPERSTAR2_CKSUM1; /* no data, jump to checksum */
break;
case SUPERSTAR2_PAYLOAD:
if (--lexer->length == 0)
@@ -584,14 +583,14 @@ static void nextstate(struct gps_packet_t *lexer,
break;
case ONCORE_ID1:
if (isalpha(c)) {
- lexer->length =
- oncore_payload_cksum_length((unsigned char) lexer->length,c);
+ lexer->length =
+ oncore_payload_cksum_length((unsigned char)lexer->length, c);
if (lexer->length != 0) {
lexer->state = ONCORE_PAYLOAD;
break;
}
}
- lexer->state = GROUND_STATE;
+ lexer->state = GROUND_STATE;
break;
case ONCORE_PAYLOAD:
if (--lexer->length == 0)
@@ -627,10 +626,12 @@ static void nextstate(struct gps_packet_t *lexer,
#if defined(TSIP_ENABLE) || defined(GARMIN_ENABLE) || defined(NAVCOM_ENABLE)
/* garmin is special case of TSIP */
/* check last because there's no checksum */
+#if defined(TSIP_ENABLE)
if (c >= 0x13) {
lexer->state = TSIP_PAYLOAD;
break;
}
+#endif /* TSIP_ENABLE */
if (c == DLE) {
lexer->state = GROUND_STATE;
break;
@@ -654,7 +655,7 @@ static void nextstate(struct gps_packet_t *lexer,
lexer->state = NAVCOM_ID;
break;
case NAVCOM_ID:
- lexer->length = (size_t)c - 4;
+ lexer->length = (size_t) c - 4;
lexer->state = NAVCOM_LENGTH_1;
break;
case NAVCOM_LENGTH_1:
@@ -666,21 +667,24 @@ static void nextstate(struct gps_packet_t *lexer,
lexer->state = NAVCOM_PAYLOAD;
break;
case NAVCOM_PAYLOAD:
- {
- unsigned int n;
- unsigned char csum = lexer->inbuffer[3];
- for(n=4; (unsigned char *)(lexer->inbuffer + n) < lexer->inbufptr - 1; n++)
+ {
+ unsigned int n;
+ unsigned char csum = lexer->inbuffer[3];
+ for (n = 4;
+ (unsigned char *)(lexer->inbuffer + n) < lexer->inbufptr - 1;
+ n++)
csum ^= lexer->inbuffer[n];
- if(csum != c) {
- gpsd_report(LOG_IO, "Navcom packet type 0x%hx bad checksum 0x%hx, expecting 0x%hx\n",
- lexer->inbuffer[3], csum, c);
- gpsd_report(LOG_RAW, "Navcom packet dump: %s\n",
- gpsd_hexdump_wrapper(lexer->inbuffer, lexer->inbuflen,
- LOG_RAW));
+ if (csum != c) {
+ gpsd_report(LOG_IO,
+ "Navcom packet type 0x%hx bad checksum 0x%hx, expecting 0x%hx\n",
+ lexer->inbuffer[3], csum, c);
+ gpsd_report(LOG_RAW, "Navcom packet dump: %s\n",
+ gpsd_hexdump_wrapper(lexer->inbuffer, lexer->inbuflen,
+ LOG_RAW));
lexer->state = GROUND_STATE;
break;
- }
}
+ }
lexer->state = NAVCOM_CSUM;
break;
case NAVCOM_CSUM:
@@ -700,7 +704,7 @@ static void nextstate(struct gps_packet_t *lexer,
#ifdef RTCM104V3_ENABLE
case RTCM3_LEADER_1:
if ((c & 0xFC) == 0) {
- lexer->length = (size_t)(c << 8);
+ lexer->length = (size_t) (c << 8);
lexer->state = RTCM3_LEADER_2;
break;
} else
@@ -737,7 +741,7 @@ static void nextstate(struct gps_packet_t *lexer,
lexer->state = ZODIAC_ID_2;
break;
case ZODIAC_ID_2:
- lexer->length = (size_t)c;
+ lexer->length = (size_t) c;
lexer->state = ZODIAC_LENGTH_1;
break;
case ZODIAC_LENGTH_1:
@@ -754,27 +758,27 @@ static void nextstate(struct gps_packet_t *lexer,
lexer->state = ZODIAC_HSUM_1;
break;
case ZODIAC_HSUM_1:
- {
- #define getword(i) (short)(lexer->inbuffer[2*(i)] | (lexer->inbuffer[2*(i)+1] << 8))
- short sum = getword(0) + getword(1) + getword(2) + getword(3);
- sum *= -1;
- if (sum != getword(4)) {
- gpsd_report(LOG_IO,
- "Zodiac Header checksum 0x%hx expecting 0x%hx\n",
- sum, getword(4));
- lexer->state = GROUND_STATE;
- break;
- }
+ {
+#define getword(i) (short)(lexer->inbuffer[2*(i)] | (lexer->inbuffer[2*(i)+1] << 8))
+ short sum = getword(0) + getword(1) + getword(2) + getword(3);
+ sum *= -1;
+ if (sum != getword(4)) {
+ gpsd_report(LOG_IO,
+ "Zodiac Header checksum 0x%hx expecting 0x%hx\n",
+ sum, getword(4));
+ lexer->state = GROUND_STATE;
+ break;
}
- gpsd_report(LOG_RAW+1,"Zodiac header id=%hd len=%hd flags=%hx\n",
- getword(1), getword(2), getword(3));
- #undef getword
+ }
+ gpsd_report(LOG_RAW + 1, "Zodiac header id=%hd len=%hd flags=%hx\n",
+ getword(1), getword(2), getword(3));
+#undef getword
if (lexer->length == 0) {
lexer->state = ZODIAC_RECOGNIZED;
break;
}
- lexer->length *= 2; /* word count to byte count */
- lexer->length += 2; /* checksum */
+ lexer->length *= 2; /* word count to byte count */
+ lexer->length += 2; /* checksum */
/* 10 bytes is the length of the Zodiac header */
if (lexer->length <= MAX_PACKET_LENGTH - 10)
lexer->state = ZODIAC_PAYLOAD;
@@ -800,7 +804,7 @@ static void nextstate(struct gps_packet_t *lexer,
lexer->state = UBX_MESSAGE_ID;
break;
case UBX_MESSAGE_ID:
- lexer->length = (size_t)c;
+ lexer->length = (size_t) c;
lexer->state = UBX_LENGTH_1;
break;
case UBX_LENGTH_1:
@@ -824,8 +828,10 @@ static void nextstate(struct gps_packet_t *lexer,
case UBX_RECOGNIZED:
if (c == 0xb5)
lexer->state = UBX_LEADER_1;
- else if (c == '$') /* LEA-5H can and will output NMEA and UBX back to back */
+#ifdef NMEA_ENABLE
+ else if (c == '$') /* LEA-5H can and will output NMEA and UBX back to back */
lexer->state = NMEA_DOLLAR;
+#endif /* NMEA_ENABLE */
else
lexer->state = GROUND_STATE;
break;
@@ -838,7 +844,7 @@ static void nextstate(struct gps_packet_t *lexer,
lexer->state = GROUND_STATE;
break;
case EVERMORE_LEADER_2:
- lexer->length = (size_t)c;
+ lexer->length = (size_t) c;
if (c == DLE)
lexer->state = EVERMORE_PAYLOAD_DLE;
else
@@ -852,11 +858,16 @@ static void nextstate(struct gps_packet_t *lexer,
break;
case EVERMORE_PAYLOAD_DLE:
switch (c) {
- case DLE: lexer->state = EVERMORE_PAYLOAD; break;
- case ETX: lexer->state = EVERMORE_RECOGNIZED; break;
- default: lexer->state = GROUND_STATE;
+ case DLE:
+ lexer->state = EVERMORE_PAYLOAD;
+ break;
+ case ETX:
+ lexer->state = EVERMORE_RECOGNIZED;
+ break;
+ default:
+ lexer->state = GROUND_STATE;
}
- break;
+ break;
case EVERMORE_RECOGNIZED:
if (c == DLE)
lexer->state = EVERMORE_LEADER_1;
@@ -872,7 +883,7 @@ static void nextstate(struct gps_packet_t *lexer,
lexer->state = GROUND_STATE;
break;
case ITALK_LEADER_2:
- lexer->length = (size_t)(lexer->inbuffer[6] & 0xff);
+ lexer->length = (size_t) (lexer->inbuffer[6] & 0xff);
lexer->state = ITALK_LENGTH;
break;
case ITALK_LENGTH:
@@ -917,8 +928,7 @@ static void nextstate(struct gps_packet_t *lexer,
lexer->state = TSIP_DLE;
break;
case TSIP_DLE:
- switch (c)
- {
+ switch (c) {
case ETX:
lexer->state = TSIP_RECOGNIZED;
break;
@@ -970,20 +980,21 @@ static void nextstate(struct gps_packet_t *lexer,
static void packet_accept(struct gps_packet_t *lexer, int packet_type)
/* packet grab succeeded, move to output buffer */
{
- size_t packetlen = lexer->inbufptr-lexer->inbuffer;
+ size_t packetlen = lexer->inbufptr - lexer->inbuffer;
if (packetlen < sizeof(lexer->outbuffer)) {
memcpy(lexer->outbuffer, lexer->inbuffer, packetlen);
lexer->outbuflen = packetlen;
lexer->outbuffer[packetlen] = '\0';
lexer->type = packet_type;
#ifdef STATE_DEBUG
- gpsd_report(LOG_RAW+1, "Packet type %d accepted %zu = %s\n",
- packet_type, packetlen,
- gpsd_hexdump_wrapper(lexer->outbuffer, lexer->outbuflen, LOG_IO));
+ gpsd_report(LOG_RAW + 1, "Packet type %d accepted %zu = %s\n",
+ packet_type, packetlen,
+ gpsd_hexdump_wrapper(lexer->outbuffer, lexer->outbuflen,
+ LOG_IO));
#endif /* STATE_DEBUG */
} else {
gpsd_report(LOG_ERROR, "Rejected too long packet type %d len %zu\n",
- packet_type, packetlen);
+ packet_type, packetlen);
}
}
@@ -992,27 +1003,27 @@ static void packet_discard(struct gps_packet_t *lexer)
{
size_t discard = lexer->inbufptr - lexer->inbuffer;
size_t remaining = lexer->inbuflen - discard;
- lexer->inbufptr = memmove(lexer->inbuffer,
- lexer->inbufptr,
- remaining);
+ lexer->inbufptr = memmove(lexer->inbuffer, lexer->inbufptr, remaining);
lexer->inbuflen = remaining;
#ifdef STATE_DEBUG
- gpsd_report(LOG_RAW+1,
- "Packet discard of %zu, chars remaining is %zu = %s\n",
- discard, remaining,
- gpsd_hexdump_wrapper(lexer->inbuffer, lexer->inbuflen, LOG_RAW));
+ gpsd_report(LOG_RAW + 1,
+ "Packet discard of %zu, chars remaining is %zu = %s\n",
+ discard, remaining,
+ gpsd_hexdump_wrapper(lexer->inbuffer, lexer->inbuflen,
+ LOG_RAW));
#endif /* STATE_DEBUG */
}
static void character_discard(struct gps_packet_t *lexer)
/* shift the input buffer to discard one character and reread data */
{
- memmove(lexer->inbuffer, lexer->inbuffer+1, (size_t)--lexer->inbuflen);
+ memmove(lexer->inbuffer, lexer->inbuffer + 1, (size_t)-- lexer->inbuflen);
lexer->inbufptr = lexer->inbuffer;
#ifdef STATE_DEBUG
- gpsd_report(LOG_RAW+1, "Character discarded, buffer %zu chars = %s\n",
- lexer->inbuflen,
- gpsd_hexdump_wrapper(lexer->inbuffer, lexer->inbuflen, LOG_RAW));
+ gpsd_report(LOG_RAW + 1, "Character discarded, buffer %zu chars = %s\n",
+ lexer->inbuflen,
+ gpsd_hexdump_wrapper(lexer->inbuffer, lexer->inbuflen,
+ LOG_RAW));
#endif /* STATE_DEBUG */
}
@@ -1021,7 +1032,7 @@ static void character_discard(struct gps_packet_t *lexer)
/* entry points begin here */
-void packet_init(/*@out@*/struct gps_packet_t *lexer)
+void packet_init( /*@out@*/ struct gps_packet_t *lexer)
{
lexer->char_counter = 0;
lexer->retry_counter = 0;
@@ -1040,17 +1051,15 @@ void packet_parse(struct gps_packet_t *lexer)
#include "packet_names.h"
};
nextstate(lexer, c);
- gpsd_report(LOG_RAW+2, "%08ld: character '%c' [%02x], new state: %s\n",
- lexer->char_counter,
- (isprint(c)?c:'.'),
- c,
+ gpsd_report(LOG_RAW + 2,
+ "%08ld: character '%c' [%02x], new state: %s\n",
+ lexer->char_counter, (isprint(c) ? c : '.'), c,
state_table[lexer->state]);
lexer->char_counter++;
if (lexer->state == GROUND_STATE) {
character_discard(lexer);
- }
- else if (lexer->state == COMMENT_RECOGNIZED) {
+ } else if (lexer->state == COMMENT_RECOGNIZED) {
packet_accept(lexer, COMMENT_PACKET);
packet_discard(lexer);
lexer->state = GROUND_STATE;
@@ -1065,7 +1074,7 @@ void packet_parse(struct gps_packet_t *lexer)
* Back up past any whitespace. Need to do this because
* at least one GPS (the Firefly 1a) emits \r\r\n
*/
- for (end = (char *)lexer->inbufptr-1; isspace(*end); end--)
+ for (end = (char *)lexer->inbufptr - 1; isspace(*end); end--)
continue;
end -= 2;
if (*end == '*') {
@@ -1073,8 +1082,8 @@ void packet_parse(struct gps_packet_t *lexer)
for (n = 1; (char *)lexer->inbuffer + n < end; n++)
crc ^= lexer->inbuffer[n];
(void)snprintf(csum, sizeof(csum), "%02X", crc);
- checksum_ok = (csum[0]==toupper(end[1])
- && csum[1]==toupper(end[2]));
+ checksum_ok = (csum[0] == toupper(end[1])
+ && csum[1] == toupper(end[2]));
}
if (checksum_ok) {
#ifdef AIVDM_ENABLE
@@ -1084,7 +1093,9 @@ void packet_parse(struct gps_packet_t *lexer)
#endif /* AIVDM_ENABLE */
packet_accept(lexer, NMEA_PACKET);
} else {
- gpsd_report(LOG_WARN, "bad checksum in NMEA packet; expected %s.\n", csum);
+ gpsd_report(LOG_WARN,
+ "bad checksum in NMEA packet; expected %s.\n",
+ csum);
lexer->state = GROUND_STATE;
}
packet_discard(lexer);
@@ -1093,8 +1104,9 @@ void packet_parse(struct gps_packet_t *lexer)
#endif /* NMEA_ENABLE */
#ifdef SIRF_ENABLE
else if (lexer->state == SIRF_RECOGNIZED) {
- unsigned char *trailer = lexer->inbufptr-4;
- unsigned int checksum = (unsigned)((trailer[0] << 8) | trailer[1]);
+ unsigned char *trailer = lexer->inbufptr - 4;
+ unsigned int checksum =
+ (unsigned)((trailer[0] << 8) | trailer[1]);
unsigned int n, crc = 0;
for (n = 4; n < (unsigned)(trailer - lexer->inbuffer); n++)
crc += (int)lexer->inbuffer[n];
@@ -1112,12 +1124,13 @@ void packet_parse(struct gps_packet_t *lexer)
unsigned a = 0, b;
size_t n;
lexer->length = 4 + (size_t) lexer->inbuffer[3] + 2;
- for(n = 0; n < lexer->length - 2; n++)
+ for (n = 0; n < lexer->length - 2; n++)
a += (unsigned)lexer->inbuffer[n];
b = (unsigned)getleuw(lexer->inbuffer, lexer->length - 2);
gpsd_report(LOG_IO, "SuperStarII pkt dump: type %u len %u: %s\n",
lexer->inbuffer[1], (unsigned int)lexer->length,
- gpsd_hexdump_wrapper(lexer->inbuffer, lexer->length, LOG_RAW));
+ gpsd_hexdump_wrapper(lexer->inbuffer, lexer->length,
+ LOG_RAW));
if (a != b) {
gpsd_report(LOG_IO, "REJECT SuperStarII packet type 0x%02x"
"%zd bad checksum 0x%04x, expecting 0x%04x\n",
@@ -1136,17 +1149,17 @@ void packet_parse(struct gps_packet_t *lexer)
int i, len;
len = lexer->inbufptr - lexer->inbuffer;
- a = (char)(lexer->inbuffer[len-3]);
+ a = (char)(lexer->inbuffer[len - 3]);
b = '\0';
- for(i = 2; i < len - 3; i++)
+ for (i = 2; i < len - 3; i++)
b ^= lexer->inbuffer[i];
if (a == b) {
gpsd_report(LOG_IO, "Accept OnCore packet @@%c%c len %d\n",
- lexer->inbuffer[2], lexer->inbuffer[3], len);
+ lexer->inbuffer[2], lexer->inbuffer[3], len);
packet_accept(lexer, ONCORE_PACKET);
} else {
gpsd_report(LOG_IO, "REJECT OnCore packet @@%c%c len %d\n",
- lexer->inbuffer[2], lexer->inbuffer[3], len);
+ lexer->inbuffer[2], lexer->inbuffer[3], len);
lexer->state = GROUND_STATE;
}
packet_discard(lexer);
@@ -1160,9 +1173,9 @@ void packet_parse(struct gps_packet_t *lexer)
unsigned int pos, dlecnt;
/* don't count stuffed DLEs in the length */
dlecnt = 0;
- for (pos = 0; pos < (unsigned int)packetlen; pos ++)
+ for (pos = 0; pos < (unsigned int)packetlen; pos++)
if (lexer->inbuffer[pos] == DLE)
- dlecnt ++;
+ dlecnt++;
if (dlecnt > 2) {
dlecnt -= 2;
dlecnt /= 2;
@@ -1170,7 +1183,7 @@ void packet_parse(struct gps_packet_t *lexer)
packetlen -= dlecnt;
}
#endif /* TSIP_ENABLE */
- if ( packetlen < 5) {
+ if (packetlen < 5) {
lexer->state = GROUND_STATE;
} else {
unsigned int pkt_id, len;
@@ -1182,11 +1195,11 @@ void packet_parse(struct gps_packet_t *lexer)
#ifdef TSIP_ENABLE
/* shortcut garmin */
if (TSIP_PACKET == lexer->type)
- goto not_garmin;
+ goto not_garmin;
#endif /* TSIP_ENABLE */
if (lexer->inbuffer[n++] != DLE)
goto not_garmin;
- pkt_id = lexer->inbuffer[n++]; /* packet ID */
+ pkt_id = lexer->inbuffer[n++]; /* packet ID */
len = lexer->inbuffer[n++];
chksum = len + pkt_id;
if (len == DLE) {
@@ -1215,18 +1228,18 @@ void packet_parse(struct gps_packet_t *lexer)
chksum &= 0xff;
if (chksum) {
gpsd_report(LOG_IO,
- "Garmin checksum failed: %02x!=0\n",chksum);
+ "Garmin checksum failed: %02x!=0\n", chksum);
goto not_garmin;
}
/* Debug
- gpsd_report(LOG_IO, "Garmin n= %#02x\n %s\n", n,
- gpsd_hexdump_wrapper(lexer->inbuffer, packetlen, LOG_IO));
- */
+ * gpsd_report(LOG_IO, "Garmin n= %#02x\n %s\n", n,
+ * gpsd_hexdump_wrapper(lexer->inbuffer, packetlen, LOG_IO));
+ */
packet_accept(lexer, GARMIN_PACKET);
packet_discard(lexer);
break;
- not_garmin:;
- gpsd_report(LOG_RAW+1,"Not a Garmin packet\n");
+ not_garmin:;
+ gpsd_report(LOG_RAW + 1, "Not a Garmin packet\n");
#endif /* GARMIN_ENABLE */
#ifdef TSIP_ENABLE
/* check for some common TSIP packet types:
@@ -1258,81 +1271,90 @@ void packet_parse(struct gps_packet_t *lexer)
* <DLE>[pkt id] [data] <DLE><ETX>
*/
/*@ +charint @*/
- pkt_id = lexer->inbuffer[1]; /* packet ID */
- if (!((0x13 == pkt_id) || (0xbb == pkt_id) || (0xbc == pkt_id)) &&
- ((0x41 > pkt_id) || (0x8f < pkt_id))) {
- gpsd_report(LOG_IO, "Packet ID 0x%02x out of range for TSIP\n", pkt_id);
+ pkt_id = lexer->inbuffer[1]; /* packet ID */
+ /* *INDENT-OFF* */
+ if (!((0x13 == pkt_id) || (0xbb == pkt_id) || (0xbc == pkt_id))
+ && ((0x41 > pkt_id) || (0x8f < pkt_id))) {
+ gpsd_report(LOG_IO,
+ "Packet ID 0x%02x out of range for TSIP\n",
+ pkt_id);
goto not_tsip;
}
+ /* *INDENT-ON* */
/*@ -ifempty */
if ((0x13 == pkt_id) && (0x01 <= packetlen))
- /* pass */;
- else if ((0x41 == pkt_id) && ((0x0e == packetlen) || (0x0f == packetlen)))
- /* pass */;
+ /* pass */ ;
+ else if ((0x41 == pkt_id)
+ && ((0x0e == packetlen) || (0x0f == packetlen)))
+ /* pass */ ;
else if ((0x42 == pkt_id) && (0x14 == packetlen))
- /* pass */;
+ /* pass */ ;
else if ((0x43 == pkt_id) && (0x18 == packetlen))
- /* pass */;
+ /* pass */ ;
else if ((0x45 == pkt_id) && (0x0e == packetlen))
- /* pass */;
+ /* pass */ ;
else if ((0x46 == pkt_id) && (0x06 == packetlen))
- /* pass */;
+ /* pass */ ;
else if ((0x48 == pkt_id) && (0x1a == packetlen))
- /* pass */;
+ /* pass */ ;
else if ((0x49 == pkt_id) && (0x24 == packetlen))
- /* pass */;
+ /* pass */ ;
else if ((0x4a == pkt_id) && (0x18 == packetlen))
- /* pass */;
+ /* pass */ ;
else if ((0x4b == pkt_id) && (0x07 == packetlen))
- /* pass */;
+ /* pass */ ;
else if ((0x4c == pkt_id) && (0x15 == packetlen))
- /* pass */;
+ /* pass */ ;
else if ((0x54 == pkt_id) && (0x10 == packetlen))
- /* pass */;
+ /* pass */ ;
else if ((0x55 == pkt_id) && (0x08 == packetlen))
- /* pass */;
+ /* pass */ ;
else if ((0x56 == pkt_id) && (0x18 == packetlen))
- /* pass */;
+ /* pass */ ;
else if ((0x57 == pkt_id) && (0x0c == packetlen))
- /* pass */;
- else if ((0x5a == pkt_id) && ((0x1d <= packetlen) && (0x1f >= packetlen)))
- /* pass */;
+ /* pass */ ;
+ else if ((0x5a == pkt_id)
+ && ((0x1d <= packetlen) && (0x1f >= packetlen)))
+ /* pass */ ;
else if ((0x5b == pkt_id) && (0x24 == packetlen))
- /* pass */;
- else if ((0x5c == pkt_id) && ((0x1c <= packetlen) && (0x1e >= packetlen)))
- /* pass */;
+ /* pass */ ;
+ else if ((0x5c == pkt_id)
+ && ((0x1c <= packetlen) && (0x1e >= packetlen)))
+ /* pass */ ;
else if ((0x5e == pkt_id) && (0x06 == packetlen))
- /* pass */;
+ /* pass */ ;
else if ((0x5f == pkt_id) && (70 == packetlen))
- /* pass */;
- else if ((0x6d == pkt_id) && ((0x14 <= packetlen) && (0x20 >= packetlen)))
- /* pass */;
+ /* pass */ ;
+ else if ((0x6d == pkt_id)
+ && ((0x14 <= packetlen) && (0x20 >= packetlen)))
+ /* pass */ ;
else if ((0x82 == pkt_id) && (0x05 == packetlen))
- /* pass */;
- else if ((0x84 == pkt_id) && ((0x28 <= packetlen) && (0x29 >= packetlen)))
- /* pass */;
+ /* pass */ ;
+ else if ((0x84 == pkt_id)
+ && ((0x28 <= packetlen) && (0x29 >= packetlen)))
+ /* pass */ ;
else if ((0x8e == pkt_id))
- /* pass */;
+ /* pass */ ;
else if ((0x8f == pkt_id))
- /* pass */;
+ /* pass */ ;
else if ((0xbb == pkt_id) && (0x2c == packetlen))
- /* pass */;
+ /* pass */ ;
else {
gpsd_report(LOG_IO,
- "TSIP REJECT pkt_id = %#02x, packetlen= %zu\n",
- pkt_id, packetlen);
+ "TSIP REJECT pkt_id = %#02x, packetlen= %zu\n",
+ pkt_id, packetlen);
goto not_tsip;
}
/* Debug */
gpsd_report(LOG_RAW,
- "TSIP pkt_id = %#02x, packetlen= %zu\n",
- pkt_id, packetlen);
+ "TSIP pkt_id = %#02x, packetlen= %zu\n",
+ pkt_id, packetlen);
/*@ -charint +ifempty @*/
packet_accept(lexer, TSIP_PACKET);
packet_discard(lexer);
break;
- not_tsip:
- gpsd_report(LOG_RAW+1,"Not a TSIP packet\n");
+ not_tsip:
+ gpsd_report(LOG_RAW + 1, "Not a TSIP packet\n");
/*
* More attempts to recognize ambiguous TSIP-like
* packet types could go here.
@@ -1347,17 +1369,16 @@ void packet_parse(struct gps_packet_t *lexer)
#ifdef RTCM104V3_ENABLE
else if (lexer->state == RTCM3_RECOGNIZED) {
if (crc24q_check(lexer->inbuffer,
- lexer->inbufptr-lexer->inbuffer)) {
+ lexer->inbufptr - lexer->inbuffer)) {
packet_accept(lexer, RTCM3_PACKET);
packet_discard(lexer);
} else {
gpsd_report(LOG_IO, "RTCM3 data checksum failure, "
"%0x against %02x %02x %02x\n",
crc24q_hash(lexer->inbuffer,
- lexer->inbufptr-lexer->inbuffer - 3),
- lexer->inbufptr[-3],
- lexer->inbufptr[-2],
- lexer->inbufptr[-1]);
+ lexer->inbufptr - lexer->inbuffer -
+ 3), lexer->inbufptr[-3],
+ lexer->inbufptr[-2], lexer->inbufptr[-1]);
lexer->state = GROUND_STATE;
packet_discard(lexer);
}
@@ -1369,14 +1390,14 @@ void packet_parse(struct gps_packet_t *lexer)
short len, n, sum;
len = getword(2);
for (n = sum = 0; n < len; n++)
- sum += getword(5+n);
+ sum += getword(5 + n);
sum *= -1;
if (len == 0 || sum == getword(5 + len)) {
packet_accept(lexer, ZODIAC_PACKET);
} else {
gpsd_report(LOG_IO,
- "Zodiac data checksum 0x%hx over length %hd, expecting 0x%hx\n",
- sum, len, getword(5 + len));
+ "Zodiac data checksum 0x%hx over length %hd, expecting 0x%hx\n",
+ sum, len, getword(5 + len));
lexer->state = GROUND_STATE;
}
packet_discard(lexer);
@@ -1391,24 +1412,23 @@ void packet_parse(struct gps_packet_t *lexer)
unsigned char ck_b = (unsigned char)0;
len = lexer->inbufptr - lexer->inbuffer;
gpsd_report(LOG_IO, "UBX: len %d\n", len);
- for (n = 2; n < (len-2); n++) {
+ for (n = 2; n < (len - 2); n++) {
ck_a += lexer->inbuffer[n];
ck_b += ck_a;
}
- if (ck_a == lexer->inbuffer[len-2] &&
- ck_b == lexer->inbuffer[len-1])
+ if (ck_a == lexer->inbuffer[len - 2] &&
+ ck_b == lexer->inbuffer[len - 1])
packet_accept(lexer, UBX_PACKET);
else {
gpsd_report(LOG_IO,
- "UBX checksum 0x%02hhx%02hhx over length %hd,"\
- " expecting 0x%02hhx%02hhx (type 0x%02hhx%02hhx)\n",
- ck_a,
- ck_b,
- len,
- lexer->inbuffer[len-2],
- lexer->inbuffer[len-1],
- lexer->inbuffer[2],
- lexer->inbuffer[3]);
+ "UBX checksum 0x%02hhx%02hhx over length %hd,"
+ " expecting 0x%02hhx%02hhx (type 0x%02hhx%02hhx)\n",
+ ck_a,
+ ck_b,
+ len,
+ lexer->inbuffer[len - 2],
+ lexer->inbuffer[len - 1],
+ lexer->inbuffer[2], lexer->inbuffer[3]);
lexer->state = GROUND_STATE;
}
packet_discard(lexer);
@@ -1458,7 +1478,7 @@ void packet_parse(struct gps_packet_t *lexer)
packet_accept(lexer, EVERMORE_PACKET);
packet_discard(lexer);
break;
- not_evermore:
+ not_evermore:
lexer->state = GROUND_STATE;
packet_discard(lexer);
break;
@@ -1474,27 +1494,27 @@ void packet_parse(struct gps_packet_t *lexer)
volatile uint32_t tmpdw;
/* number of words */
- len = (uint16_t)(lexer->inbuffer[6] &0xff);
+ len = (uint16_t) (lexer->inbuffer[6] & 0xff);
/*@ -type @*/
/* initialize all my registers */
csum = tmpw = tmpdw = 0;
/* expected checksum */
- xsum = getiw(7+2*len);
+ xsum = getiw(7 + 2 * len);
for (n = 0; n < len; n++) {
- tmpw = getiw(7 + 2*n);
+ tmpw = getiw(7 + 2 * n);
tmpdw = (csum + 1) * (tmpw + n);
- csum ^= (tmpdw & 0xffff) ^ ((tmpdw >>16) & 0xffff);
+ csum ^= (tmpdw & 0xffff) ^ ((tmpdw >> 16) & 0xffff);
}
/*@ +type @*/
if (len == 0 || csum == xsum)
packet_accept(lexer, ITALK_PACKET);
else {
gpsd_report(LOG_IO,
- "ITALK: checksum failed - "
- "type 0x%02x expected 0x%04x got 0x%04x\n",
- lexer->inbuffer[4], xsum, csum);
+ "ITALK: checksum failed - "
+ "type 0x%02x expected 0x%04x got 0x%04x\n",
+ lexer->inbuffer[4], xsum, csum);
lexer->state = GROUND_STATE;
}
packet_discard(lexer);
@@ -1525,19 +1545,20 @@ void packet_parse(struct gps_packet_t *lexer)
#endif /* RTCM104V2_ENABLE */
#ifdef GARMINTXT_ENABLE
else if (lexer->state == GTXT_RECOGNIZED) {
- size_t packetlen = lexer->inbufptr - lexer->inbuffer;
+ size_t packetlen = lexer->inbufptr - lexer->inbuffer;
if (57 <= packetlen) {
packet_accept(lexer, GARMINTXT_PACKET);
packet_discard(lexer);
- lexer->state = GROUND_STATE;
+ lexer->state = GROUND_STATE;
break;
- } else {
- lexer->state = GROUND_STATE;
- }
- }
+ } else {
+ lexer->state = GROUND_STATE;
+ }
+ }
#endif
- } /* while */
+ } /* while */
}
+
#undef getword
ssize_t packet_get(int fd, struct gps_packet_t *lexer)
@@ -1546,31 +1567,35 @@ ssize_t packet_get(int fd, struct gps_packet_t *lexer)
ssize_t recvd;
/*@ -modobserver @*/
- recvd = read(fd, lexer->inbuffer+lexer->inbuflen,
- sizeof(lexer->inbuffer)-(lexer->inbuflen));
+ errno = 0;
+ recvd = read(fd, lexer->inbuffer + lexer->inbuflen,
+ sizeof(lexer->inbuffer) - (lexer->inbuflen));
/*@ +modobserver @*/
if (recvd == -1) {
if ((errno == EAGAIN) || (errno == EINTR)) {
#ifdef STATE_DEBUG
- gpsd_report(LOG_RAW+2, "no bytes ready\n");
+ gpsd_report(LOG_RAW + 2, "no bytes ready\n");
recvd = 0;
/* fall through, input buffer may be nonempty */
#endif /* STATE_DEBUG */
} else {
#ifdef STATE_DEBUG
- gpsd_report(LOG_RAW+2, "errno: %s\n", strerror(errno));
+ gpsd_report(LOG_RAW + 2, "errno: %s\n", strerror(errno));
#endif /* STATE_DEBUG */
return -1;
}
} else {
#ifdef STATE_DEBUG
- gpsd_report(LOG_RAW+1,
- "Read %zd chars to buffer offset %zd (total %zd): %s\n",
- recvd, lexer->inbuflen, lexer->inbuflen+recvd,
- gpsd_hexdump_wrapper(lexer->inbufptr, (size_t)recvd, LOG_RAW+1));
+ gpsd_report(LOG_RAW + 1,
+ "Read %zd chars to buffer offset %zd (total %zd): %s\n",
+ recvd, lexer->inbuflen, lexer->inbuflen + recvd,
+ gpsd_hexdump_wrapper(lexer->inbufptr, (size_t) recvd,
+ LOG_RAW + 1));
#endif /* STATE_DEBUG */
lexer->inbuflen += recvd;
}
+ gpsd_report(LOG_SPIN, "packet_get() fd %d -> %zd (%d)\n",
+ fd, recvd, errno);
/*
* Bail out, indicating no more input, only if we just received
@@ -1584,9 +1609,9 @@ ssize_t packet_get(int fd, struct gps_packet_t *lexer)
packet_parse(lexer);
/* if input buffer is full, discard */
- if (sizeof(lexer->inbuffer)==(lexer->inbuflen)) {
- packet_discard(lexer);
- lexer->state = GROUND_STATE;
+ if (sizeof(lexer->inbuffer) == (lexer->inbuflen)) {
+ packet_discard(lexer);
+ lexer->state = GROUND_STATE;
}
/*
@@ -1608,7 +1633,7 @@ ssize_t packet_get(int fd, struct gps_packet_t *lexer)
* performance profiling.
*/
if (lexer->outbuflen > 0)
- return (ssize_t)lexer->outbuflen;
+ return (ssize_t) lexer->outbuflen;
else
/*
* Otherwise recvd is the size of whatever packet fragment we got.
@@ -1618,7 +1643,7 @@ ssize_t packet_get(int fd, struct gps_packet_t *lexer)
return recvd;
}
-void packet_reset(/*@out@*/struct gps_packet_t *lexer)
+void packet_reset( /*@out@*/ struct gps_packet_t *lexer)
/* return the packet machine to the ground state */
{
lexer->type = BAD_PACKET;
@@ -1636,12 +1661,9 @@ void packet_pushback(struct gps_packet_t *lexer)
/* push back the last packet grabbed */
{
if (lexer->outbuflen + lexer->inbuflen < MAX_PACKET_LENGTH) {
- memmove(lexer->inbuffer+lexer->outbuflen,
- lexer->inbuffer,
- lexer->inbuflen);
- memmove(lexer->inbuffer,
- lexer->outbuffer,
- lexer->outbuflen);
+ memmove(lexer->inbuffer + lexer->outbuflen,
+ lexer->inbuffer, lexer->inbuflen);
+ memmove(lexer->inbuffer, lexer->outbuffer, lexer->outbuflen);
lexer->inbuflen += lexer->outbuflen;
lexer->inbufptr += lexer->outbuflen;
lexer->outbuflen = 0;
@@ -1650,7 +1672,7 @@ void packet_pushback(struct gps_packet_t *lexer)
#endif /* __UNUSED */
#ifdef ONCORE_ENABLE
-size_t oncore_payload_cksum_length(unsigned char id1,unsigned char id2)
+size_t oncore_payload_cksum_length(unsigned char id1, unsigned char id2)
{
size_t l;
@@ -1661,6 +1683,7 @@ size_t oncore_payload_cksum_length(unsigned char id1,unsigned char id2)
#define ONCTYPE(id2,id3) ((((unsigned int)id2)<<8)|(id3))
+ /* *INDENT-OFF* */
switch (ONCTYPE(id1,id2)) {
case ONCTYPE('A','b'): l = 10; break; /* GMT offset */
case ONCTYPE('A','w'): l = 8; break; /* time mode */
@@ -1700,8 +1723,8 @@ size_t oncore_payload_cksum_length(unsigned char id1,unsigned char id2)
default:
return 0;
}
+ /* *INDENT-ON* */
- return l - 6; /* Subtract header and trailer. */
+ return l - 6; /* Subtract header and trailer. */
}
#endif /* ONCORE_ENABLE */
-
diff --git a/pseudonmea.c b/pseudonmea.c
index db4697bf..22f61f3e 100644
--- a/pseudonmea.c
+++ b/pseudonmea.c
@@ -6,21 +6,21 @@
#include "gpsd_config.h"
#include <sys/time.h>
#ifdef HAVE_SYS_IOCTL_H
- #include <sys/ioctl.h>
+#include <sys/ioctl.h>
#endif /* HAVE_SYS_IOCTL_H */
#ifndef S_SPLINT_S
- #ifdef HAVE_SYS_SOCKET_H
- #include <sys/socket.h>
- #endif /* HAVE_SYS_SOCKET_H */
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif /* HAVE_SYS_SOCKET_H */
#include <unistd.h>
#endif /* S_SPLINT_S */
#include <sys/time.h>
#include <stdio.h>
#include <math.h>
#ifndef S_SPLINT_S
- #ifdef HAVE_NETDB_H
- #include <netdb.h>
- #endif /* HAVE_NETDB_H */
+#ifdef HAVE_NETDB_H
+#include <netdb.h>
+#endif /* HAVE_NETDB_H */
#endif /* S_SPLINT_S */
#include <string.h>
#include <errno.h>
@@ -48,51 +48,52 @@ static double degtodm(double angle)
/*@ -mustdefine @*/
void gpsd_position_fix_dump(struct gps_device_t *session,
- /*@out@*/char bufp[], size_t len)
+ /*@out@*/ char bufp[], size_t len)
{
struct tm tm;
time_t intfixtime;
- intfixtime = (time_t)session->gpsdata.fix.time;
+ intfixtime = (time_t) session->gpsdata.fix.time;
(void)gmtime_r(&intfixtime, &tm);
if (session->gpsdata.fix.mode > 1) {
(void)snprintf(bufp, len,
- "$GPGGA,%02d%02d%02d,%09.4f,%c,%010.4f,%c,%d,%02d,",
- tm.tm_hour,
- tm.tm_min,
- tm.tm_sec,
- degtodm(fabs(session->gpsdata.fix.latitude)),
- ((session->gpsdata.fix.latitude > 0) ? 'N' : 'S'),
- degtodm(fabs(session->gpsdata.fix.longitude)),
- ((session->gpsdata.fix.longitude > 0) ? 'E' : 'W'),
- session->gpsdata.status,
- session->gpsdata.satellites_used);
+ "$GPGGA,%02d%02d%02d,%09.4f,%c,%010.4f,%c,%d,%02d,",
+ tm.tm_hour,
+ tm.tm_min,
+ tm.tm_sec,
+ degtodm(fabs(session->gpsdata.fix.latitude)),
+ ((session->gpsdata.fix.latitude > 0) ? 'N' : 'S'),
+ degtodm(fabs(session->gpsdata.fix.longitude)),
+ ((session->gpsdata.fix.longitude > 0) ? 'E' : 'W'),
+ session->gpsdata.status,
+ session->gpsdata.satellites_used);
if (isnan(session->gpsdata.dop.hdop))
(void)strlcat(bufp, ",", len);
else
- (void)snprintf(bufp+strlen(bufp), len-strlen(bufp),
- "%.2f,",session->gpsdata.dop.hdop);
+ (void)snprintf(bufp + strlen(bufp), len - strlen(bufp),
+ "%.2f,", session->gpsdata.dop.hdop);
if (isnan(session->gpsdata.fix.altitude))
(void)strlcat(bufp, ",", len);
else
- (void)snprintf(bufp+strlen(bufp), len-strlen(bufp),
+ (void)snprintf(bufp + strlen(bufp), len - strlen(bufp),
"%.2f,M,", session->gpsdata.fix.altitude);
if (isnan(session->gpsdata.separation))
(void)strlcat(bufp, ",", len);
else
- (void)snprintf(bufp+strlen(bufp), len-strlen(bufp),
+ (void)snprintf(bufp + strlen(bufp), len - strlen(bufp),
"%.3f,M,", session->gpsdata.separation);
if (isnan(session->mag_var))
(void)strlcat(bufp, ",", len);
else {
- (void)snprintf(bufp+strlen(bufp),
- len-strlen(bufp),
+ (void)snprintf(bufp + strlen(bufp),
+ len - strlen(bufp),
"%3.2f,", fabs(session->mag_var));
- (void)strlcat(bufp, (session->mag_var > 0) ? "E": "W", len);
+ (void)strlcat(bufp, (session->mag_var > 0) ? "E" : "W", len);
}
nmea_add_checksum(bufp);
}
}
+
/*@ +mustdefine @*/
static void gpsd_transit_fix_dump(struct gps_device_t *session,
@@ -101,9 +102,10 @@ static void gpsd_transit_fix_dump(struct gps_device_t *session,
struct tm tm;
time_t intfixtime;
- tm.tm_mday = tm.tm_mon = tm.tm_year = tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
- if (isnan(session->gpsdata.fix.time)==0) {
- intfixtime = (time_t)session->gpsdata.fix.time;
+ tm.tm_mday = tm.tm_mon = tm.tm_year = tm.tm_hour = tm.tm_min = tm.tm_sec =
+ 0;
+ if (isnan(session->gpsdata.fix.time) == 0) {
+ intfixtime = (time_t) session->gpsdata.fix.time;
(void)gmtime_r(&intfixtime, &tm);
tm.tm_mon++;
tm.tm_year %= 100;
@@ -111,64 +113,63 @@ static void gpsd_transit_fix_dump(struct gps_device_t *session,
#define ZEROIZE(x) (isnan(x)!=0 ? 0.0 : x)
/*@ -usedef @*/
(void)snprintf(bufp, len,
- "$GPRMC,%02d%02d%02d,%c,%09.4f,%c,%010.4f,%c,%.4f,%.3f,%02d%02d%02d,,",
- tm.tm_hour,
- tm.tm_min,
- tm.tm_sec,
- session->gpsdata.status ? 'A' : 'V',
- ZEROIZE(degtodm(fabs(session->gpsdata.fix.latitude))),
- ((session->gpsdata.fix.latitude > 0) ? 'N' : 'S'),
- ZEROIZE(degtodm(fabs(session->gpsdata.fix.longitude))),
- ((session->gpsdata.fix.longitude > 0) ? 'E' : 'W'),
- ZEROIZE(session->gpsdata.fix.speed * MPS_TO_KNOTS),
- ZEROIZE(session->gpsdata.fix.track),
- tm.tm_mday,
- tm.tm_mon,
- tm.tm_year);
+ "$GPRMC,%02d%02d%02d,%c,%09.4f,%c,%010.4f,%c,%.4f,%.3f,%02d%02d%02d,,",
+ tm.tm_hour,
+ tm.tm_min,
+ tm.tm_sec,
+ session->gpsdata.status ? 'A' : 'V',
+ ZEROIZE(degtodm(fabs(session->gpsdata.fix.latitude))),
+ ((session->gpsdata.fix.latitude > 0) ? 'N' : 'S'),
+ ZEROIZE(degtodm(fabs(session->gpsdata.fix.longitude))),
+ ((session->gpsdata.fix.longitude > 0) ? 'E' : 'W'),
+ ZEROIZE(session->gpsdata.fix.speed * MPS_TO_KNOTS),
+ ZEROIZE(session->gpsdata.fix.track),
+ tm.tm_mday, tm.tm_mon, tm.tm_year);
/*@ +usedef @*/
#undef ZEROIZE
nmea_add_checksum(bufp);
}
static void gpsd_binary_satellite_dump(struct gps_device_t *session,
- char bufp[], size_t len)
+ char bufp[], size_t len)
{
int i;
char *bufp2 = bufp;
bufp[0] = '\0';
- for( i = 0 ; i < session->gpsdata.satellites_visible; i++ ) {
+ for (i = 0; i < session->gpsdata.satellites_visible; i++) {
if (i % 4 == 0) {
bufp += strlen(bufp);
bufp2 = bufp;
len -= snprintf(bufp, len,
- "$GPGSV,%d,%d,%02d",
- ((session->gpsdata.satellites_visible-1) / 4) + 1,
- (i / 4) + 1,
- session->gpsdata.satellites_visible);
+ "$GPGSV,%d,%d,%02d",
+ ((session->gpsdata.satellites_visible - 1) / 4) +
+ 1, (i / 4) + 1,
+ session->gpsdata.satellites_visible);
}
bufp += strlen(bufp);
if (i < session->gpsdata.satellites_visible)
len -= snprintf(bufp, len,
- ",%02d,%02d,%03d,%02.0f",
- session->gpsdata.PRN[i],
- session->gpsdata.elevation[i],
- session->gpsdata.azimuth[i],
- session->gpsdata.ss[i]);
- if (i % 4 == 3 || i == session->gpsdata.satellites_visible-1) {
+ ",%02d,%02d,%03d,%02.0f",
+ session->gpsdata.PRN[i],
+ session->gpsdata.elevation[i],
+ session->gpsdata.azimuth[i],
+ session->gpsdata.ss[i]);
+ if (i % 4 == 3 || i == session->gpsdata.satellites_visible - 1) {
nmea_add_checksum(bufp2);
len -= 5;
}
}
#ifdef ZODIAC_ENABLE
- if (session->packet.type == ZODIAC_PACKET && session->driver.zodiac.Zs[0] != 0) {
+ if (session->packet.type == ZODIAC_PACKET
+ && session->driver.zodiac.Zs[0] != 0) {
bufp += strlen(bufp);
bufp2 = bufp;
(void)strlcpy(bufp, "$PRWIZCH", len);
for (i = 0; i < ZODIAC_CHANNELS; i++) {
- len -= snprintf(bufp+strlen(bufp), len,
- ",%02u,%X",
+ len -= snprintf(bufp + strlen(bufp), len,
+ ",%02u,%X",
session->driver.zodiac.Zs[i],
session->driver.zodiac.Zv[i] & 0x0f);
}
@@ -178,21 +179,22 @@ static void gpsd_binary_satellite_dump(struct gps_device_t *session,
}
static void gpsd_binary_quality_dump(struct gps_device_t *session,
- char bufp[], size_t len)
+ char bufp[], size_t len)
{
- int i, j;
+ int i, j;
char *bufp2 = bufp;
- bool used_valid = (session->gpsdata.set & USED_SET)!= 0;
+ bool used_valid = (session->gpsdata.set & USED_IS) != 0;
- if (session->device_type!=NULL && (session->gpsdata.set & MODE_SET) != 0) {
- (void)snprintf(bufp, len-strlen(bufp),
+ if (session->device_type != NULL && (session->gpsdata.set & MODE_IS) != 0) {
+ (void)snprintf(bufp, len - strlen(bufp),
"$GPGSA,%c,%d,", 'A', session->gpsdata.fix.mode);
j = 0;
for (i = 0; i < session->device_type->channels; i++) {
if (session->gpsdata.used[i]) {
bufp += strlen(bufp);
- (void)snprintf(bufp, len-strlen(bufp),
- "%02d,", used_valid ? session->gpsdata.used[i] : 0);
+ (void)snprintf(bufp, len - strlen(bufp),
+ "%02d,",
+ used_valid ? session->gpsdata.used[i] : 0);
j++;
}
}
@@ -205,7 +207,7 @@ static void gpsd_binary_quality_dump(struct gps_device_t *session,
if (session->gpsdata.fix.mode == MODE_NO_FIX)
(void)strlcat(bufp, ",,,", len);
else
- (void)snprintf(bufp, len-strlen(bufp),
+ (void)snprintf(bufp, len - strlen(bufp),
"%.1f,%.1f,%.1f*",
ZEROIZE(session->gpsdata.dop.pdop),
ZEROIZE(session->gpsdata.dop.hdop),
@@ -221,11 +223,11 @@ static void gpsd_binary_quality_dump(struct gps_device_t *session,
time_t intfixtime;
tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
- if (isnan(session->gpsdata.fix.time)==0) {
- intfixtime = (time_t)session->gpsdata.fix.time;
+ if (isnan(session->gpsdata.fix.time) == 0) {
+ intfixtime = (time_t) session->gpsdata.fix.time;
(void)gmtime_r(&intfixtime, &tm);
}
- (void)snprintf(bufp, len-strlen(bufp),
+ (void)snprintf(bufp, len - strlen(bufp),
"$GPGBS,%02d%02d%02d,%.2f,M,%.2f,M,%.2f,M",
tm.tm_hour, tm.tm_min, tm.tm_sec,
ZEROIZE(session->gpsdata.fix.epx),
@@ -237,27 +239,32 @@ static void gpsd_binary_quality_dump(struct gps_device_t *session,
}
/*@-compdef -mustdefine@*/
+/* *INDENT-OFF* */
void nmea_tpv_dump(struct gps_device_t *session,
- /*@out@*/char bufp[], size_t len)
+ /*@out@*/ char bufp[], size_t len)
{
bufp[0] = '\0';
- if ((session->gpsdata.set & LATLON_SET) != 0) {
+ if ((session->gpsdata.set & LATLON_IS) != 0) {
gpsd_position_fix_dump(session, bufp, len);
- gpsd_transit_fix_dump(session, bufp + strlen(bufp), len - strlen(bufp));
+ gpsd_transit_fix_dump(session, bufp + strlen(bufp),
+ len - strlen(bufp));
}
- if ((session->gpsdata.set & (MODE_SET | DOP_SET | USED_SET | HERR_SET | VERR_SET)) != 0)
- gpsd_binary_quality_dump(session, bufp+strlen(bufp), len-strlen(bufp));
+ if ((session->gpsdata.set
+ & (MODE_IS | DOP_IS | USED_IS | HERR_IS | VERR_IS)) != 0)
+ gpsd_binary_quality_dump(session, bufp + strlen(bufp),
+ len - strlen(bufp));
}
+/* *INDENT-ON* */
void nmea_sky_dump(struct gps_device_t *session,
- /*@out@*/char bufp[], size_t len)
+ /*@out@*/ char bufp[], size_t len)
{
bufp[0] = '\0';
- if ((session->gpsdata.set & SATELLITE_SET) != 0)
- gpsd_binary_satellite_dump(session,bufp+strlen(bufp),len-strlen(bufp));
+ if ((session->gpsdata.set & SATELLITE_IS) != 0)
+ gpsd_binary_satellite_dump(session, bufp + strlen(bufp),
+ len - strlen(bufp));
}
+
/*@+compdef +mustdefine@*/
/* pseudonmea.c ends here */
-
-
diff --git a/regress-driver b/regress-driver
index 1f4829e0..0d281725 100755
--- a/regress-driver
+++ b/regress-driver
@@ -4,6 +4,7 @@
# makefile before we regrouped the regression tests by stable and unstable
# drivers.
+# Arrange to call a gpsfake in the source directory without fuss.
# Add the current directory to $PATH
PATH=`pwd`:$PATH
diff --git a/rtcm2_json.c b/rtcm2_json.c
index 6d73f7dc..87a450fc 100644
--- a/rtcm2_json.c
+++ b/rtcm2_json.c
@@ -24,16 +24,16 @@ PERMISSIONS
/* common fields in every RTCM2 message */
-int json_rtcm2_read(const char *buf,
- char *path, size_t pathlen,
- struct rtcm2_t *rtcm2,
- /*@null@*/const char **endptr)
+int json_rtcm2_read(const char *buf,
+ char *path, size_t pathlen, struct rtcm2_t *rtcm2,
+ /*@null@*/ const char **endptr)
{
static char *stringptrs[NITEMS(rtcm2->words)];
- static char stringstore[sizeof(rtcm2->words)*2];
+ static char stringstore[sizeof(rtcm2->words) * 2];
static int stringcount;
+/* *INDENT-OFF* */
#define RTCM2_HEADER \
{"class", t_check, .dflt.check = "RTCM2"}, \
{"type", t_uinteger, .addr.uinteger = &rtcm2->type}, \
@@ -170,22 +170,27 @@ int json_rtcm2_read(const char *buf,
/*@ +fullinitblock @*/
#undef RTCM2_HEADER
+/* *INDENT-ON* */
memset(rtcm2, '\0', sizeof(struct rtcm2_t));
- if (strstr(buf, "\"type\":1,")!=NULL || strstr(buf, "\"type\":9,")!=NULL) {
+ if (strstr(buf, "\"type\":1,") != NULL
+ || strstr(buf, "\"type\":9,") != NULL) {
status = json_read_object(buf, json_rtcm1, endptr);
if (status == 0)
rtcm2->ranges.nentries = (unsigned)satcount;
} else if (strstr(buf, "\"type\":3,") != NULL) {
status = json_read_object(buf, json_rtcm3, endptr);
if (status == 0) {
- rtcm2->ecef.valid = (isnan(rtcm2->ecef.x)==0)&&(isnan(rtcm2->ecef.y)==0)&&(isnan(rtcm2->ecef.z)==0);
+ rtcm2->ecef.valid = (isnan(rtcm2->ecef.x) == 0)
+ && (isnan(rtcm2->ecef.y) == 0) && (isnan(rtcm2->ecef.z) == 0);
}
} else if (strstr(buf, "\"type\":4,") != NULL) {
status = json_read_object(buf, json_rtcm4, endptr);
if (status == 0)
- rtcm2->reference.valid = (isnan(rtcm2->reference.dx)==0)&&(isnan(rtcm2->reference.dy)==0)&&(isnan(rtcm2->reference.dz)==0);
+ rtcm2->reference.valid = (isnan(rtcm2->reference.dx) == 0)
+ && (isnan(rtcm2->reference.dy) == 0)
+ && (isnan(rtcm2->reference.dz) == 0);
} else if (strstr(buf, "\"type\":5,") != NULL) {
status = json_read_object(buf, json_rtcm5, endptr);
if (status == 0)
@@ -201,18 +206,18 @@ int json_rtcm2_read(const char *buf,
} else {
int n;
status = json_read_object(buf, json_rtcm2_fallback, endptr);
- for (n = 0; n < NITEMS(rtcm2->words); n++)
+ for (n = 0; n < NITEMS(rtcm2->words); n++) {
if (n >= stringcount) {
rtcm2->words[n] = 0;
} else {
unsigned int u;
int fldcount = sscanf(stringptrs[n], "0x%08x\n", &u);
if (fldcount != 1)
- return JSON_ERR_MISC;
- else
- rtcm2->words[n] = (isgps30bits_t)u;
+ return JSON_ERR_MISC;
+ else
+ rtcm2->words[n] = (isgps30bits_t) u;
+ }
}
-
}
return status;
}
diff --git a/serial.c b/serial.c
index 8485d408..15653316 100644
--- a/serial.c
+++ b/serial.c
@@ -28,6 +28,36 @@
# endif /* CNEW_RTSCTS */
#endif /* !CRTSCTS */
+static sourcetype_t gpsd_classify(const char *path)
+/* figure out what kind of device we're looking at */
+{
+ struct stat sb;
+
+ if (stat(path, &sb) == -1)
+ return source_unknown;
+ else if (S_ISREG(sb.st_mode))
+ return source_blockdev;
+ else if (S_ISSOCK(sb.st_mode))
+ return source_socket;
+ else if (S_ISCHR(sb.st_mode)) {
+ sourcetype_t devtype = source_unknown;
+#ifdef __linux__
+ /* Linux major device numbers live here
+ * ftp://ftp.kernel.org/pub/linux/docs/device-list/devices-2.6+.txt
+ */
+ int devmajor = major(sb.st_rdev);
+ if (devmajor == 4)
+ devtype = source_rs232;
+ else if (devmajor == 188)
+ devtype = source_usb;
+ else if (devmajor == 3 || (devmajor >= 136 && devmajor <= 143))
+ devtype = source_pty;
+#endif /* __linux__ */
+ return devtype;
+ } else
+ return source_unknown;
+}
+
void gpsd_tty_init(struct gps_device_t *session)
/* to be called on allocating a device */
{
@@ -39,7 +69,7 @@ void gpsd_tty_init(struct gps_device_t *session)
session->shmindex = -1;
# ifdef PPS_ENABLE
session->shmTimeP = -1;
-# endif /* PPS_ENABLE */
+# endif /* PPS_ENABLE */
#endif /* NTPSHM_ENABLE */
}
@@ -48,37 +78,48 @@ void gpsd_tty_init(struct gps_device_t *session)
/* Pasted from man page; added in serial.c arbitrarily */
void cfmakeraw(struct termios *termios_p)
{
- termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
+ termios_p->c_iflag &=
+ ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
termios_p->c_oflag &= ~OPOST;
- termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
- termios_p->c_cflag &= ~(CSIZE|PARENB);
+ termios_p->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
+ termios_p->c_cflag &= ~(CSIZE | PARENB);
termios_p->c_cflag |= CS8;
}
#endif /* defined(__CYGWIN__) */
-speed_t gpsd_get_speed(const struct termios* ttyctl)
+speed_t gpsd_get_speed(const struct termios *ttyctl)
{
speed_t code = cfgetospeed(ttyctl);
switch (code) {
- case B0: return(0);
- case B300: return(300);
- case B1200: return(1200);
- case B2400: return(2400);
- case B4800: return(4800);
- case B9600: return(9600);
- case B19200: return(19200);
- case B38400: return(38400);
- case B57600: return(57600);
- default: return(115200);
+ case B0:
+ return (0);
+ case B300:
+ return (300);
+ case B1200:
+ return (1200);
+ case B2400:
+ return (2400);
+ case B4800:
+ return (4800);
+ case B9600:
+ return (9600);
+ case B19200:
+ return (19200);
+ case B38400:
+ return (38400);
+ case B57600:
+ return (57600);
+ default:
+ return (115200);
}
}
-bool gpsd_set_raw(struct gps_device_t *session)
+bool gpsd_set_raw(struct gps_device_t * session)
{
(void)cfmakeraw(&session->ttyset);
if (tcsetattr(session->gpsdata.gps_fd, TCIOFLUSH, &session->ttyset) == -1) {
gpsd_report(LOG_ERROR,
- "error changing port attributes: %s\n",strerror(errno));
+ "error changing port attributes: %s\n", strerror(errno));
return false;
}
@@ -86,9 +127,9 @@ bool gpsd_set_raw(struct gps_device_t *session)
}
void gpsd_set_speed(struct gps_device_t *session,
- speed_t speed, char parity, unsigned int stopbits)
+ speed_t speed, char parity, unsigned int stopbits)
{
- speed_t rate;
+ speed_t rate;
/*
* Yes, you can set speeds that aren't in the hunt loop. If you
@@ -98,25 +139,27 @@ void gpsd_set_speed(struct gps_device_t *session,
if (speed < 300)
rate = B0;
else if (speed < 1200)
- rate = B300;
+ rate = B300;
else if (speed < 2400)
- rate = B1200;
+ rate = B1200;
else if (speed < 4800)
- rate = B2400;
+ rate = B2400;
else if (speed < 9600)
- rate = B4800;
+ rate = B4800;
else if (speed < 19200)
- rate = B9600;
+ rate = B9600;
else if (speed < 38400)
- rate = B19200;
+ rate = B19200;
else if (speed < 57600)
- rate = B38400;
+ rate = B38400;
else if (speed < 115200)
- rate = B57600;
+ rate = B57600;
else
- rate = B115200;
+ rate = B115200;
- if (rate!=cfgetispeed(&session->ttyset) || parity!=session->gpsdata.dev.parity || stopbits!=session->gpsdata.dev.stopbits) {
+ if (rate != cfgetispeed(&session->ttyset)
+ || parity != session->gpsdata.dev.parity
+ || stopbits != session->gpsdata.dev.stopbits) {
/*
* Don't mess with this conditional! Speed zero is supposed to mean
@@ -134,11 +177,10 @@ void gpsd_set_speed(struct gps_device_t *session,
(void)cfsetospeed(&session->ttyset, rate);
}
/*@end@*/
- session->ttyset.c_iflag &=~ (PARMRK | INPCK);
- session->ttyset.c_cflag &=~ (CSIZE | CSTOPB | PARENB | PARODD);
- session->ttyset.c_cflag |= (stopbits==2 ? CS7|CSTOPB : CS8);
- switch (parity)
- {
+ session->ttyset.c_iflag &= ~(PARMRK | INPCK);
+ session->ttyset.c_cflag &= ~(CSIZE | CSTOPB | PARENB | PARODD);
+ session->ttyset.c_cflag |= (stopbits == 2 ? CS7 | CSTOPB : CS8);
+ switch (parity) {
case 'E':
case (char)2:
session->ttyset.c_iflag |= INPCK;
@@ -150,7 +192,8 @@ void gpsd_set_speed(struct gps_device_t *session,
session->ttyset.c_cflag |= PARENB | PARODD;
break;
}
- if (tcsetattr(session->gpsdata.gps_fd, TCSANOW, &session->ttyset) != 0)
+ if (tcsetattr(session->gpsdata.gps_fd, TCSANOW, &session->ttyset) !=
+ 0)
return;
/*
@@ -178,7 +221,7 @@ void gpsd_set_speed(struct gps_device_t *session,
* of milliseconds after poking the device port(s).
*
* Problems may arise if the driver's timings are off. Or we may
- * be talking to a USB device like the pl2303 commonly used in GPS
+ * be talking to a USB device like the pl2303 commonly used in GPS
* mice; on these, the change will not happen immediately because
* it has to be sent as a message to the external processor that
* has to act upon it, and that processor may still have buffered
@@ -206,8 +249,9 @@ void gpsd_set_speed(struct gps_device_t *session,
(void)usleep(200000);
(void)tcflush(session->gpsdata.gps_fd, TCIOFLUSH);
}
- gpsd_report(LOG_INF, "speed %u, %d%c%d\n",
- gpsd_get_speed(&session->ttyset), 9-stopbits, parity, stopbits);
+ gpsd_report(LOG_INF, "speed %u, %d%c%d\n",
+ gpsd_get_speed(&session->ttyset), 9 - stopbits, parity,
+ stopbits);
session->gpsdata.dev.baudrate = (unsigned int)speed;
session->gpsdata.dev.parity = parity;
@@ -219,7 +263,8 @@ void gpsd_set_speed(struct gps_device_t *session,
* If we don't know the device type, ship it every driver's wakeup
* in hopes it will respond.
*/
- if (isatty(session->gpsdata.gps_fd)!=0 && !session->context->readonly) {
+ if (isatty(session->gpsdata.gps_fd) != 0
+ && !session->context->readonly) {
const struct gps_type_t **dp;
if (session->device_type == NULL) {
for (dp = gpsd_drivers; *dp; dp++)
@@ -234,42 +279,56 @@ void gpsd_set_speed(struct gps_device_t *session,
int gpsd_open(struct gps_device_t *session)
{
- struct stat sb;
- mode_t mode = (mode_t)O_RDWR;
+ mode_t mode = (mode_t) O_RDWR;
+
+ session->sourcetype = gpsd_classify(session->gpsdata.dev.path);
/*@ -boolops -type @*/
- if (session->context->readonly || ((stat(session->gpsdata.dev.path, &sb) != -1) && ((sb.st_mode & S_IFCHR) != S_IFCHR))) {
- mode = (mode_t)O_RDONLY;
- gpsd_report(LOG_INF, "opening read-only GPS data source at '%s'\n", session->gpsdata.dev.path);
+ if (session->context->readonly
+ || (session->sourcetype <= source_blockdev)) {
+ mode = (mode_t) O_RDONLY;
+ gpsd_report(LOG_INF,
+ "opening read-only GPS data source type %d and at '%s'\n",
+ (int)session->sourcetype, session->gpsdata.dev.path);
} else {
- gpsd_report(LOG_INF, "opening GPS data source at '%s'\n", session->gpsdata.dev.path);
+ gpsd_report(LOG_INF,
+ "opening GPS data source type %d at '%s'\n",
+ (int)session->sourcetype, session->gpsdata.dev.path);
}
/*@ +boolops +type @*/
- if ((session->gpsdata.gps_fd = open(session->gpsdata.dev.path, (int)(mode|O_NONBLOCK|O_NOCTTY))) == -1) {
- gpsd_report(LOG_ERROR, "device open failed: %s - retrying read-only\n", strerror(errno));
- if ((session->gpsdata.gps_fd = open(session->gpsdata.dev.path, O_RDONLY|O_NONBLOCK|O_NOCTTY)) == -1) {
- gpsd_report(LOG_ERROR, "read-only device open failed: %s\n", strerror(errno));
+ if ((session->gpsdata.gps_fd =
+ open(session->gpsdata.dev.path,
+ (int)(mode | O_NONBLOCK | O_NOCTTY))) == -1) {
+ gpsd_report(LOG_ERROR,
+ "device open failed: %s - retrying read-only\n",
+ strerror(errno));
+ if ((session->gpsdata.gps_fd =
+ open(session->gpsdata.dev.path,
+ O_RDONLY | O_NONBLOCK | O_NOCTTY)) == -1) {
+ gpsd_report(LOG_ERROR, "read-only device open failed: %s\n",
+ strerror(errno));
return -1;
}
}
-
#ifdef FIXED_PORT_SPEED
session->saved_baud = FIXED_PORT_SPEED;
#endif
if (session->saved_baud != -1) {
- /*@i@*/(void)cfsetispeed(&session->ttyset, (speed_t)session->saved_baud);
- /*@i@*/(void)cfsetospeed(&session->ttyset, (speed_t)session->saved_baud);
+ /*@i@*/ (void)
+ cfsetispeed(&session->ttyset, (speed_t) session->saved_baud);
+ /*@i@*/ (void)
+ cfsetospeed(&session->ttyset, (speed_t) session->saved_baud);
(void)tcsetattr(session->gpsdata.gps_fd, TCSANOW, &session->ttyset);
(void)tcflush(session->gpsdata.gps_fd, TCIOFLUSH);
}
session->packet.type = BAD_PACKET;
- if (isatty(session->gpsdata.gps_fd)!=0) {
+ if (isatty(session->gpsdata.gps_fd) != 0) {
/* Save original terminal parameters */
- if (tcgetattr(session->gpsdata.gps_fd,&session->ttyset_old) != 0)
- return -1;
+ if (tcgetattr(session->gpsdata.gps_fd, &session->ttyset_old) != 0)
+ return -1;
(void)memcpy(&session->ttyset,
&session->ttyset_old, sizeof(session->ttyset));
/*
@@ -277,7 +336,7 @@ int gpsd_open(struct gps_device_t *session)
* third arg of read(2) says.
*/
/*@ ignore @*/
- memset(session->ttyset.c_cc,0,sizeof(session->ttyset.c_cc));
+ memset(session->ttyset.c_cc, 0, sizeof(session->ttyset.c_cc));
session->ttyset.c_cc[VMIN] = 1;
/*@ end @*/
/*
@@ -287,31 +346,32 @@ int gpsd_open(struct gps_device_t *session)
*/
session->ttyset.c_cflag &= ~(PARENB | PARODD | CRTSCTS);
session->ttyset.c_cflag |= CREAD | CLOCAL;
- session->ttyset.c_iflag = session->ttyset.c_oflag = session->ttyset.c_lflag = (tcflag_t) 0;
+ session->ttyset.c_iflag = session->ttyset.c_oflag =
+ session->ttyset.c_lflag = (tcflag_t) 0;
session->baudindex = 0;
- gpsd_set_speed(session,
- gpsd_get_speed(&session->ttyset_old), 'N', 1);
+ gpsd_set_speed(session, gpsd_get_speed(&session->ttyset_old), 'N', 1);
}
session->is_serial = true;
+ gpsd_report(LOG_SPIN, "open(%s) -> %d in gpsd_open()\n",
+ session->gpsdata.dev.path, session->gpsdata.gps_fd);
return session->gpsdata.gps_fd;
}
-ssize_t gpsd_write(struct gps_device_t *session, void const *buf, size_t len)
+ssize_t gpsd_write(struct gps_device_t * session, void const *buf, size_t len)
{
- ssize_t status;
- bool ok;
- if (session == NULL ||
- session->context == NULL ||
- session->context->readonly)
+ ssize_t status;
+ bool ok;
+ if (session == NULL ||
+ session->context == NULL || session->context->readonly)
return 0;
- status = write(session->gpsdata.gps_fd, buf, len);
- ok = (status == (ssize_t)len);
- (void)tcdrain(session->gpsdata.gps_fd);
- /* no test here now, always print as hex */
- gpsd_report(LOG_IO, "=> GPS: %s%s\n",
- gpsd_hexdump_wrapper(buf, len, LOG_IO), ok?"":" FAILED");
- return status;
+ status = write(session->gpsdata.gps_fd, buf, len);
+ ok = (status == (ssize_t) len);
+ (void)tcdrain(session->gpsdata.gps_fd);
+ /* no test here now, always print as hex */
+ gpsd_report(LOG_IO, "=> GPS: %s%s\n",
+ gpsd_hexdump_wrapper(buf, len, LOG_IO), ok ? "" : " FAILED");
+ return status;
}
/*
@@ -322,23 +382,25 @@ ssize_t gpsd_write(struct gps_device_t *session, void const *buf, size_t len)
*/
#define SNIFF_RETRIES 256
-bool gpsd_next_hunt_setting(struct gps_device_t *session)
+bool gpsd_next_hunt_setting(struct gps_device_t * session)
/* advance to the next hunt setting */
{
#ifdef FIXED_PORT_SPEED
/* just the one fixed port speed... */
- static unsigned int rates[] = {FIXED_PORT_SPEED};
+ static unsigned int rates[] = { FIXED_PORT_SPEED };
#else /* FIXED_PORT_SPEED not defined */
/* every rate we're likely to see on a GPS */
- static unsigned int rates[] = {0, 4800, 9600, 19200, 38400, 57600, 115200};
+ static unsigned int rates[] =
+ { 0, 4800, 9600, 19200, 38400, 57600, 115200 };
#endif /* FIXED_PORT_SPEED defined */
if (session->packet.retry_counter++ >= SNIFF_RETRIES) {
session->packet.retry_counter = 0;
- if (session->baudindex++ >= (unsigned int)(sizeof(rates)/sizeof(rates[0]))-1) {
+ if (session->baudindex++ >=
+ (unsigned int)(sizeof(rates) / sizeof(rates[0])) - 1) {
session->baudindex = 0;
if (session->gpsdata.dev.stopbits++ >= 2)
- return false; /* hunt is over, no sync */
+ return false; /* hunt is over, no sync */
}
gpsd_set_speed(session,
rates[session->baudindex],
@@ -346,7 +408,7 @@ bool gpsd_next_hunt_setting(struct gps_device_t *session)
session->gpsdata.dev.stopbits);
}
- return true; /* keep hunting */
+ return true; /* keep hunting */
}
@@ -369,10 +431,10 @@ void gpsd_assert_sync(struct gps_device_t *session)
*/
gpsd_report(LOG_INF, "NTPD ntpd_link_activate: %d\n",
- (int)session->shmindex >=0 );
+ (int)session->shmindex >= 0);
/* do not start more than one ntp thread */
- if (!(session->shmindex >=0))
- ntpd_link_activate(session);
+ if (!(session->shmindex >= 0))
+ ntpd_link_activate(session);
#endif /* NTPSHM_ENABLE */
}
@@ -381,26 +443,29 @@ void gpsd_close(struct gps_device_t *session)
{
if (session->gpsdata.gps_fd != -1) {
(void)tcdrain(session->gpsdata.gps_fd);
- if (isatty(session->gpsdata.gps_fd)!=0) {
+ if (isatty(session->gpsdata.gps_fd) != 0) {
/* force hangup on close on systems that don't do HUPCL properly */
/*@ ignore @*/
- (void)cfsetispeed(&session->ttyset, (speed_t)B0);
- (void)cfsetospeed(&session->ttyset, (speed_t)B0);
+ (void)cfsetispeed(&session->ttyset, (speed_t) B0);
+ (void)cfsetospeed(&session->ttyset, (speed_t) B0);
/*@ end @*/
- (void)tcsetattr(session->gpsdata.gps_fd,TCSANOW, &session->ttyset);
+ (void)tcsetattr(session->gpsdata.gps_fd, TCSANOW,
+ &session->ttyset);
}
/* this is the clean way to do it */
session->ttyset_old.c_cflag |= HUPCL;
/* keep the most recent baud rate */
/*@ ignore @*/
- (void)cfsetispeed(&session->ttyset_old,
- (speed_t)session->gpsdata.dev.baudrate);
- (void)cfsetospeed(&session->ttyset_old,
- (speed_t)session->gpsdata.dev.baudrate);
+ (void)cfsetispeed(&session->ttyset_old,
+ (speed_t) session->gpsdata.dev.baudrate);
+ (void)cfsetospeed(&session->ttyset_old,
+ (speed_t) session->gpsdata.dev.baudrate);
/*@ end @*/
- (void)tcsetattr(session->gpsdata.gps_fd,TCSANOW,&session->ttyset_old);
+ (void)tcsetattr(session->gpsdata.gps_fd, TCSANOW,
+ &session->ttyset_old);
+ gpsd_report(LOG_SPIN, "close(%d) in gpsd_close(%s)\n",
+ session->gpsdata.gps_fd, session->gpsdata.dev.path);
(void)close(session->gpsdata.gps_fd);
session->gpsdata.gps_fd = -1;
}
}
-
diff --git a/shared_json.c b/shared_json.c
index 79ab00b0..f7a2f9f3 100644
--- a/shared_json.c
+++ b/shared_json.c
@@ -24,11 +24,12 @@ PERMISSIONS
#include "gpsd.h"
#include "gps_json.h"
-int json_device_read(const char *buf,
- /*@out@*/struct devconfig_t *dev,
- /*@null@*/const char **endptr)
+int json_device_read(const char *buf,
+ /*@out@*/ struct devconfig_t *dev,
+ /*@null@*/ const char **endptr)
{
/*@ -fullinitblock @*/
+ /* *INDENT-OFF* */
const struct json_attr_t json_attrs_device[] = {
{"class", t_check, .dflt.check = "DEVICE"},
@@ -54,6 +55,7 @@ int json_device_read(const char *buf,
.dflt.real = NAN},
{NULL},
};
+ /* *INDENT-ON* */
/*@ +fullinitblock @*/
int status;
@@ -64,11 +66,12 @@ int json_device_read(const char *buf,
return 0;
}
-int json_watch_read(const char *buf,
- /*@out@*/struct policy_t *ccp,
- /*@null@*/const char **endptr)
+int json_watch_read(const char *buf,
+ /*@out@*/ struct policy_t *ccp,
+ /*@null@*/ const char **endptr)
{
/*@ -fullinitblock @*/
+ /* *INDENT-OFF* */
struct json_attr_t chanconfig_attrs[] = {
{"class", t_check, .dflt.check = "WATCH"},
@@ -86,6 +89,7 @@ int json_watch_read(const char *buf,
.len = sizeof(ccp->devpath)},
{NULL},
};
+ /* *INDENT-ON* */
/*@ +fullinitblock @*/
int status;
diff --git a/srecord.c b/srecord.c
index 37e7155c..259e0f31 100644
--- a/srecord.c
+++ b/srecord.c
@@ -36,99 +36,103 @@
* bytes are read from bbuf and a ready-to-go srecord is placed in sbuf
*/
int
-bin2srec(unsigned int type, unsigned int offset, unsigned int num, unsigned char *bbuf, unsigned char *sbuf) {
- unsigned char abuf[MAX_BYTES_PER_RECORD*2 + 2], sum;
- size_t len;
-
- if ((num < 1) || (num > MAX_BYTES_PER_RECORD))
- return -1;
-
- len = (size_t)(4 + num + 1);
- memset(abuf, 0, sizeof(abuf));
- hexdump((size_t)num, bbuf, abuf);
- sum = sr_sum((unsigned int)len, offset, bbuf);
- (void)snprintf((char *)sbuf, MAX_BYTES_PER_RECORD*2 + 17,
- "S%u%02X%08X%s%02X\r\n",
- type, (unsigned)len, offset, (char *)abuf, (unsigned)sum);
- return 0;
+bin2srec(unsigned int type, unsigned int offset, unsigned int num,
+ unsigned char *bbuf, unsigned char *sbuf)
+{
+ unsigned char abuf[MAX_BYTES_PER_RECORD * 2 + 2], sum;
+ size_t len;
+
+ if ((num < 1) || (num > MAX_BYTES_PER_RECORD))
+ return -1;
+
+ len = (size_t) (4 + num + 1);
+ memset(abuf, 0, sizeof(abuf));
+ hexdump((size_t) num, bbuf, abuf);
+ sum = sr_sum((unsigned int)len, offset, bbuf);
+ (void)snprintf((char *)sbuf, MAX_BYTES_PER_RECORD * 2 + 17,
+ "S%u%02X%08X%s%02X\r\n",
+ type, (unsigned)len, offset, (char *)abuf, (unsigned)sum);
+ return 0;
}
-int
-srec_hdr(unsigned int num, unsigned char *bbuf, unsigned char *sbuf) {
- return bin2srec(0, 0, num, bbuf, sbuf);
+int srec_hdr(unsigned int num, unsigned char *bbuf, unsigned char *sbuf)
+{
+ return bin2srec(0, 0, num, bbuf, sbuf);
}
-int
-srec_fin(unsigned int num, unsigned char *sbuf) {
- unsigned char bbuf[4], sum;
+int srec_fin(unsigned int num, unsigned char *sbuf)
+{
+ unsigned char bbuf[4], sum;
- memset(bbuf, 0, 4);
+ memset(bbuf, 0, 4);
- bbuf[0] = (unsigned char)(num & 0xff);
- bbuf[1] = (unsigned char)((num >> 8) & 0xff);
- sum = sr_sum(3, 0, bbuf);
- (void)snprintf((char *)sbuf, 13, "S503%04X%02X\r\n", num, (unsigned)sum);
- return 0;
+ bbuf[0] = (unsigned char)(num & 0xff);
+ bbuf[1] = (unsigned char)((num >> 8) & 0xff);
+ sum = sr_sum(3, 0, bbuf);
+ (void)snprintf((char *)sbuf, 13, "S503%04X%02X\r\n", num, (unsigned)sum);
+ return 0;
}
-void
-hexdump(size_t len, unsigned char *bbuf, unsigned char *abuf) {
- size_t i;
+void hexdump(size_t len, unsigned char *bbuf, unsigned char *abuf)
+{
+ size_t i;
- memset(abuf, 0, MAX_BYTES_PER_RECORD*2 + 2);
- if (len > MAX_BYTES_PER_RECORD*2)
- len = MAX_BYTES_PER_RECORD*2;
+ memset(abuf, 0, MAX_BYTES_PER_RECORD * 2 + 2);
+ if (len > MAX_BYTES_PER_RECORD * 2)
+ len = MAX_BYTES_PER_RECORD * 2;
- for(i = 0; i < len; i++) {
- abuf[i*2] = hc((bbuf[i] &0xf0) >> 4);
- abuf[i*2+1] = hc(bbuf[i] &0x0f);
- }
+ for (i = 0; i < len; i++) {
+ abuf[i * 2] = hc((bbuf[i] & 0xf0) >> 4);
+ abuf[i * 2 + 1] = hc(bbuf[i] & 0x0f);
+ }
}
/*@ -type @*/
-unsigned char
-hc(unsigned char x) {
- switch(x) {
- case 15:
- case 14:
- case 13:
- case 12:
- case 11:
- case 10:
- return ('A' + x - 10);
- case 9:
- case 8:
- case 7:
- case 6:
- case 5:
- case 4:
- case 3:
- case 2:
- case 1:
- case 0:
- return ('0' + x);
-
- default:
- return '0';
- }
+unsigned char hc(unsigned char x)
+{
+ switch (x) {
+ case 15:
+ case 14:
+ case 13:
+ case 12:
+ case 11:
+ case 10:
+ return ('A' + x - 10);
+ case 9:
+ case 8:
+ case 7:
+ case 6:
+ case 5:
+ case 4:
+ case 3:
+ case 2:
+ case 1:
+ case 0:
+ return ('0' + x);
+
+ default:
+ return '0';
+ }
}
+
/*@ -type @*/
unsigned char
-sr_sum(unsigned int count, unsigned int addr, unsigned char *bbuf) {
- int i, j;
- unsigned char k, sum = 0;
-
- sum = (count & 0xff);
- sum += ((addr & 0x000000ff));
- sum += ((addr & 0x0000ff00) >> 8);
- sum += ((addr & 0x00ff0000) >> 16);
- sum += ((addr & 0xff000000) >> 24);
- j = count - 5;
- for(i = 0; i < j; i++) {
- k = bbuf[i];
- sum += k;
- }
- return ~sum;
+sr_sum(unsigned int count, unsigned int addr, unsigned char *bbuf)
+{
+ int i, j;
+ unsigned char k, sum = 0;
+
+ sum = (count & 0xff);
+ sum += ((addr & 0x000000ff));
+ sum += ((addr & 0x0000ff00) >> 8);
+ sum += ((addr & 0x00ff0000) >> 16);
+ sum += ((addr & 0xff000000) >> 24);
+ j = count - 5;
+ for (i = 0; i < j; i++) {
+ k = bbuf[i];
+ sum += k;
+ }
+ return ~sum;
}
diff --git a/strl.c b/strl.c
index 214f1617..0111bf14 100644
--- a/strl.c
+++ b/strl.c
@@ -37,33 +37,33 @@
* If retval >= siz, truncation occurred.
*/
/*@ -usedef -mustdefine @*/
-size_t
-strlcat(char *dst, const char *src, size_t siz)
+size_t strlcat(char *dst, const char *src, size_t siz)
{
- char *d = dst;
- const char *s = src;
- size_t n = siz;
- size_t dlen;
+ char *d = dst;
+ const char *s = src;
+ size_t n = siz;
+ size_t dlen;
- /* Find the end of dst and adjust bytes left but don't go past end */
- while (n-- != 0 && *d != '\0')
- d++;
- dlen = (size_t)(d - dst);
- n = siz - dlen;
+ /* Find the end of dst and adjust bytes left but don't go past end */
+ while (n-- != 0 && *d != '\0')
+ d++;
+ dlen = (size_t) (d - dst);
+ n = siz - dlen;
- if (n == 0)
- return(dlen + strlen(s));
- while (*s != '\0') {
- if (n != 1) {
- *d++ = *s;
- n--;
- }
- s++;
+ if (n == 0)
+ return (dlen + strlen(s));
+ while (*s != '\0') {
+ if (n != 1) {
+ *d++ = *s;
+ n--;
}
- *d = '\0';
+ s++;
+ }
+ *d = '\0';
- return(dlen + (s - src)); /* count does not include NUL */
+ return (dlen + (s - src)); /* count does not include NUL */
}
+
/*@ +usedef +mustdefine @*/
#endif /* HAVE_STRLCAT */
@@ -91,29 +91,28 @@ strlcat(char *dst, const char *src, size_t siz)
* will be copied. Always NUL terminates (unless siz == 0).
* Returns strlen(src); if retval >= siz, truncation occurred.
*/
-size_t
-strlcpy(char *dst, const char *src, size_t siz)
+size_t strlcpy(char *dst, const char *src, size_t siz)
{
- char *d = dst;
- const char *s = src;
- size_t n = siz;
+ char *d = dst;
+ const char *s = src;
+ size_t n = siz;
- /* Copy as many bytes as will fit */
- if (n != 0) {
- while (--n != 0) {
- if ((*d++ = *s++) == '\0')
- break;
- }
+ /* Copy as many bytes as will fit */
+ if (n != 0) {
+ while (--n != 0) {
+ if ((*d++ = *s++) == '\0')
+ break;
}
+ }
- /* Not enough room in dst, add NUL and traverse rest of src */
- if (n == 0) {
- if (siz != 0)
- *d = '\0'; /* NUL-terminate dst */
- while (*s++ != '\0')
- continue;
- }
+ /* Not enough room in dst, add NUL and traverse rest of src */
+ if (n == 0) {
+ if (siz != 0)
+ *d = '\0'; /* NUL-terminate dst */
+ while (*s++ != '\0')
+ continue;
+ }
- return((size_t)(s - src - 1)); /* count does not include NUL */
+ return ((size_t) (s - src - 1)); /* count does not include NUL */
}
#endif /* HAVE_STRLCPY */
diff --git a/subframe.c b/subframe.c
index 38dd4331..c1b66851 100644
--- a/subframe.c
+++ b/subframe.c
@@ -9,12 +9,20 @@
#include "timebase.h"
#if 0
-static char sf4map[] = {-1, 57, 25, 26, 27, 28, 57, 29, 30, 31, 32, 57, 62, 52, 53, 54, 57, 55, 56, 58, 59, 57, 60, 61, 62, 63};
-static char sf5map[] = {-1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 51};
+static char sf4map[] =
+ { -1, 57, 25, 26, 27, 28, 57, 29, 30, 31, 32, 57, 62, 52, 53, 54, 57, 55,
+ 56, 58, 59, 57, 60, 61, 62, 63
+};
+
+static char sf5map[] =
+ { -1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 51
+};
#endif
/*@ -usedef @*/
-void gpsd_interpret_subframe(struct gps_device_t *session,unsigned int words[])
+void gpsd_interpret_subframe(struct gps_device_t *session,
+ unsigned int words[])
/* extract leap-second from RTCM-104 subframe data */
{
/*
@@ -32,8 +40,8 @@ void gpsd_interpret_subframe(struct gps_device_t *session,unsigned int words[])
* capability to read subframe data may want it.
*/
unsigned int pageid, subframe, data_id, leap;
- gpsd_report(LOG_IO,
- "50B (raw): %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x\n",
+ gpsd_report(LOG_PROG,
+ "50B: (raw) %06x %06x %06x %06x %06x %06x %06x %06x %06x %06x\n",
words[0], words[1], words[2], words[3], words[4],
words[5], words[6], words[7], words[8], words[9]);
/*
@@ -51,15 +59,12 @@ void gpsd_interpret_subframe(struct gps_device_t *session,unsigned int words[])
*/
pageid = (words[2] & 0x3F0000) >> 16;
data_id = (words[2] >> 22) & 0x3;
- gpsd_report(LOG_PROG, "Subframe %d SVID %d data_id %d\n", subframe, pageid, data_id);
- /* we're not interested in anything but subframe 4 - for now*/
+ gpsd_report(LOG_PROG, "50B: Subframe %d SVID %d data_id %d\n", subframe,
+ pageid, data_id);
+ /* we're not interested in anything but subframe 4 - for now */
if (subframe != 4)
return;
- /* once we've filtered, we can ignore the TEL and HOW words */
- gpsd_report(LOG_PROG, "50B: %06x %06x %06x %06x %06x %06x %06x %06x\n",
- words[2], words[3], words[4], words[5],
- words[6], words[7], words[8], words[9]);
- switch(pageid) {
+ switch (pageid) {
case 55:
/*
* "The requisite 176 bits shall occupy bits 9 through 24 of word
@@ -68,7 +73,7 @@ void gpsd_interpret_subframe(struct gps_device_t *session,unsigned int words[])
*
* Since we've already stripped the low six parity bits, and shifted
* the data to a byte boundary, we can just copy it out. */
- {
+ {
char str[24];
int j = 0;
/*@ -type @*/
@@ -103,8 +108,8 @@ void gpsd_interpret_subframe(struct gps_device_t *session,unsigned int words[])
str[j++] = (words[9] >> 8) & 0xff;
str[j++] = '\0';
/*@ +type @*/
- gpsd_report(LOG_INF, "gps system message is %s\n", str);
- }
+ gpsd_report(LOG_INF, "50B: gps system message is %s\n", str);
+ }
break;
case 56:
leap = (words[8] & 0xff0000) >> 16;
@@ -138,20 +143,20 @@ void gpsd_interpret_subframe(struct gps_device_t *session,unsigned int words[])
*/
if (leap > 128)
leap ^= 0xff;
- if ( LEAP_SECONDS > leap ) {
+ if (LEAP_SECONDS > leap) {
/* something wrong */
- gpsd_report(LOG_ERROR, "Invalid leap_seconds: %d\n",
- leap);
+ gpsd_report(LOG_ERROR, "50B: Invalid leap_seconds: %d\n", leap);
leap = LEAP_SECONDS;
session->context->valid &= ~LEAP_SECOND_VALID;
} else {
- gpsd_report(LOG_INF, "leap-seconds is %d\n", leap);
+ gpsd_report(LOG_INF, "50B: leap-seconds is %d\n", leap);
session->context->valid |= LEAP_SECOND_VALID;
}
session->context->leap_seconds = (int)leap;
break;
default:
- ; /* no op */
+ ; /* no op */
}
}
+
/*@ +usedef @*/
diff --git a/test/daemon/ac12.log.chk b/test/daemon/ac12.log.chk
index 5ac6efd2..c8dede65 100644
--- a/test/daemon/ac12.log.chk
+++ b/test/daemon/ac12.log.chk
@@ -5,7 +5,7 @@ $GPGSA,A,3,10,28,09,13,,,,,,,,,03.4,01.7,03.0*00
$GPGSV,3,1,12,28,14,150,41,09,15,254,41,10,43,192,47,13,06,081,36*7A
$GPGSV,3,2,12,02,56,323,,04,41,024,,12,31,317,,17,31,085,*72
$GPGSV,3,3,12,05,15,318,,24,02,246,,33,08,096,,35,45,118,*7D
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.70,"pdop":3.40,"satellites":[{"PRN":28,"el":14,"az":150,"ss":41,"used":true},{"PRN":9,"el":15,"az":254,"ss":41,"used":true},{"PRN":10,"el":43,"az":192,"ss":47,"used":true},{"PRN":13,"el":6,"az":81,"ss":36,"used":true},{"PRN":2,"el":56,"az":323,"ss":0,"used":false},{"PRN":4,"el":41,"az":24,"ss":0,"used":false},{"PRN":12,"el":31,"az":317,"ss":0,"used":false},{"PRN":17,"el":31,"az":85,"ss":0,"used":false},{"PRN":5,"el":15,"az":318,"ss":0,"used":false},{"PRN":24,"el":2,"az":246,"ss":0,"used":false},{"PRN":33,"el":8,"az":96,"ss":0,"used":false},{"PRN":35,"el":45,"az":118,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.76,"ydop":1.60,"vdop":3.00,"tdop":0.99,"hdop":1.70,"gdop":3.70,"pdop":3.40,"satellites":[{"PRN":28,"el":14,"az":150,"ss":41,"used":true},{"PRN":9,"el":15,"az":254,"ss":41,"used":true},{"PRN":10,"el":43,"az":192,"ss":47,"used":true},{"PRN":13,"el":6,"az":81,"ss":36,"used":true},{"PRN":2,"el":56,"az":323,"ss":0,"used":false},{"PRN":4,"el":41,"az":24,"ss":0,"used":false},{"PRN":12,"el":31,"az":317,"ss":0,"used":false},{"PRN":17,"el":31,"az":85,"ss":0,"used":false},{"PRN":5,"el":15,"az":318,"ss":0,"used":false},{"PRN":24,"el":2,"az":246,"ss":0,"used":false},{"PRN":33,"el":8,"az":96,"ss":0,"used":false},{"PRN":35,"el":45,"az":118,"ss":0,"used":false}]}
$GPRMC,193221.00,A,2037.7279,N,08704.0848,W,00.1,201.8,231207,01,W,A*2D
{"class":"TPV","tag":"RMC","time":1198438341.000,"ept":0.005,"lat":20.628798333,"lon":-87.068080000,"alt":-30.400,"epx":11.444,"epy":24.060,"epv":69.000,"track":201.8000,"speed":0.051,"mode":3}
$GPZDA,193223.00,23,12,2007,00,00*69
@@ -14,7 +14,7 @@ $GPGSA,A,3,10,09,28,13,,,,,,,,,03.4,01.7,03.0*00
$GPGSV,3,1,12,28,14,150,40,09,15,254,41,10,43,192,47,13,06,081,36*7B
$GPGSV,3,2,12,02,56,323,,04,41,024,,12,31,317,,17,31,085,*72
$GPGSV,3,3,12,05,15,318,,24,02,246,,33,08,096,39,35,45,118,*77
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.70,"pdop":3.40,"satellites":[{"PRN":28,"el":14,"az":150,"ss":40,"used":true},{"PRN":9,"el":15,"az":254,"ss":41,"used":true},{"PRN":10,"el":43,"az":192,"ss":47,"used":true},{"PRN":13,"el":6,"az":81,"ss":36,"used":true},{"PRN":2,"el":56,"az":323,"ss":0,"used":false},{"PRN":4,"el":41,"az":24,"ss":0,"used":false},{"PRN":12,"el":31,"az":317,"ss":0,"used":false},{"PRN":17,"el":31,"az":85,"ss":0,"used":false},{"PRN":5,"el":15,"az":318,"ss":0,"used":false},{"PRN":24,"el":2,"az":246,"ss":0,"used":false},{"PRN":33,"el":8,"az":96,"ss":39,"used":false},{"PRN":35,"el":45,"az":118,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.76,"ydop":1.60,"vdop":3.00,"tdop":0.99,"hdop":1.70,"gdop":3.70,"pdop":3.40,"satellites":[{"PRN":28,"el":14,"az":150,"ss":40,"used":true},{"PRN":9,"el":15,"az":254,"ss":41,"used":true},{"PRN":10,"el":43,"az":192,"ss":47,"used":true},{"PRN":13,"el":6,"az":81,"ss":36,"used":true},{"PRN":2,"el":56,"az":323,"ss":0,"used":false},{"PRN":4,"el":41,"az":24,"ss":0,"used":false},{"PRN":12,"el":31,"az":317,"ss":0,"used":false},{"PRN":17,"el":31,"az":85,"ss":0,"used":false},{"PRN":5,"el":15,"az":318,"ss":0,"used":false},{"PRN":24,"el":2,"az":246,"ss":0,"used":false},{"PRN":33,"el":8,"az":96,"ss":39,"used":false},{"PRN":35,"el":45,"az":118,"ss":0,"used":false}]}
$GPRMC,193222.00,A,2037.7283,N,08704.0847,W,00.0,201.8,231207,01,W,A*25
{"class":"TPV","tag":"RMC","time":1198438342.000,"ept":0.005,"lat":20.628805000,"lon":-87.068078333,"alt":-30.000,"epx":11.444,"epy":24.060,"epv":69.000,"track":201.8000,"speed":0.000,"climb":-0.400,"mode":3}
$GPZDA,193224.00,23,12,2007,00,00*6E
@@ -23,7 +23,7 @@ $GPGSA,A,3,10,09,28,13,,,,,,,,,03.4,01.7,03.0*00
$GPGSV,3,1,12,28,14,150,39,09,15,254,41,10,43,192,47,13,06,081,36*75
$GPGSV,3,2,12,02,56,323,,04,41,024,,12,31,317,,17,31,085,*72
$GPGSV,3,3,12,05,15,318,,24,02,246,,33,08,096,,35,45,118,*7D
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.70,"pdop":3.40,"satellites":[{"PRN":28,"el":14,"az":150,"ss":39,"used":true},{"PRN":9,"el":15,"az":254,"ss":41,"used":true},{"PRN":10,"el":43,"az":192,"ss":47,"used":true},{"PRN":13,"el":6,"az":81,"ss":36,"used":true},{"PRN":2,"el":56,"az":323,"ss":0,"used":false},{"PRN":4,"el":41,"az":24,"ss":0,"used":false},{"PRN":12,"el":31,"az":317,"ss":0,"used":false},{"PRN":17,"el":31,"az":85,"ss":0,"used":false},{"PRN":5,"el":15,"az":318,"ss":0,"used":false},{"PRN":24,"el":2,"az":246,"ss":0,"used":false},{"PRN":33,"el":8,"az":96,"ss":0,"used":false},{"PRN":35,"el":45,"az":118,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.76,"ydop":1.60,"vdop":3.00,"tdop":0.99,"hdop":1.70,"gdop":3.70,"pdop":3.40,"satellites":[{"PRN":28,"el":14,"az":150,"ss":39,"used":true},{"PRN":9,"el":15,"az":254,"ss":41,"used":true},{"PRN":10,"el":43,"az":192,"ss":47,"used":true},{"PRN":13,"el":6,"az":81,"ss":36,"used":true},{"PRN":2,"el":56,"az":323,"ss":0,"used":false},{"PRN":4,"el":41,"az":24,"ss":0,"used":false},{"PRN":12,"el":31,"az":317,"ss":0,"used":false},{"PRN":17,"el":31,"az":85,"ss":0,"used":false},{"PRN":5,"el":15,"az":318,"ss":0,"used":false},{"PRN":24,"el":2,"az":246,"ss":0,"used":false},{"PRN":33,"el":8,"az":96,"ss":0,"used":false},{"PRN":35,"el":45,"az":118,"ss":0,"used":false}]}
$GPRMC,193223.00,A,2037.7288,N,08704.0846,W,00.1,201.8,231207,01,W,A*2F
{"class":"TPV","tag":"RMC","time":1198438343.000,"ept":0.005,"lat":20.628813333,"lon":-87.068076667,"alt":-29.550,"epx":11.444,"epy":24.060,"epv":69.000,"track":201.8000,"speed":0.051,"climb":-0.450,"mode":3}
$GPZDA,193225.00,23,12,2007,00,00*6F
@@ -32,7 +32,7 @@ $GPGSA,A,3,10,09,28,13,,,,,,,,,03.4,01.7,03.0*00
$GPGSV,3,1,12,28,14,150,39,09,15,254,41,10,43,192,47,13,06,081,36*75
$GPGSV,3,2,12,02,56,323,,04,41,024,,12,31,317,,17,31,085,*72
$GPGSV,3,3,12,05,15,318,,24,02,246,,33,08,096,,35,45,118,*7D
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.70,"pdop":3.40,"satellites":[{"PRN":28,"el":14,"az":150,"ss":39,"used":true},{"PRN":9,"el":15,"az":254,"ss":41,"used":true},{"PRN":10,"el":43,"az":192,"ss":47,"used":true},{"PRN":13,"el":6,"az":81,"ss":36,"used":true},{"PRN":2,"el":56,"az":323,"ss":0,"used":false},{"PRN":4,"el":41,"az":24,"ss":0,"used":false},{"PRN":12,"el":31,"az":317,"ss":0,"used":false},{"PRN":17,"el":31,"az":85,"ss":0,"used":false},{"PRN":5,"el":15,"az":318,"ss":0,"used":false},{"PRN":24,"el":2,"az":246,"ss":0,"used":false},{"PRN":33,"el":8,"az":96,"ss":0,"used":false},{"PRN":35,"el":45,"az":118,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.76,"ydop":1.60,"vdop":3.00,"tdop":0.99,"hdop":1.70,"gdop":3.70,"pdop":3.40,"satellites":[{"PRN":28,"el":14,"az":150,"ss":39,"used":true},{"PRN":9,"el":15,"az":254,"ss":41,"used":true},{"PRN":10,"el":43,"az":192,"ss":47,"used":true},{"PRN":13,"el":6,"az":81,"ss":36,"used":true},{"PRN":2,"el":56,"az":323,"ss":0,"used":false},{"PRN":4,"el":41,"az":24,"ss":0,"used":false},{"PRN":12,"el":31,"az":317,"ss":0,"used":false},{"PRN":17,"el":31,"az":85,"ss":0,"used":false},{"PRN":5,"el":15,"az":318,"ss":0,"used":false},{"PRN":24,"el":2,"az":246,"ss":0,"used":false},{"PRN":33,"el":8,"az":96,"ss":0,"used":false},{"PRN":35,"el":45,"az":118,"ss":0,"used":false}]}
$GPRMC,193224.00,A,2037.7291,N,08704.0845,W,00.0,201.8,231207,01,W,A*22
{"class":"TPV","tag":"RMC","time":1198438344.000,"ept":0.005,"lat":20.628818333,"lon":-87.068075000,"alt":-29.530,"epx":11.444,"epy":24.060,"epv":69.000,"track":201.8000,"speed":0.000,"climb":-0.020,"mode":3}
$GPZDA,193226.00,23,12,2007,00,00*6C
@@ -42,7 +42,7 @@ $GPGSV,4,1,13,28,13,151,39,09,15,253,42,10,43,192,48,13,06,081,36*7E
$GPGSV,4,2,13,02,56,325,,04,41,024,,12,32,317,,17,30,086,*73
$GPGSV,4,3,13,05,16,318,,24,03,247,,30,00,323,,33,08,096,*76
$GPGSV,4,4,13,35,45,118,*44
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.70,"pdop":3.40,"satellites":[{"PRN":28,"el":13,"az":151,"ss":39,"used":true},{"PRN":9,"el":15,"az":253,"ss":42,"used":true},{"PRN":10,"el":43,"az":192,"ss":48,"used":true},{"PRN":13,"el":6,"az":81,"ss":36,"used":true},{"PRN":2,"el":56,"az":325,"ss":0,"used":false},{"PRN":4,"el":41,"az":24,"ss":0,"used":false},{"PRN":12,"el":32,"az":317,"ss":0,"used":false},{"PRN":17,"el":30,"az":86,"ss":0,"used":false},{"PRN":5,"el":16,"az":318,"ss":0,"used":false},{"PRN":24,"el":3,"az":247,"ss":0,"used":false},{"PRN":30,"el":0,"az":323,"ss":0,"used":false},{"PRN":33,"el":8,"az":96,"ss":0,"used":false},{"PRN":35,"el":45,"az":118,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.77,"ydop":1.55,"vdop":3.00,"tdop":0.98,"hdop":1.70,"gdop":3.58,"pdop":3.40,"satellites":[{"PRN":28,"el":13,"az":151,"ss":39,"used":true},{"PRN":9,"el":15,"az":253,"ss":42,"used":true},{"PRN":10,"el":43,"az":192,"ss":48,"used":true},{"PRN":13,"el":6,"az":81,"ss":36,"used":true},{"PRN":2,"el":56,"az":325,"ss":0,"used":false},{"PRN":4,"el":41,"az":24,"ss":0,"used":false},{"PRN":12,"el":32,"az":317,"ss":0,"used":false},{"PRN":17,"el":30,"az":86,"ss":0,"used":false},{"PRN":5,"el":16,"az":318,"ss":0,"used":false},{"PRN":24,"el":3,"az":247,"ss":0,"used":false},{"PRN":30,"el":0,"az":323,"ss":0,"used":false},{"PRN":33,"el":8,"az":96,"ss":0,"used":false},{"PRN":35,"el":45,"az":118,"ss":0,"used":false}]}
$GPRMC,193225.00,A,2037.7295,N,08704.0844,W,00.1,201.8,231207,01,W,A*27
{"class":"TPV","tag":"RMC","time":1198438345.000,"ept":0.005,"lat":20.628825000,"lon":-87.068073333,"alt":-29.210,"epx":11.444,"epy":24.060,"epv":69.000,"track":201.8000,"speed":0.051,"climb":-0.320,"mode":3}
$GPZDA,193227.00,23,12,2007,00,00*6D
@@ -52,7 +52,7 @@ $GPGSV,4,1,13,28,13,151,41,09,15,253,41,10,43,192,48,13,06,081,36*72
$GPGSV,4,2,13,02,56,325,,04,41,024,,12,32,317,,17,30,086,*73
$GPGSV,4,3,13,05,16,318,,24,03,247,,30,00,323,,33,08,096,*76
$GPGSV,4,4,13,35,45,118,*44
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.70,"pdop":3.40,"satellites":[{"PRN":28,"el":13,"az":151,"ss":41,"used":true},{"PRN":9,"el":15,"az":253,"ss":41,"used":true},{"PRN":10,"el":43,"az":192,"ss":48,"used":true},{"PRN":13,"el":6,"az":81,"ss":36,"used":true},{"PRN":2,"el":56,"az":325,"ss":0,"used":false},{"PRN":4,"el":41,"az":24,"ss":0,"used":false},{"PRN":12,"el":32,"az":317,"ss":0,"used":false},{"PRN":17,"el":30,"az":86,"ss":0,"used":false},{"PRN":5,"el":16,"az":318,"ss":0,"used":false},{"PRN":24,"el":3,"az":247,"ss":0,"used":false},{"PRN":30,"el":0,"az":323,"ss":0,"used":false},{"PRN":33,"el":8,"az":96,"ss":0,"used":false},{"PRN":35,"el":45,"az":118,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.77,"ydop":1.55,"vdop":3.00,"tdop":0.98,"hdop":1.70,"gdop":3.58,"pdop":3.40,"satellites":[{"PRN":28,"el":13,"az":151,"ss":41,"used":true},{"PRN":9,"el":15,"az":253,"ss":41,"used":true},{"PRN":10,"el":43,"az":192,"ss":48,"used":true},{"PRN":13,"el":6,"az":81,"ss":36,"used":true},{"PRN":2,"el":56,"az":325,"ss":0,"used":false},{"PRN":4,"el":41,"az":24,"ss":0,"used":false},{"PRN":12,"el":32,"az":317,"ss":0,"used":false},{"PRN":17,"el":30,"az":86,"ss":0,"used":false},{"PRN":5,"el":16,"az":318,"ss":0,"used":false},{"PRN":24,"el":3,"az":247,"ss":0,"used":false},{"PRN":30,"el":0,"az":323,"ss":0,"used":false},{"PRN":33,"el":8,"az":96,"ss":0,"used":false},{"PRN":35,"el":45,"az":118,"ss":0,"used":false}]}
$GPRMC,193226.00,A,2037.7299,N,08704.0843,W,00.1,201.8,231207,01,W,A*2F
{"class":"TPV","tag":"RMC","time":1198438346.000,"ept":0.005,"lat":20.628831667,"lon":-87.068071667,"alt":-28.690,"epx":11.544,"epy":23.220,"epv":69.000,"track":201.8000,"speed":0.051,"climb":-0.520,"mode":3}
$GPZDA,193228.00,23,12,2007,00,00*62
@@ -62,6 +62,6 @@ $GPGSV,4,1,13,28,13,151,41,09,15,253,41,10,43,192,48,13,06,081,36*72
$GPGSV,4,2,13,02,56,325,,04,41,024,,12,32,317,,17,30,086,*73
$GPGSV,4,3,13,05,16,318,,24,03,247,,30,00,323,,33,08,096,*76
$GPGSV,4,4,13,35,45,118,*44
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.70,"pdop":3.40,"satellites":[{"PRN":28,"el":13,"az":151,"ss":41,"used":true},{"PRN":9,"el":15,"az":253,"ss":41,"used":true},{"PRN":10,"el":43,"az":192,"ss":48,"used":true},{"PRN":13,"el":6,"az":81,"ss":36,"used":true},{"PRN":2,"el":56,"az":325,"ss":0,"used":false},{"PRN":4,"el":41,"az":24,"ss":0,"used":false},{"PRN":12,"el":32,"az":317,"ss":0,"used":false},{"PRN":17,"el":30,"az":86,"ss":0,"used":false},{"PRN":5,"el":16,"az":318,"ss":0,"used":false},{"PRN":24,"el":3,"az":247,"ss":0,"used":false},{"PRN":30,"el":0,"az":323,"ss":0,"used":false},{"PRN":33,"el":8,"az":96,"ss":0,"used":false},{"PRN":35,"el":45,"az":118,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.77,"ydop":1.55,"vdop":3.00,"tdop":0.98,"hdop":1.70,"gdop":3.58,"pdop":3.40,"satellites":[{"PRN":28,"el":13,"az":151,"ss":41,"used":true},{"PRN":9,"el":15,"az":253,"ss":41,"used":true},{"PRN":10,"el":43,"az":192,"ss":48,"used":true},{"PRN":13,"el":6,"az":81,"ss":36,"used":true},{"PRN":2,"el":56,"az":325,"ss":0,"used":false},{"PRN":4,"el":41,"az":24,"ss":0,"used":false},{"PRN":12,"el":32,"az":317,"ss":0,"used":false},{"PRN":17,"el":30,"az":86,"ss":0,"used":false},{"PRN":5,"el":16,"az":318,"ss":0,"used":false},{"PRN":24,"el":3,"az":247,"ss":0,"used":false},{"PRN":30,"el":0,"az":323,"ss":0,"used":false},{"PRN":33,"el":8,"az":96,"ss":0,"used":false},{"PRN":35,"el":45,"az":118,"ss":0,"used":false}]}
$GPRMC,193227.00,A,2037.7303,N,08704.0842,W,00.0,201.8,231207,01,W,A*2C
{"class":"TPV","tag":"RMC","time":1198438347.000,"ept":0.005,"lat":20.628838333,"lon":-87.068070000,"alt":-28.280,"epx":11.544,"epy":23.220,"epv":69.000,"track":201.8000,"speed":0.000,"climb":-0.410,"mode":3}
diff --git a/test/daemon/blumax-gps009.log.chk b/test/daemon/blumax-gps009.log.chk
index 2d3f4a0e..1a941eb8 100644
--- a/test/daemon/blumax-gps009.log.chk
+++ b/test/daemon/blumax-gps009.log.chk
@@ -40,16 +40,16 @@ $GPGSA,A,1,26,22,12,15,,,,,,,,,,,*1D
$GPGSV,3,1,12,12,48,233,28,17,39,066,,15,29,172,33,22,19,290,23*7A
$GPGSV,3,2,12,26,17,161,31,09,81,300,,05,32,240,23,29,31,171,*73
$GPGSV,3,3,12,18,15,251,,14,14,319,,28,08,059,,30,08,239,*77
-{"class":"SKY","tag":"GSV","vdop":0.00,"hdop":0.00,"pdop":0.00,"satellites":[{"PRN":12,"el":48,"az":233,"ss":28,"used":true},{"PRN":17,"el":39,"az":66,"ss":0,"used":false},{"PRN":15,"el":29,"az":172,"ss":33,"used":true},{"PRN":22,"el":19,"az":290,"ss":23,"used":true},{"PRN":26,"el":17,"az":161,"ss":31,"used":true},{"PRN":9,"el":81,"az":300,"ss":0,"used":false},{"PRN":5,"el":32,"az":240,"ss":23,"used":false},{"PRN":29,"el":31,"az":171,"ss":0,"used":false},{"PRN":18,"el":15,"az":251,"ss":0,"used":false},{"PRN":14,"el":14,"az":319,"ss":0,"used":false},{"PRN":28,"el":8,"az":59,"ss":0,"used":false},{"PRN":30,"el":8,"az":239,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.88,"ydop":1.02,"vdop":0.00,"tdop":2.01,"hdop":0.00,"gdop":4.28,"pdop":0.00,"satellites":[{"PRN":12,"el":48,"az":233,"ss":28,"used":true},{"PRN":17,"el":39,"az":66,"ss":0,"used":false},{"PRN":15,"el":29,"az":172,"ss":33,"used":true},{"PRN":22,"el":19,"az":290,"ss":23,"used":true},{"PRN":26,"el":17,"az":161,"ss":31,"used":true},{"PRN":9,"el":81,"az":300,"ss":0,"used":false},{"PRN":5,"el":32,"az":240,"ss":23,"used":false},{"PRN":29,"el":31,"az":171,"ss":0,"used":false},{"PRN":18,"el":15,"az":251,"ss":0,"used":false},{"PRN":14,"el":14,"az":319,"ss":0,"used":false},{"PRN":28,"el":8,"az":59,"ss":0,"used":false},{"PRN":30,"el":8,"az":239,"ss":0,"used":false}]}
$GPRMC,142818.899,V,5201.0687,N,00832.0645,E,,,180708,,,N*7F
$GPGGA,142819.299,5201.0809,N,00832.0852,E,1,04,4.9,32.1,M,47.2,M,,0000*60
$GPGLL,5201.0809,N,00832.0852,E,142819.299,A,A*5D
-{"class":"TPV","tag":"GLL","lat":52.018015000,"lon":8.534753333,"alt":32.100,"epv":0.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":52.018015000,"lon":8.534753333,"alt":32.100,"epx":13.168,"epy":15.284,"epv":0.000,"mode":3}
$GPGSA,A,3,26,22,12,15,,,,,,,,,5.0,4.9,1.0*38
$GPGSV,3,1,12,12,48,233,29,17,39,066,,15,29,172,35,22,19,290,22*7C
$GPGSV,3,2,12,26,17,161,31,09,81,300,,05,32,240,24,29,31,171,*74
$GPGSV,3,3,12,18,15,251,,14,14,319,,28,08,059,,30,08,239,*77
-{"class":"SKY","tag":"GSV","vdop":1.00,"hdop":4.90,"pdop":5.00,"satellites":[{"PRN":12,"el":48,"az":233,"ss":29,"used":true},{"PRN":17,"el":39,"az":66,"ss":0,"used":false},{"PRN":15,"el":29,"az":172,"ss":35,"used":true},{"PRN":22,"el":19,"az":290,"ss":22,"used":true},{"PRN":26,"el":17,"az":161,"ss":31,"used":true},{"PRN":9,"el":81,"az":300,"ss":0,"used":false},{"PRN":5,"el":32,"az":240,"ss":24,"used":false},{"PRN":29,"el":31,"az":171,"ss":0,"used":false},{"PRN":18,"el":15,"az":251,"ss":0,"used":false},{"PRN":14,"el":14,"az":319,"ss":0,"used":false},{"PRN":28,"el":8,"az":59,"ss":0,"used":false},{"PRN":30,"el":8,"az":239,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.88,"ydop":1.02,"vdop":1.00,"tdop":2.01,"hdop":4.90,"gdop":4.28,"pdop":5.00,"satellites":[{"PRN":12,"el":48,"az":233,"ss":29,"used":true},{"PRN":17,"el":39,"az":66,"ss":0,"used":false},{"PRN":15,"el":29,"az":172,"ss":35,"used":true},{"PRN":22,"el":19,"az":290,"ss":22,"used":true},{"PRN":26,"el":17,"az":161,"ss":31,"used":true},{"PRN":9,"el":81,"az":300,"ss":0,"used":false},{"PRN":5,"el":32,"az":240,"ss":24,"used":false},{"PRN":29,"el":31,"az":171,"ss":0,"used":false},{"PRN":18,"el":15,"az":251,"ss":0,"used":false},{"PRN":14,"el":14,"az":319,"ss":0,"used":false},{"PRN":28,"el":8,"az":59,"ss":0,"used":false},{"PRN":30,"el":8,"az":239,"ss":0,"used":false}]}
$GPRMC,142819.299,A,5201.0809,N,00832.0852,E,0.87,249.59,180708,,,A*60
$GPZDA,143054.000,18,07,2008,,*55
$GPGGA,143054.000,5201.1302,N,00832.1652,E,1,05,1.2,72.2,M,47.2,M,,0000*64
@@ -59,7 +59,7 @@ $GPGSA,A,3,26,17,22,12,15,,,,,,,,2.9,1.2,2.6*3B
$GPGSV,3,1,12,09,82,301,19,12,49,234,27,17,39,065,33,05,33,241,22*72
$GPGSV,3,2,12,29,30,171,,15,27,172,38,22,19,289,29,26,15,162,30*7C
$GPGSV,3,3,12,14,15,319,21,18,14,250,13,30,09,240,17,28,07,059,15*75
-{"class":"SKY","tag":"GSV","vdop":2.60,"hdop":1.20,"pdop":2.90,"satellites":[{"PRN":9,"el":82,"az":301,"ss":19,"used":false},{"PRN":12,"el":49,"az":234,"ss":27,"used":true},{"PRN":17,"el":39,"az":65,"ss":33,"used":true},{"PRN":5,"el":33,"az":241,"ss":22,"used":false},{"PRN":29,"el":30,"az":171,"ss":0,"used":false},{"PRN":15,"el":27,"az":172,"ss":38,"used":true},{"PRN":22,"el":19,"az":289,"ss":29,"used":true},{"PRN":26,"el":15,"az":162,"ss":30,"used":true},{"PRN":14,"el":15,"az":319,"ss":21,"used":false},{"PRN":18,"el":14,"az":250,"ss":13,"used":false},{"PRN":30,"el":9,"az":240,"ss":17,"used":false},{"PRN":28,"el":7,"az":59,"ss":15,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.09,"ydop":1.57,"vdop":2.60,"tdop":2.50,"hdop":1.20,"gdop":4.55,"pdop":2.90,"satellites":[{"PRN":9,"el":82,"az":301,"ss":19,"used":false},{"PRN":12,"el":49,"az":234,"ss":27,"used":true},{"PRN":17,"el":39,"az":65,"ss":33,"used":true},{"PRN":5,"el":33,"az":241,"ss":22,"used":false},{"PRN":29,"el":30,"az":171,"ss":0,"used":false},{"PRN":15,"el":27,"az":172,"ss":38,"used":true},{"PRN":22,"el":19,"az":289,"ss":29,"used":true},{"PRN":26,"el":15,"az":162,"ss":30,"used":true},{"PRN":14,"el":15,"az":319,"ss":21,"used":false},{"PRN":18,"el":14,"az":250,"ss":13,"used":false},{"PRN":30,"el":9,"az":240,"ss":17,"used":false},{"PRN":28,"el":7,"az":59,"ss":15,"used":false}]}
$GPRMC,143054.000,A,5201.1302,N,00832.1652,E,0.06,48.00,180708,,,A*5A
{"class":"TPV","tag":"RMC","time":1216391454.000,"ept":0.005,"lat":52.018836667,"lon":8.536086667,"alt":72.200,"epx":13.168,"epy":15.284,"epv":23.000,"track":48.0000,"speed":0.031,"climb":0.000,"mode":3}
$GPZDA,143055.000,18,07,2008,,*54
@@ -70,7 +70,7 @@ $GPGSA,A,3,26,17,22,12,15,,,,,,,,2.9,1.2,2.6*3B
$GPGSV,3,1,12,09,82,301,20,12,49,234,27,17,39,065,33,05,33,241,22*78
$GPGSV,3,2,12,29,30,171,,15,27,172,38,22,19,289,29,26,15,162,30*7C
$GPGSV,3,3,12,14,15,319,21,18,14,250,13,30,09,240,17,28,07,059,15*75
-{"class":"SKY","tag":"GSV","vdop":2.60,"hdop":1.20,"pdop":2.90,"satellites":[{"PRN":9,"el":82,"az":301,"ss":20,"used":false},{"PRN":12,"el":49,"az":234,"ss":27,"used":true},{"PRN":17,"el":39,"az":65,"ss":33,"used":true},{"PRN":5,"el":33,"az":241,"ss":22,"used":false},{"PRN":29,"el":30,"az":171,"ss":0,"used":false},{"PRN":15,"el":27,"az":172,"ss":38,"used":true},{"PRN":22,"el":19,"az":289,"ss":29,"used":true},{"PRN":26,"el":15,"az":162,"ss":30,"used":true},{"PRN":14,"el":15,"az":319,"ss":21,"used":false},{"PRN":18,"el":14,"az":250,"ss":13,"used":false},{"PRN":30,"el":9,"az":240,"ss":17,"used":false},{"PRN":28,"el":7,"az":59,"ss":15,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.09,"ydop":1.57,"vdop":2.60,"tdop":2.50,"hdop":1.20,"gdop":4.55,"pdop":2.90,"satellites":[{"PRN":9,"el":82,"az":301,"ss":20,"used":false},{"PRN":12,"el":49,"az":234,"ss":27,"used":true},{"PRN":17,"el":39,"az":65,"ss":33,"used":true},{"PRN":5,"el":33,"az":241,"ss":22,"used":false},{"PRN":29,"el":30,"az":171,"ss":0,"used":false},{"PRN":15,"el":27,"az":172,"ss":38,"used":true},{"PRN":22,"el":19,"az":289,"ss":29,"used":true},{"PRN":26,"el":15,"az":162,"ss":30,"used":true},{"PRN":14,"el":15,"az":319,"ss":21,"used":false},{"PRN":18,"el":14,"az":250,"ss":13,"used":false},{"PRN":30,"el":9,"az":240,"ss":17,"used":false},{"PRN":28,"el":7,"az":59,"ss":15,"used":false}]}
$GPRMC,143055.000,A,5201.1302,N,00832.1652,E,0.08,64.91,180708,,,A*53
{"class":"TPV","tag":"RMC","time":1216391455.000,"ept":0.005,"lat":52.018836667,"lon":8.536086667,"alt":72.200,"epx":16.324,"epy":23.592,"epv":59.800,"track":64.9100,"speed":0.041,"climb":0.000,"mode":3}
$GPZDA,143056.000,18,07,2008,,*57
@@ -81,6 +81,6 @@ $GPGSA,A,3,26,17,22,12,15,,,,,,,,2.9,1.2,2.6*3B
$GPGSV,3,1,12,09,82,301,20,12,49,234,27,17,39,065,33,05,33,241,22*78
$GPGSV,3,2,12,29,30,171,,15,27,172,38,22,19,289,29,26,15,162,31*7D
$GPGSV,3,3,12,14,15,319,20,18,14,250,13,30,09,240,16,28,07,059,15*75
-{"class":"SKY","tag":"GSV","vdop":2.60,"hdop":1.20,"pdop":2.90,"satellites":[{"PRN":9,"el":82,"az":301,"ss":20,"used":false},{"PRN":12,"el":49,"az":234,"ss":27,"used":true},{"PRN":17,"el":39,"az":65,"ss":33,"used":true},{"PRN":5,"el":33,"az":241,"ss":22,"used":false},{"PRN":29,"el":30,"az":171,"ss":0,"used":false},{"PRN":15,"el":27,"az":172,"ss":38,"used":true},{"PRN":22,"el":19,"az":289,"ss":29,"used":true},{"PRN":26,"el":15,"az":162,"ss":31,"used":true},{"PRN":14,"el":15,"az":319,"ss":20,"used":false},{"PRN":18,"el":14,"az":250,"ss":13,"used":false},{"PRN":30,"el":9,"az":240,"ss":16,"used":false},{"PRN":28,"el":7,"az":59,"ss":15,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.09,"ydop":1.57,"vdop":2.60,"tdop":2.50,"hdop":1.20,"gdop":4.55,"pdop":2.90,"satellites":[{"PRN":9,"el":82,"az":301,"ss":20,"used":false},{"PRN":12,"el":49,"az":234,"ss":27,"used":true},{"PRN":17,"el":39,"az":65,"ss":33,"used":true},{"PRN":5,"el":33,"az":241,"ss":22,"used":false},{"PRN":29,"el":30,"az":171,"ss":0,"used":false},{"PRN":15,"el":27,"az":172,"ss":38,"used":true},{"PRN":22,"el":19,"az":289,"ss":29,"used":true},{"PRN":26,"el":15,"az":162,"ss":31,"used":true},{"PRN":14,"el":15,"az":319,"ss":20,"used":false},{"PRN":18,"el":14,"az":250,"ss":13,"used":false},{"PRN":30,"el":9,"az":240,"ss":16,"used":false},{"PRN":28,"el":7,"az":59,"ss":15,"used":false}]}
$GPRMC,143056.000,A,5201.1302,N,00832.1652,E,0.07,45.54,180708,,,A*55
{"class":"TPV","tag":"RMC","time":1216391456.000,"ept":0.005,"lat":52.018836667,"lon":8.536086667,"alt":72.300,"epx":16.324,"epy":23.592,"epv":59.800,"track":45.5400,"speed":0.036,"climb":0.000,"mode":3}
diff --git a/test/daemon/bt451.log.chk b/test/daemon/bt451.log.chk
index d375b171..a20a9614 100644
--- a/test/daemon/bt451.log.chk
+++ b/test/daemon/bt451.log.chk
@@ -171,7 +171,7 @@ $GPGSA,A,3,09,19,11,14,03,22,06,26,,,,,3.65,1.28,3.41*0A
$GPGSV,3,1,10,32,22,227,34,09,12,038,29,19,58,204,39,11,36,285,35*74
$GPGSV,3,2,10,14,45,118,34,03,31,183,30,28,,,32,22,47,070,42*43
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":3.41,"hdop":1.28,"pdop":3.65,"satellites":[{"PRN":32,"el":22,"az":227,"ss":34,"used":false},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":30,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.73,"ydop":0.78,"vdop":3.41,"tdop":0.92,"hdop":1.28,"gdop":2.24,"pdop":3.65,"satellites":[{"PRN":32,"el":22,"az":227,"ss":34,"used":false},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":30,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.83315,N,02334.72613,E,143306.00,A,A*63
{"class":"TPV","tag":"GLL","time":1260455586.000,"ept":0.005,"lat":55.780552500,"lon":23.578768833,"alt":129.900,"epx":10.912,"epy":11.668,"epv":129.260,"climb":0.001,"mode":3}
$GPZDA,143306.00,09,12,2009,00,00*64
@@ -183,7 +183,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,2.99*05
$GPGSV,3,1,10,32,22,227,35,09,12,038,29,19,58,204,39,11,36,285,36*76
$GPGSV,3,2,10,14,45,118,34,03,31,183,30,28,,,34,22,47,070,42*45
$GPGSV,3,3,10,06,26,174,33,26,44,080,38*7F
-{"class":"SKY","tag":"GSV","vdop":2.99,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":35,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":30,"used":true},{"PRN":28,"el":0,"az":0,"ss":34,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":2.99,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":35,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":30,"used":true},{"PRN":28,"el":0,"az":0,"ss":34,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.82983,N,02334.72123,E,143306.50,A,A*66
{"class":"TPV","tag":"GLL","time":1260369186.500,"ept":0.005,"lat":55.780497167,"lon":23.578687167,"alt":128.900,"epx":10.912,"epy":11.668,"epv":78.430,"track":221.1600,"speed":15.600,"climb":0.000,"eps":46.67,"mode":3}
$GPZDA,143306.50,09,12,2009,00,00*61
@@ -195,7 +195,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,227,35,09,12,038,29,19,58,204,40,11,36,285,36*78
$GPGSV,3,2,10,14,45,118,34,03,31,183,30,28,,,35,22,47,070,43*45
$GPGSV,3,3,10,06,26,174,33,26,44,080,39*7E
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":35,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":30,"used":true},{"PRN":28,"el":0,"az":0,"ss":35,"used":false},{"PRN":22,"el":47,"az":70,"ss":43,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":35,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":30,"used":true},{"PRN":28,"el":0,"az":0,"ss":35,"used":false},{"PRN":22,"el":47,"az":70,"ss":43,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.82649,N,02334.71625,E,143307.00,A,A*69
{"class":"TPV","tag":"GLL","time":1260369187.000,"ept":0.005,"lat":55.780441500,"lon":23.578604167,"alt":128.100,"epx":10.478,"epy":9.434,"epv":68.770,"track":221.4800,"speed":15.876,"climb":0.000,"eps":44.29,"mode":3}
$GPZDA,143307.00,09,12,2009,00,00*65
@@ -207,7 +207,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,227,35,09,12,038,29,19,58,204,40,11,36,285,36*78
$GPGSV,3,2,10,14,45,118,34,03,31,183,30,28,,,33,22,47,070,43*43
$GPGSV,3,3,10,06,26,174,34,26,44,080,38*78
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":35,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":30,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":43,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":35,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":30,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":43,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.82314,N,02334.71118,E,143307.50,A,A*68
{"class":"TPV","tag":"GLL","time":1260369187.500,"ept":0.005,"lat":55.780385667,"lon":23.578519667,"alt":127.500,"epx":10.478,"epy":9.434,"epv":69.000,"track":221.5100,"speed":16.128,"climb":0.000,"eps":41.91,"mode":3}
$GPZDA,143307.50,09,12,2009,00,00*60
@@ -219,7 +219,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,227,36,09,12,038,29,19,58,204,41,11,36,285,37*7B
$GPGSV,3,2,10,14,45,118,35,03,31,183,29,28,,,33,22,47,070,43*4A
$GPGSV,3,3,10,06,26,174,35,26,44,080,38*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":36,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":41,"used":true},{"PRN":11,"el":36,"az":285,"ss":37,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":29,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":43,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":36,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":41,"used":true},{"PRN":11,"el":36,"az":285,"ss":37,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":29,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":43,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.81975,N,02334.70604,E,143308.00,A,A*67
{"class":"TPV","tag":"GLL","time":1260369188.000,"ept":0.005,"lat":55.780329167,"lon":23.578434000,"alt":127.100,"epx":10.478,"epy":9.434,"epv":69.000,"track":221.5400,"speed":16.462,"climb":0.000,"eps":41.91,"mode":3}
$GPZDA,143308.00,09,12,2009,00,00*6A
@@ -231,7 +231,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,227,34,09,12,038,29,19,58,204,40,11,36,285,35*7A
$GPGSV,3,2,10,14,45,118,35,03,31,183,27,28,,,32,22,47,070,42*44
$GPGSV,3,3,10,06,26,174,34,26,44,080,37*77
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
$GPGLL,5546.81633,N,02334.70079,E,143308.50,A,A*63
{"class":"TPV","tag":"GLL","time":1260369188.500,"ept":0.005,"lat":55.780272167,"lon":23.578346500,"alt":126.800,"epx":10.478,"epy":9.434,"epv":69.000,"track":221.5400,"speed":16.603,"climb":0.000,"eps":41.91,"mode":3}
$GPZDA,143308.50,09,12,2009,00,00*6F
@@ -243,7 +243,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,2.99*05
$GPGSV,3,1,10,32,22,227,34,09,12,038,29,19,58,204,39,11,36,285,35*74
$GPGSV,3,2,10,14,45,118,34,03,31,183,27,28,,,32,22,47,070,42*45
$GPGSV,3,3,10,06,26,174,34,26,44,080,38*78
-{"class":"SKY","tag":"GSV","vdop":2.99,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":2.99,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.81291,N,02334.69552,E,143309.00,A,A*6F
{"class":"TPV","tag":"GLL","time":1260369189.000,"ept":0.005,"lat":55.780215167,"lon":23.578258667,"alt":126.400,"epx":10.478,"epy":9.434,"epv":69.000,"track":221.4800,"speed":16.511,"climb":0.000,"eps":41.91,"mode":3}
$GPZDA,143309.00,09,12,2009,00,00*6B
@@ -255,7 +255,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,227,34,09,12,038,28,19,58,204,40,11,36,285,35*7B
$GPGSV,3,2,10,14,45,118,33,03,31,183,29,28,,,32,22,47,070,42*4C
$GPGSV,3,3,10,06,26,174,33,26,44,080,38*7F
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":29,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":29,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.80952,N,02334.69029,E,143309.50,A,A*66
{"class":"TPV","tag":"GLL","time":1260369189.500,"ept":0.005,"lat":55.780158667,"lon":23.578171500,"alt":126.200,"epx":10.478,"epy":9.434,"epv":68.770,"track":221.4600,"speed":16.512,"climb":0.000,"eps":41.91,"mode":3}
$GPZDA,143309.50,09,12,2009,00,00*6E
@@ -267,7 +267,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,227,33,09,12,038,28,19,58,204,40,11,36,285,35*7C
$GPGSV,3,2,10,14,45,118,34,03,31,183,26,28,,,32,22,47,070,42*44
$GPGSV,3,3,10,06,26,174,34,26,44,080,38*78
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":26,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":26,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.80598,N,02334.68514,E,143310.00,A,A*6B
{"class":"TPV","tag":"GLL","time":1260369190.000,"ept":0.005,"lat":55.780099667,"lon":23.578085667,"alt":125.300,"epx":10.478,"epy":9.434,"epv":69.000,"track":221.2000,"speed":16.561,"climb":0.000,"eps":41.91,"mode":3}
$GPZDA,143310.00,09,12,2009,00,00*63
@@ -279,7 +279,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,227,33,09,12,038,28,19,58,204,40,11,36,285,36*7F
$GPGSV,3,2,10,14,45,118,34,03,31,183,26,28,,,32,22,47,070,42*44
$GPGSV,3,3,10,06,26,174,34,26,44,080,38*78
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":26,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":26,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.80248,N,02334.67996,E,143310.50,A,A*6D
{"class":"TPV","tag":"GLL","time":1260369190.500,"ept":0.005,"lat":55.780041333,"lon":23.577999333,"alt":124.700,"epx":10.478,"epy":9.434,"epv":69.000,"track":221.4200,"speed":16.648,"climb":0.000,"eps":41.91,"mode":3}
$GPZDA,143310.50,09,12,2009,00,00*66
@@ -291,7 +291,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,227,33,09,12,038,28,19,58,204,40,11,36,285,36*7F
$GPGSV,3,2,10,14,45,118,34,03,31,183,22,28,,,32,22,47,070,42*40
$GPGSV,3,3,10,06,26,174,34,26,44,080,38*78
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":22,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":22,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.79900,N,02334.67471,E,143311.00,A,A*6C
{"class":"TPV","tag":"GLL","time":1260369191.000,"ept":0.005,"lat":55.779983333,"lon":23.577911833,"alt":124.200,"epx":10.478,"epy":9.434,"epv":69.000,"track":221.3300,"speed":16.750,"climb":0.000,"eps":41.91,"mode":3}
$GPZDA,143311.00,09,12,2009,00,00*62
@@ -303,7 +303,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,227,33,09,12,038,28,19,58,204,40,11,36,285,36*7F
$GPGSV,3,2,10,14,45,118,34,03,31,183,23,28,,,32,22,47,070,42*41
$GPGSV,3,3,10,06,26,174,33,26,44,080,39*7E
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":23,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":23,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.79553,N,02334.66940,E,143311.50,A,A*6D
{"class":"TPV","tag":"GLL","time":1260369191.500,"ept":0.005,"lat":55.779925500,"lon":23.577823333,"alt":123.800,"epx":10.478,"epy":9.434,"epv":69.000,"track":221.7100,"speed":16.887,"climb":0.000,"eps":41.91,"mode":3}
$GPZDA,143311.50,09,12,2009,00,00*67
@@ -315,7 +315,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,227,33,09,12,038,28,19,58,204,40,11,36,285,36*7F
$GPGSV,3,2,10,14,45,118,35,03,31,183,25,28,,,32,22,47,070,42*46
$GPGSV,3,3,10,06,26,174,33,26,44,080,39*7E
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":227,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.79205,N,02334.66400,E,143312.00,A,A*66
{"class":"TPV","tag":"GLL","time":1260369192.000,"ept":0.005,"lat":55.779867500,"lon":23.577733333,"alt":123.500,"epx":10.478,"epy":9.434,"epv":69.000,"track":221.7000,"speed":17.069,"climb":0.000,"eps":41.91,"mode":3}
$GPZDA,143312.00,09,12,2009,00,00*61
@@ -327,7 +327,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,34,09,12,038,28,19,58,204,40,11,36,285,36*77
$GPGSV,3,2,10,14,45,118,35,03,31,183,25,28,,,32,22,47,070,42*46
$GPGSV,3,3,10,06,26,174,34,26,44,080,39*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.78854,N,02334.65855,E,143312.50,A,A*63
{"class":"TPV","tag":"GLL","time":1260369192.500,"ept":0.005,"lat":55.779809000,"lon":23.577642500,"alt":123.300,"epx":10.478,"epy":9.434,"epv":69.000,"track":221.7500,"speed":17.216,"climb":0.000,"eps":41.91,"mode":3}
$GPZDA,143312.50,09,12,2009,00,00*64
@@ -339,7 +339,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,34,09,12,038,28,19,58,204,40,11,36,285,36*77
$GPGSV,3,2,10,14,45,118,35,03,31,183,21,28,,,32,22,47,070,42*42
$GPGSV,3,3,10,06,26,174,35,26,44,080,39*78
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":21,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":21,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.78498,N,02334.65304,E,143313.00,A,A*64
{"class":"TPV","tag":"GLL","time":1260369193.000,"ept":0.005,"lat":55.779749667,"lon":23.577550667,"alt":123.200,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.4500,"speed":17.490,"climb":0.000,"eps":41.84,"mode":3}
$GPZDA,143313.00,09,12,2009,00,00*60
@@ -351,7 +351,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,34,09,12,038,28,19,58,204,41,11,36,285,37*77
$GPGSV,3,2,10,14,45,118,35,03,31,183,22,28,,,33,22,47,070,42*40
$GPGSV,3,3,10,06,26,174,34,26,44,080,39*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":41,"used":true},{"PRN":11,"el":36,"az":285,"ss":37,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":22,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":41,"used":true},{"PRN":11,"el":36,"az":285,"ss":37,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":22,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.78137,N,02334.64747,E,143313.50,A,A*63
{"class":"TPV","tag":"GLL","time":1260369193.500,"ept":0.005,"lat":55.779689500,"lon":23.577457833,"alt":123.000,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.6000,"speed":17.733,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143313.50,09,12,2009,00,00*65
@@ -363,7 +363,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,34,09,12,038,28,19,58,204,41,11,36,285,37*77
$GPGSV,3,2,10,14,45,118,35,03,31,183,25,28,,,33,22,47,070,43*46
$GPGSV,3,3,10,06,26,174,35,26,44,080,39*78
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":41,"used":true},{"PRN":11,"el":36,"az":285,"ss":37,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":43,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":41,"used":true},{"PRN":11,"el":36,"az":285,"ss":37,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":43,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.77773,N,02334.64182,E,143314.00,A,A*67
{"class":"TPV","tag":"GLL","time":1260369194.000,"ept":0.005,"lat":55.779628833,"lon":23.577363667,"alt":122.800,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.3900,"speed":17.962,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143314.00,09,12,2009,00,00*67
@@ -375,7 +375,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,34,09,12,038,28,19,58,204,40,11,36,285,37*76
$GPGSV,3,2,10,14,45,118,35,03,31,183,25,28,,,33,22,47,070,42*47
$GPGSV,3,3,10,06,26,174,35,26,44,080,39*78
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":37,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":37,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.77404,N,02334.63610,E,143314.50,A,A*6A
{"class":"TPV","tag":"GLL","time":1260369194.500,"ept":0.005,"lat":55.779567333,"lon":23.577268333,"alt":122.700,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.4200,"speed":18.139,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143314.50,09,12,2009,00,00*62
@@ -387,7 +387,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,34,09,12,038,28,19,58,204,41,11,36,285,37*77
$GPGSV,3,2,10,14,45,118,35,03,31,183,24,28,,,33,22,47,070,42*46
$GPGSV,3,3,10,06,26,174,35,26,44,080,39*78
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":41,"used":true},{"PRN":11,"el":36,"az":285,"ss":37,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":41,"used":true},{"PRN":11,"el":36,"az":285,"ss":37,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.77031,N,02334.63033,E,143315.00,A,A*6B
{"class":"TPV","tag":"GLL","time":1260369195.000,"ept":0.005,"lat":55.779505167,"lon":23.577172167,"alt":122.500,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.3300,"speed":18.321,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143315.00,09,12,2009,00,00*66
@@ -399,7 +399,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,34,09,12,038,28,19,58,204,40,11,36,285,36*77
$GPGSV,3,2,10,14,45,118,35,03,31,183,20,28,,,32,22,47,070,42*43
$GPGSV,3,3,10,06,26,174,35,26,44,080,39*78
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":20,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":20,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.76656,N,02334.62450,E,143315.50,A,A*68
{"class":"TPV","tag":"GLL","time":1260369195.500,"ept":0.005,"lat":55.779442667,"lon":23.577075000,"alt":122.400,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.5500,"speed":18.469,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143315.50,09,12,2009,00,00*63
@@ -411,7 +411,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,34,09,12,038,28,19,58,204,40,11,36,285,36*77
$GPGSV,3,2,10,14,45,118,35,03,31,183,21,28,,,33,22,47,070,42*43
$GPGSV,3,3,10,06,26,174,35,26,44,080,39*78
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":21,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":21,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.76280,N,02334.61860,E,143316.00,A,A*6D
{"class":"TPV","tag":"GLL","time":1260369196.000,"ept":0.005,"lat":55.779380000,"lon":23.576976667,"alt":122.200,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.7900,"speed":18.630,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143316.00,09,12,2009,00,00*65
@@ -423,7 +423,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,33,09,12,038,28,19,58,204,40,11,36,285,37*71
$GPGSV,3,2,10,14,45,118,35,03,31,183,25,28,,,33,22,47,070,42*47
$GPGSV,3,3,10,06,26,174,34,26,44,080,39*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":37,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":37,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.75900,N,02334.61263,E,143316.50,A,A*61
{"class":"TPV","tag":"GLL","time":1260369196.500,"ept":0.005,"lat":55.779316667,"lon":23.576877167,"alt":122.100,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.7600,"speed":18.819,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143316.50,09,12,2009,00,00*60
@@ -435,7 +435,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,33,09,12,038,28,19,58,204,40,11,36,285,37*71
$GPGSV,3,2,10,14,45,118,35,03,31,183,25,28,,,33,22,47,070,42*47
$GPGSV,3,3,10,06,26,174,34,26,44,080,39*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":37,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":37,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.75517,N,02334.60661,E,143317.00,A,A*68
{"class":"TPV","tag":"GLL","time":1260369197.000,"ept":0.005,"lat":55.779252833,"lon":23.576776833,"alt":122.000,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.7300,"speed":18.974,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143317.00,09,12,2009,00,00*64
@@ -447,7 +447,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,32,09,12,038,28,19,58,204,40,11,36,285,36*71
$GPGSV,3,2,10,14,45,118,34,03,31,183,25,28,,,33,22,47,070,42*46
$GPGSV,3,3,10,06,26,174,34,26,44,080,39*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.75131,N,02334.60056,E,143317.50,A,A*6F
{"class":"TPV","tag":"GLL","time":1260369197.500,"ept":0.005,"lat":55.779188500,"lon":23.576676000,"alt":122.000,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.5900,"speed":19.085,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143317.50,09,12,2009,00,00*61
@@ -459,7 +459,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,33,09,12,038,27,19,58,204,40,11,36,285,35*7C
$GPGSV,3,2,10,14,45,118,34,03,31,183,24,28,,,33,22,47,070,42*47
$GPGSV,3,3,10,06,26,174,35,26,44,080,39*78
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.74742,N,02334.59448,E,143318.00,A,A*67
{"class":"TPV","tag":"GLL","time":1260369198.000,"ept":0.005,"lat":55.779123667,"lon":23.576574667,"alt":121.900,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.5100,"speed":19.101,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143318.00,09,12,2009,00,00*6B
@@ -471,7 +471,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,33,09,12,038,28,19,58,204,40,11,36,285,36*70
$GPGSV,3,2,10,14,45,118,35,03,31,183,22,28,,,33,22,47,070,42*40
$GPGSV,3,3,10,06,26,174,34,26,44,080,39*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":22,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":22,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.74354,N,02334.58840,E,143318.50,A,A*64
{"class":"TPV","tag":"GLL","time":1260369198.500,"ept":0.005,"lat":55.779059000,"lon":23.576473333,"alt":121.800,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.6600,"speed":19.107,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143318.50,09,12,2009,00,00*6E
@@ -483,7 +483,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,33,09,12,038,27,19,58,204,40,11,36,285,36*7F
$GPGSV,3,2,10,14,45,118,34,03,31,183,25,28,,,33,22,47,070,42*46
$GPGSV,3,3,10,06,26,174,34,26,44,080,39*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.73966,N,02334.58232,E,143319.00,A,A*63
{"class":"TPV","tag":"GLL","time":1260369199.000,"ept":0.005,"lat":55.778994333,"lon":23.576372000,"alt":121.800,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.6500,"speed":19.111,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143319.00,09,12,2009,00,00*6A
@@ -495,7 +495,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,33,09,12,038,27,19,58,204,40,11,36,285,36*7F
$GPGSV,3,2,10,14,45,118,34,03,31,183,25,28,,,33,22,47,070,42*46
$GPGSV,3,3,10,06,26,174,34,26,44,080,39*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.73578,N,02334.57626,E,143319.50,A,A*6B
{"class":"TPV","tag":"GLL","time":1260369199.500,"ept":0.005,"lat":55.778929667,"lon":23.576271000,"alt":121.800,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.3500,"speed":19.105,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143319.50,09,12,2009,00,00*6F
@@ -507,7 +507,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,33,09,12,038,27,19,58,204,41,11,36,285,36*7E
$GPGSV,3,2,10,14,45,118,34,03,31,183,24,28,,,33,22,47,070,42*47
$GPGSV,3,3,10,06,26,174,35,26,44,080,39*78
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":41,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":41,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.73191,N,02334.57020,E,143320.00,A,A*67
{"class":"TPV","tag":"GLL","time":1260369200.000,"ept":0.005,"lat":55.778865167,"lon":23.576170000,"alt":121.700,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.5100,"speed":19.083,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143320.00,09,12,2009,00,00*60
@@ -519,7 +519,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,32,09,12,038,27,19,58,204,40,11,36,285,35*7D
$GPGSV,3,2,10,14,45,118,34,03,31,183,22,28,,,32,22,47,070,42*40
$GPGSV,3,3,10,06,26,174,34,26,44,080,39*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":22,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":22,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.72805,N,02334.56415,E,143320.50,A,A*64
{"class":"TPV","tag":"GLL","time":1260369200.500,"ept":0.005,"lat":55.778800833,"lon":23.576069167,"alt":121.700,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.5600,"speed":19.025,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143320.50,09,12,2009,00,00*65
@@ -531,7 +531,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,33,09,12,038,27,19,58,204,40,11,36,285,36*7F
$GPGSV,3,2,10,14,45,118,34,03,31,183,23,28,,,33,22,47,070,42*40
$GPGSV,3,3,10,06,26,174,34,26,44,080,39*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":23,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":23,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.72423,N,02334.55813,E,143321.00,A,A*61
{"class":"TPV","tag":"GLL","time":1260369201.000,"ept":0.005,"lat":55.778737167,"lon":23.575968833,"alt":121.700,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.8500,"speed":18.900,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143321.00,09,12,2009,00,00*61
@@ -543,7 +543,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,32,09,12,038,27,19,58,204,40,11,36,285,36*7E
$GPGSV,3,2,10,14,45,118,35,03,31,183,24,28,,,34,22,47,070,42*41
$GPGSV,3,3,10,06,26,174,34,26,44,080,39*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":0,"az":0,"ss":34,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":0,"az":0,"ss":34,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.72043,N,02334.55216,E,143321.50,A,A*69
{"class":"TPV","tag":"GLL","time":1260369201.500,"ept":0.005,"lat":55.778673833,"lon":23.575869333,"alt":121.700,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.5100,"speed":18.802,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143321.50,09,12,2009,00,00*64
@@ -555,7 +555,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,31,09,12,038,27,19,58,204,38,11,36,285,34*70
$GPGSV,3,2,10,14,45,118,33,03,31,183,21,28,,,32,22,47,070,40*46
$GPGSV,3,3,10,06,26,174,31,26,44,080,37*72
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":21,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":31,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":21,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":31,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
$GPGLL,5546.71665,N,02334.54623,E,143322.00,A,A*6D
{"class":"TPV","tag":"GLL","time":1260369202.000,"ept":0.005,"lat":55.778610833,"lon":23.575770500,"alt":121.700,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.6100,"speed":18.672,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143322.00,09,12,2009,00,00*62
@@ -567,7 +567,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,30,09,12,038,27,19,58,204,38,11,36,285,34*71
$GPGSV,3,2,10,14,45,118,32,03,31,183,22,28,,,31,22,47,070,40*47
$GPGSV,3,3,10,06,26,174,32,26,44,080,36*70
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":30,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":22,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":36,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":30,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":22,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":36,"used":true}]}
$GPGLL,5546.71291,N,02334.54032,E,143322.50,A,A*61
{"class":"TPV","tag":"GLL","time":1260369202.500,"ept":0.005,"lat":55.778548500,"lon":23.575672000,"alt":121.700,"epx":10.441,"epy":9.459,"epv":69.000,"track":222.0200,"speed":18.555,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143322.50,09,12,2009,00,00*67
@@ -579,7 +579,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,31,09,12,038,27,19,58,204,39,11,36,285,35*70
$GPGSV,3,2,10,14,45,118,34,03,31,183,24,28,,,32,22,47,070,41*45
$GPGSV,3,3,10,06,26,174,34,26,44,080,38*78
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":38,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.70920,N,02334.53442,E,143323.00,A,A*61
{"class":"TPV","tag":"GLL","time":1260369203.000,"ept":0.005,"lat":55.778486667,"lon":23.575573667,"alt":121.700,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.9200,"speed":18.467,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143323.00,09,12,2009,00,00*63
@@ -591,7 +591,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,32,09,12,038,28,19,58,204,40,11,36,285,36*71
$GPGSV,3,2,10,14,45,118,35,03,31,183,30,28,,,34,22,47,070,42*44
$GPGSV,3,3,10,06,26,174,34,26,44,080,39*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":30,"used":true},{"PRN":28,"el":0,"az":0,"ss":34,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":38,"ss":28,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":30,"used":true},{"PRN":28,"el":0,"az":0,"ss":34,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.70550,N,02334.52854,E,143323.50,A,A*65
{"class":"TPV","tag":"GLL","time":1260369203.500,"ept":0.005,"lat":55.778425000,"lon":23.575475667,"alt":121.500,"epx":10.441,"epy":9.459,"epv":69.000,"track":222.2400,"speed":18.418,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143323.50,09,12,2009,00,00*66
@@ -603,7 +603,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,33,09,12,038,30,19,58,204,40,11,36,285,36*79
$GPGSV,3,2,10,14,45,118,35,03,31,183,27,28,,,33,22,47,070,41*46
$GPGSV,3,3,10,06,26,174,34,26,44,080,39*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":30,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":30,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.70183,N,02334.52263,E,143324.00,A,A*63
{"class":"TPV","tag":"GLL","time":1260369204.000,"ept":0.005,"lat":55.778363833,"lon":23.575377167,"alt":121.600,"epx":10.441,"epy":9.459,"epv":69.000,"track":222.0000,"speed":18.432,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143324.00,09,12,2009,00,00*64
@@ -615,7 +615,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,33,09,12,038,30,19,58,204,40,11,36,285,35*7A
$GPGSV,3,2,10,14,45,118,35,03,31,183,27,28,,,32,22,47,070,42*44
$GPGSV,3,3,10,06,26,174,34,26,44,080,39*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":30,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":30,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.69812,N,02334.51673,E,143324.50,A,A*69
{"class":"TPV","tag":"GLL","time":1260369204.500,"ept":0.005,"lat":55.778302000,"lon":23.575278833,"alt":121.600,"epx":10.441,"epy":9.459,"epv":69.000,"track":222.0900,"speed":18.500,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143324.50,09,12,2009,00,00*61
@@ -627,7 +627,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,33,09,12,038,29,19,58,204,40,11,36,285,35*72
$GPGSV,3,2,10,14,45,118,35,03,31,183,26,28,,,32,22,47,070,41*46
$GPGSV,3,3,10,06,26,174,35,26,44,080,39*78
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":26,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":26,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":35,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.69439,N,02334.51078,E,143325.00,A,A*65
{"class":"TPV","tag":"GLL","time":1260369205.000,"ept":0.005,"lat":55.778239833,"lon":23.575179667,"alt":121.500,"epx":10.441,"epy":9.459,"epv":69.000,"track":222.0400,"speed":18.669,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143325.00,09,12,2009,00,00*65
@@ -639,7 +639,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,33,09,12,038,29,19,58,204,40,11,36,285,36*71
$GPGSV,3,2,10,14,45,118,35,03,31,183,26,28,,,33,22,47,070,42*44
$GPGSV,3,3,10,06,26,174,34,26,44,080,39*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":26,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":26,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.69063,N,02334.50478,E,143325.50,A,A*6E
{"class":"TPV","tag":"GLL","time":1260369205.500,"ept":0.005,"lat":55.778177167,"lon":23.575079667,"alt":121.500,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.9300,"speed":18.816,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143325.50,09,12,2009,00,00*60
@@ -651,7 +651,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.26,1.26,3.00*07
$GPGSV,3,1,10,32,22,228,33,09,12,038,29,19,58,204,40,11,36,285,36*71
$GPGSV,3,2,10,14,45,118,35,03,31,183,26,28,,,33,22,47,070,42*44
$GPGSV,3,3,10,06,26,174,34,26,44,080,39*79
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":26,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.80,"hdop":1.26,"gdop":2.00,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":38,"ss":29,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":26,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.68683,N,02334.49875,E,143326.00,A,A*68
{"class":"TPV","tag":"GLL","time":1260369206.000,"ept":0.005,"lat":55.778113833,"lon":23.574979167,"alt":121.500,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.8100,"speed":18.970,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143326.00,09,12,2009,00,00*66
@@ -663,7 +663,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.25,1.26,3.00*04
$GPGSV,3,1,10,32,22,228,32,09,12,037,27,19,58,204,40,11,36,285,36*71
$GPGSV,3,2,10,14,45,118,34,03,31,183,26,28,,,33,22,47,070,42*45
$GPGSV,3,3,10,06,26,174,33,26,44,080,38*7F
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":26,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.81,"hdop":1.26,"gdop":2.00,"pdop":3.25,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":204,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":26,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.68299,N,02334.49268,E,143326.50,A,A*64
{"class":"TPV","tag":"GLL","time":1260369206.500,"ept":0.005,"lat":55.778049833,"lon":23.574878000,"alt":121.500,"epx":10.441,"epy":9.459,"epv":69.000,"track":221.5600,"speed":19.124,"climb":0.000,"eps":41.76,"mode":3}
$GPZDA,143326.50,09,12,2009,00,00*63
@@ -675,7 +675,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.66,1.47,3.35*02
$GPGSV,3,1,12,32,22,228,31,27,,,31,09,12,037,26,19,58,204,38*46
$GPGSV,3,2,12,11,36,285,34,14,45,118,32,03,31,183,19,28,,,31*40
$GPGSV,3,3,12,22,47,070,40,15,,,22,06,26,174,31,26,44,080,36*45
-{"class":"SKY","tag":"GSV","vdop":3.35,"hdop":1.47,"pdop":3.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":27,"el":0,"az":0,"ss":31,"used":false},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":204,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":19,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":15,"el":0,"az":0,"ss":22,"used":false},{"PRN":6,"el":26,"az":174,"ss":31,"used":true},{"PRN":26,"el":44,"az":80,"ss":36,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.73,"ydop":0.77,"vdop":3.35,"tdop":0.87,"hdop":1.47,"gdop":2.17,"pdop":3.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":27,"el":0,"az":0,"ss":31,"used":false},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":204,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":19,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":15,"el":0,"az":0,"ss":22,"used":false},{"PRN":6,"el":26,"az":174,"ss":31,"used":true},{"PRN":26,"el":44,"az":80,"ss":36,"used":true}]}
$GPGLL,5546.67914,N,02334.48657,E,143327.00,A,A*68
{"class":"TPV","tag":"GLL","time":1260369207.000,"ept":0.005,"lat":55.777985667,"lon":23.574776167,"alt":121.600,"epx":10.479,"epy":9.442,"epv":69.000,"track":221.5100,"speed":19.257,"climb":0.000,"eps":41.84,"mode":3}
$GPZDA,143327.00,09,12,2009,00,00*67
@@ -688,7 +688,7 @@ $GPGSV,4,1,14,32,22,228,30,27,,,30,09,12,037,25,12,,,33*7F
$GPGSV,4,2,14,19,58,204,37,11,36,285,33,14,45,118,32,03,31,183,18*78
$GPGSV,4,3,14,28,,,30,22,47,070,39,15,,,24,06,26,174,30*7D
$GPGSV,4,4,14,26,44,080,36,17,,,34*44
-{"class":"SKY","tag":"GSV","vdop":3.35,"hdop":1.48,"pdop":3.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":30,"used":true},{"PRN":27,"el":0,"az":0,"ss":30,"used":false},{"PRN":9,"el":12,"az":37,"ss":25,"used":true},{"PRN":12,"el":0,"az":0,"ss":33,"used":false},{"PRN":19,"el":58,"az":204,"ss":37,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":18,"used":true},{"PRN":28,"el":0,"az":0,"ss":30,"used":false},{"PRN":22,"el":47,"az":70,"ss":39,"used":true},{"PRN":15,"el":0,"az":0,"ss":24,"used":false},{"PRN":6,"el":26,"az":174,"ss":30,"used":true},{"PRN":26,"el":44,"az":80,"ss":36,"used":true},{"PRN":17,"el":0,"az":0,"ss":34,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.77,"ydop":0.82,"vdop":3.35,"tdop":0.89,"hdop":1.48,"gdop":2.37,"pdop":3.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":30,"used":true},{"PRN":27,"el":0,"az":0,"ss":30,"used":false},{"PRN":9,"el":12,"az":37,"ss":25,"used":true},{"PRN":12,"el":0,"az":0,"ss":33,"used":false},{"PRN":19,"el":58,"az":204,"ss":37,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":18,"used":true},{"PRN":28,"el":0,"az":0,"ss":30,"used":false},{"PRN":22,"el":47,"az":70,"ss":39,"used":true},{"PRN":15,"el":0,"az":0,"ss":24,"used":false},{"PRN":6,"el":26,"az":174,"ss":30,"used":true},{"PRN":26,"el":44,"az":80,"ss":36,"used":true},{"PRN":17,"el":0,"az":0,"ss":34,"used":false}]}
$GPGLL,5546.67528,N,02334.48042,E,143327.50,A,A*6C
{"class":"TPV","tag":"GLL","time":1260369207.500,"ept":0.005,"lat":55.777921333,"lon":23.574673667,"alt":121.700,"epx":10.906,"epy":11.531,"epv":77.050,"track":221.6000,"speed":19.305,"climb":0.000,"eps":44.02,"mode":3}
$GPZDA,143327.50,09,12,2009,00,00*62
@@ -701,7 +701,7 @@ $GPGSV,4,1,14,32,22,228,29,27,,,29,09,12,037,25,12,,,32*7E
$GPGSV,4,2,14,19,58,204,37,11,36,285,33,14,45,118,32,03,31,183,19*79
$GPGSV,4,3,14,28,,,29,22,47,070,38,15,,,24,06,26,174,29*7C
$GPGSV,4,4,14,26,44,080,36,17,,,33*43
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.19,"pdop":3.23,"satellites":[{"PRN":32,"el":22,"az":228,"ss":29,"used":true},{"PRN":27,"el":0,"az":0,"ss":29,"used":false},{"PRN":9,"el":12,"az":37,"ss":25,"used":true},{"PRN":12,"el":0,"az":0,"ss":32,"used":false},{"PRN":19,"el":58,"az":204,"ss":37,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":19,"used":true},{"PRN":28,"el":0,"az":0,"ss":29,"used":false},{"PRN":22,"el":47,"az":70,"ss":38,"used":true},{"PRN":15,"el":0,"az":0,"ss":24,"used":false},{"PRN":6,"el":26,"az":174,"ss":29,"used":true},{"PRN":26,"el":44,"az":80,"ss":36,"used":true},{"PRN":17,"el":0,"az":0,"ss":33,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.77,"ydop":0.82,"vdop":3.00,"tdop":0.89,"hdop":1.19,"gdop":2.37,"pdop":3.23,"satellites":[{"PRN":32,"el":22,"az":228,"ss":29,"used":true},{"PRN":27,"el":0,"az":0,"ss":29,"used":false},{"PRN":9,"el":12,"az":37,"ss":25,"used":true},{"PRN":12,"el":0,"az":0,"ss":32,"used":false},{"PRN":19,"el":58,"az":204,"ss":37,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":19,"used":true},{"PRN":28,"el":0,"az":0,"ss":29,"used":false},{"PRN":22,"el":47,"az":70,"ss":38,"used":true},{"PRN":15,"el":0,"az":0,"ss":24,"used":false},{"PRN":6,"el":26,"az":174,"ss":29,"used":true},{"PRN":26,"el":44,"az":80,"ss":36,"used":true},{"PRN":17,"el":0,"az":0,"ss":33,"used":false}]}
$GPGLL,5546.67138,N,02334.47421,E,143328.00,A,A*6D
{"class":"TPV","tag":"GLL","time":1260369208.000,"ept":0.005,"lat":55.777856333,"lon":23.574570167,"alt":121.700,"epx":11.523,"epy":12.231,"epv":77.050,"track":221.7300,"speed":19.507,"climb":0.000,"eps":47.52,"mode":3}
$GPZDA,143328.00,09,12,2009,00,00*68
@@ -713,7 +713,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.23,1.19,3.00*0E
$GPGSV,3,1,10,32,22,228,30,09,12,037,25,19,58,204,38,11,36,285,34*7C
$GPGSV,3,2,10,14,45,118,33,03,31,183,23,28,,,30,22,47,070,40*46
$GPGSV,3,3,10,06,26,174,30,26,44,080,37*73
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.19,"pdop":3.23,"satellites":[{"PRN":32,"el":22,"az":228,"ss":30,"used":true},{"PRN":9,"el":12,"az":37,"ss":25,"used":true},{"PRN":19,"el":58,"az":204,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":23,"used":true},{"PRN":28,"el":0,"az":0,"ss":30,"used":false},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":30,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.81,"hdop":1.19,"gdop":2.00,"pdop":3.23,"satellites":[{"PRN":32,"el":22,"az":228,"ss":30,"used":true},{"PRN":9,"el":12,"az":37,"ss":25,"used":true},{"PRN":19,"el":58,"az":204,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":23,"used":true},{"PRN":28,"el":0,"az":0,"ss":30,"used":false},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":30,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
$GPGLL,5546.66742,N,02334.46793,E,143328.50,A,A*69
{"class":"TPV","tag":"GLL","time":1260369208.500,"ept":0.005,"lat":55.777790333,"lon":23.574465500,"alt":121.800,"epx":11.523,"epy":12.231,"epv":69.000,"track":221.7300,"speed":19.567,"climb":0.000,"eps":48.93,"mode":3}
$GPZDA,143328.50,09,12,2009,00,00*6D
@@ -725,7 +725,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.23,1.19,3.00*0E
$GPGSV,3,1,10,32,22,228,30,09,12,037,26,19,58,204,39,11,36,285,35*7F
$GPGSV,3,2,10,14,45,118,33,03,31,183,25,28,,,30,22,47,070,41*41
$GPGSV,3,3,10,06,26,174,32,26,44,080,37*71
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.19,"pdop":3.23,"satellites":[{"PRN":32,"el":22,"az":228,"ss":30,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":30,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.81,"hdop":1.19,"gdop":2.00,"pdop":3.23,"satellites":[{"PRN":32,"el":22,"az":228,"ss":30,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":30,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
$GPGLL,5546.66350,N,02334.46164,E,143329.00,A,A*64
{"class":"TPV","tag":"GLL","time":1260369209.000,"ept":0.005,"lat":55.777725000,"lon":23.574360667,"alt":121.800,"epx":10.479,"epy":9.442,"epv":69.000,"track":221.8800,"speed":19.841,"climb":0.000,"eps":45.42,"mode":3}
$GPZDA,143329.00,09,12,2009,00,00*69
@@ -737,7 +737,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.65,1.28,3.41*0B
$GPGSV,3,1,10,32,22,228,30,09,12,037,26,19,58,204,39,11,36,285,34*7E
$GPGSV,3,2,10,14,45,118,33,03,31,183,28,28,,,30,22,47,070,41*4C
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":3.41,"hdop":1.28,"pdop":3.65,"satellites":[{"PRN":32,"el":22,"az":228,"ss":30,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":0,"az":0,"ss":30,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.41,"tdop":0.81,"hdop":1.28,"gdop":2.00,"pdop":3.65,"satellites":[{"PRN":32,"el":22,"az":228,"ss":30,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":0,"az":0,"ss":30,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.65952,N,02334.45524,E,143329.50,A,A*69
{"class":"TPV","tag":"GLL","time":1260369209.500,"ept":0.005,"lat":55.777658667,"lon":23.574254000,"alt":121.900,"epx":10.479,"epy":9.442,"epv":69.000,"track":222.0700,"speed":19.879,"climb":0.000,"eps":41.92,"mode":3}
$GPZDA,143329.50,09,12,2009,00,00*6C
@@ -749,7 +749,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.64,1.28,3.41*0A
$GPGSV,3,1,10,32,22,228,31,09,12,037,26,19,58,204,39,11,36,285,35*7E
$GPGSV,3,2,10,14,45,118,33,03,31,183,24,28,,,31,22,47,070,41*41
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":3.41,"hdop":1.28,"pdop":3.64,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.41,"tdop":0.81,"hdop":1.28,"gdop":2.00,"pdop":3.64,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.65551,N,02334.44882,E,143330.00,A,A*6B
{"class":"TPV","tag":"GLL","time":1260369210.000,"ept":0.005,"lat":55.777591833,"lon":23.574147000,"alt":121.900,"epx":10.479,"epy":9.442,"epv":78.430,"track":221.8800,"speed":20.021,"climb":0.000,"eps":41.92,"mode":3}
$GPZDA,143330.00,09,12,2009,00,00*61
@@ -761,7 +761,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.64,1.28,3.41*0A
$GPGSV,3,1,10,32,22,228,33,09,12,037,26,19,58,204,39,11,36,285,35*7C
$GPGSV,3,2,10,14,45,118,33,03,31,183,20,28,,,31,22,47,070,41*45
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":3.41,"hdop":1.28,"pdop":3.64,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":20,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.41,"tdop":0.81,"hdop":1.28,"gdop":2.00,"pdop":3.64,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":20,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.65146,N,02334.44238,E,143330.50,A,A*67
{"class":"TPV","tag":"GLL","time":1260369210.500,"ept":0.005,"lat":55.777524333,"lon":23.574039667,"alt":122.000,"epx":10.479,"epy":9.442,"epv":78.430,"track":221.5600,"speed":20.178,"climb":0.000,"eps":41.92,"mode":3}
$GPZDA,143330.50,09,12,2009,00,00*64
@@ -773,7 +773,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.26,1.26,3.01*06
$GPGSV,3,1,10,32,22,228,33,09,12,037,26,19,58,204,39,11,36,285,34*7D
$GPGSV,3,2,10,14,45,118,34,03,31,183,20,28,,,31,22,47,070,41*42
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":20,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.01,"tdop":0.81,"hdop":1.26,"gdop":2.00,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":204,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":20,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.64738,N,02334.43592,E,143331.00,A,A*6D
{"class":"TPV","tag":"GLL","time":1260369211.000,"ept":0.005,"lat":55.777456333,"lon":23.573932000,"alt":122.100,"epx":10.479,"epy":9.442,"epv":78.430,"track":221.5200,"speed":20.261,"climb":0.000,"eps":41.92,"mode":3}
$GPZDA,143331.00,09,12,2009,00,00*60
@@ -785,7 +785,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.26,1.26,3.00*07
$GPGSV,3,1,10,32,22,228,32,09,12,037,26,19,58,203,39,11,36,285,35*7A
$GPGSV,3,2,10,14,45,118,33,03,31,183,19,28,,,31,22,47,070,41*4F
$GPGSV,3,3,10,06,26,174,31,26,44,080,37*72
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":19,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":31,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.81,"hdop":1.26,"gdop":2.01,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":19,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":31,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
$GPGLL,5546.64328,N,02334.42943,E,143331.50,A,A*6C
{"class":"TPV","tag":"GLL","time":1260369211.500,"ept":0.005,"lat":55.777388000,"lon":23.573823833,"alt":122.200,"epx":10.479,"epy":9.442,"epv":69.230,"track":221.4700,"speed":20.357,"climb":0.000,"eps":41.92,"mode":3}
$GPZDA,143331.50,09,12,2009,00,00*65
@@ -797,7 +797,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.26,1.26,3.00*07
$GPGSV,3,1,10,32,22,228,32,09,12,037,26,19,58,203,38,11,36,285,33*7D
$GPGSV,3,2,10,14,45,118,33,03,31,183,19,28,,,30,22,47,070,40*4F
$GPGSV,3,3,10,06,26,174,31,26,44,080,37*72
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":19,"used":true},{"PRN":28,"el":0,"az":0,"ss":30,"used":false},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":31,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.81,"hdop":1.26,"gdop":2.01,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":19,"used":true},{"PRN":28,"el":0,"az":0,"ss":30,"used":false},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":31,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
$GPGLL,5546.63918,N,02334.42294,E,143332.00,A,A*65
{"class":"TPV","tag":"GLL","time":1260369212.000,"ept":0.005,"lat":55.777319667,"lon":23.573715667,"alt":122.300,"epx":10.493,"epy":9.447,"epv":69.000,"track":221.5100,"speed":20.478,"climb":0.000,"eps":41.94,"mode":3}
$GPZDA,143332.00,09,12,2009,00,00*63
@@ -809,7 +809,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.26,1.26,3.01*06
$GPGSV,3,1,10,32,22,228,32,09,12,037,26,19,58,203,38,11,36,285,32*7C
$GPGSV,3,2,10,14,45,118,32,03,31,183,19,28,,,30,22,47,070,40*4E
$GPGSV,3,3,10,06,26,174,31,26,44,080,36*73
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":32,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":19,"used":true},{"PRN":28,"el":0,"az":0,"ss":30,"used":false},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":31,"used":true},{"PRN":26,"el":44,"az":80,"ss":36,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.01,"tdop":0.81,"hdop":1.26,"gdop":2.01,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":32,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":19,"used":true},{"PRN":28,"el":0,"az":0,"ss":30,"used":false},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":31,"used":true},{"PRN":26,"el":44,"az":80,"ss":36,"used":true}]}
$GPGLL,5546.63505,N,02334.41641,E,143332.50,A,A*6F
{"class":"TPV","tag":"GLL","time":1260369212.500,"ept":0.005,"lat":55.777250833,"lon":23.573606833,"alt":122.400,"epx":10.493,"epy":9.447,"epv":69.000,"track":221.4400,"speed":20.570,"climb":0.000,"eps":41.97,"mode":3}
$GPZDA,143332.50,09,12,2009,00,00*66
@@ -821,7 +821,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.26,1.26,3.00*07
$GPGSV,3,1,10,32,22,228,31,09,12,037,26,19,58,203,38,11,36,285,32*7F
$GPGSV,3,2,10,14,45,118,32,03,31,183,19,28,,,30,22,47,070,40*4E
$GPGSV,3,3,10,06,26,174,31,26,44,080,36*73
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":32,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":19,"used":true},{"PRN":28,"el":0,"az":0,"ss":30,"used":false},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":31,"used":true},{"PRN":26,"el":44,"az":80,"ss":36,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.81,"hdop":1.26,"gdop":2.01,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":26,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":32,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":19,"used":true},{"PRN":28,"el":0,"az":0,"ss":30,"used":false},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":31,"used":true},{"PRN":26,"el":44,"az":80,"ss":36,"used":true}]}
$GPGLL,5546.63089,N,02334.40987,E,143333.00,A,A*6E
{"class":"TPV","tag":"GLL","time":1260369213.000,"ept":0.005,"lat":55.777181500,"lon":23.573497833,"alt":122.600,"epx":10.493,"epy":9.447,"epv":69.230,"track":221.5200,"speed":20.651,"climb":0.000,"eps":41.97,"mode":3}
$GPZDA,143333.00,09,12,2009,00,00*62
@@ -833,7 +833,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.26,1.26,3.01*06
$GPGSV,3,1,10,32,22,228,33,09,12,037,27,19,58,203,40,11,36,285,34*75
$GPGSV,3,2,10,14,45,118,34,03,31,183,19,28,,,31,22,47,070,42*4B
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":19,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.01,"tdop":0.81,"hdop":1.26,"gdop":2.01,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":19,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.62673,N,02334.40329,E,143333.50,A,A*67
{"class":"TPV","tag":"GLL","time":1260369213.500,"ept":0.005,"lat":55.777112167,"lon":23.573388167,"alt":122.700,"epx":10.493,"epy":9.447,"epv":69.000,"track":221.5600,"speed":20.732,"climb":0.000,"eps":41.97,"mode":3}
$GPZDA,143333.50,09,12,2009,00,00*67
@@ -845,7 +845,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.26,1.26,3.01*06
$GPGSV,3,1,10,32,22,228,33,09,12,037,27,19,58,203,40,11,36,285,35*74
$GPGSV,3,2,10,14,45,118,35,03,31,183,20,28,,,31,22,47,070,42*40
$GPGSV,3,3,10,06,26,174,33,26,44,080,38*7F
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":20,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.01,"tdop":0.81,"hdop":1.26,"gdop":2.01,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":20,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.62247,N,02334.39671,E,143334.00,A,A*60
{"class":"TPV","tag":"GLL","time":1260369214.000,"ept":0.005,"lat":55.777041167,"lon":23.573278500,"alt":122.500,"epx":10.493,"epy":9.447,"epv":69.230,"track":221.5900,"speed":20.836,"climb":0.000,"eps":41.97,"mode":3}
$GPZDA,143334.00,09,12,2009,00,00*65
@@ -857,7 +857,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.26,1.26,3.01*06
$GPGSV,3,1,10,32,22,228,33,09,12,037,27,19,58,203,40,11,36,285,35*74
$GPGSV,3,2,10,14,45,118,34,03,31,183,20,28,,,31,22,47,070,42*41
$GPGSV,3,3,10,06,26,174,33,26,44,080,39*7E
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":20,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.01,"tdop":0.81,"hdop":1.26,"gdop":2.01,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":20,"used":true},{"PRN":28,"el":0,"az":0,"ss":31,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.61820,N,02334.39009,E,143334.50,A,A*64
{"class":"TPV","tag":"GLL","time":1260369214.500,"ept":0.005,"lat":55.776970000,"lon":23.573168167,"alt":122.400,"epx":10.493,"epy":9.447,"epv":69.230,"track":221.6300,"speed":20.956,"climb":0.000,"eps":41.97,"mode":3}
$GPZDA,143334.50,09,12,2009,00,00*60
@@ -869,7 +869,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.26,1.26,3.01*06
$GPGSV,3,1,10,32,22,228,32,09,12,037,27,19,58,203,40,11,36,285,35*75
$GPGSV,3,2,10,14,45,118,34,03,31,183,24,28,,,32,22,47,070,42*46
$GPGSV,3,3,10,06,26,174,33,26,44,080,39*7E
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.01,"tdop":0.81,"hdop":1.26,"gdop":2.01,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":0,"az":0,"ss":32,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.61392,N,02334.38340,E,143335.00,A,A*6D
{"class":"TPV","tag":"GLL","time":1260369215.000,"ept":0.005,"lat":55.776898667,"lon":23.573056667,"alt":122.300,"epx":10.493,"epy":9.447,"epv":69.230,"track":221.7900,"speed":21.082,"climb":0.000,"eps":41.97,"mode":3}
$GPZDA,143335.00,09,12,2009,00,00*64
@@ -881,7 +881,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.26,1.26,3.01*06
$GPGSV,3,1,10,32,22,228,33,09,12,037,28,19,58,203,40,11,36,285,36*78
$GPGSV,3,2,10,14,45,118,35,03,31,183,24,28,,,33,22,47,070,42*46
$GPGSV,3,3,10,06,26,174,33,26,44,080,39*7E
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.01,"tdop":0.81,"hdop":1.26,"gdop":2.01,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":0,"az":0,"ss":33,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.60964,N,02334.37668,E,143335.50,A,A*6A
{"class":"TPV","tag":"GLL","time":1260369215.500,"ept":0.005,"lat":55.776827333,"lon":23.572944667,"alt":122.300,"epx":10.493,"epy":9.447,"epv":69.230,"track":221.7900,"speed":21.193,"climb":0.000,"eps":41.97,"mode":3}
$GPZDA,143335.50,09,12,2009,00,00*61
@@ -893,7 +893,7 @@ $GPGSA,A,3,32,09,19,11,14,03,22,06,26,,,,3.26,1.26,3.00*07
$GPGSV,3,1,10,32,22,228,33,09,12,037,28,19,58,203,40,11,36,285,35*7B
$GPGSV,3,2,10,14,45,118,34,03,31,183,25,28,,,34,22,47,070,42*41
$GPGSV,3,3,10,06,26,174,33,26,44,080,39*7E
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":34,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.70,"ydop":0.63,"vdop":3.00,"tdop":0.81,"hdop":1.26,"gdop":2.01,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":25,"used":true},{"PRN":28,"el":0,"az":0,"ss":34,"used":false},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.60535,N,02334.36991,E,143336.00,A,A*6C
{"class":"TPV","tag":"GLL","time":1260369216.000,"ept":0.005,"lat":55.776755833,"lon":23.572831833,"alt":122.300,"epx":10.493,"epy":9.447,"epv":69.230,"track":221.9400,"speed":21.278,"climb":0.000,"eps":41.97,"mode":3}
$GPZDA,143336.00,09,12,2009,00,00*67
@@ -905,7 +905,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,32,09,12,037,28,19,58,203,40,11,36,285,36*79
$GPGSV,3,2,10,14,45,118,34,03,31,183,27,28,19,317,34,22,47,070,42*7E
$GPGSV,3,3,10,06,26,174,33,26,44,080,39*7E
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":34,"used":true},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":34,"used":true},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.60106,N,02334.36309,E,143336.50,A,A*66
{"class":"TPV","tag":"GLL","time":1260369216.500,"ept":0.005,"lat":55.776684333,"lon":23.572718167,"alt":122.300,"epx":10.493,"epy":9.447,"epv":69.000,"track":221.8700,"speed":21.338,"climb":0.000,"eps":41.97,"mode":3}
$GPZDA,143336.50,09,12,2009,00,00*62
@@ -917,7 +917,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,32,09,12,037,28,19,58,203,40,11,36,285,35*7A
$GPGSV,3,2,10,14,45,118,35,03,31,183,27,28,19,317,33,22,47,070,42*78
$GPGSV,3,3,10,06,26,174,33,26,44,080,39*7E
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":33,"used":true},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":33,"used":true},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.59676,N,02334.35625,E,143337.00,A,A*60
{"class":"TPV","tag":"GLL","time":1260369217.000,"ept":0.005,"lat":55.776612667,"lon":23.572604167,"alt":122.300,"epx":8.881,"epy":8.766,"epv":56.580,"track":221.7700,"speed":21.389,"climb":0.000,"eps":38.75,"mode":3}
$GPZDA,143337.00,09,12,2009,00,00*66
@@ -929,7 +929,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,32,09,12,037,28,19,58,203,39,11,36,285,35*74
$GPGSV,3,2,10,14,45,118,34,03,31,183,24,28,19,317,32,22,47,070,41*78
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":19,"az":317,"ss":32,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":19,"az":317,"ss":32,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.59244,N,02334.34942,E,143337.50,A,A*6F
{"class":"TPV","tag":"GLL","time":1260369217.500,"ept":0.005,"lat":55.776540667,"lon":23.572490333,"alt":122.300,"epx":8.881,"epy":8.766,"epv":56.580,"track":221.8600,"speed":21.418,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143337.50,09,12,2009,00,00*63
@@ -941,7 +941,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,31,09,12,037,28,19,58,203,39,11,36,285,35*77
$GPGSV,3,2,10,14,45,118,34,03,31,183,27,28,19,317,34,22,47,070,41*7D
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":34,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":34,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.58812,N,02334.34258,E,143338.00,A,A*6D
{"class":"TPV","tag":"GLL","time":1260369218.000,"ept":0.005,"lat":55.776468667,"lon":23.572376333,"alt":122.300,"epx":8.881,"epy":8.766,"epv":56.580,"track":221.9900,"speed":21.452,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143338.00,09,12,2009,00,00*69
@@ -953,7 +953,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,32,09,12,037,28,19,58,203,39,11,36,285,36*77
$GPGSV,3,2,10,14,45,118,34,03,31,183,27,28,19,317,34,22,47,070,42*7E
$GPGSV,3,3,10,06,26,174,33,26,44,080,39*7E
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":34,"used":true},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":34,"used":true},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.58377,N,02334.33571,E,143338.50,A,A*6B
{"class":"TPV","tag":"GLL","time":1260369218.500,"ept":0.005,"lat":55.776396167,"lon":23.572261833,"alt":122.200,"epx":8.881,"epy":8.766,"epv":56.580,"track":222.0200,"speed":21.485,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143338.50,09,12,2009,00,00*6C
@@ -965,7 +965,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,32,09,12,037,28,19,58,203,39,11,36,285,36*77
$GPGSV,3,2,10,14,45,118,34,03,31,183,27,28,19,317,34,22,47,070,42*7E
$GPGSV,3,3,10,06,26,174,33,26,44,080,39*7E
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":34,"used":true},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":34,"used":true},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.57941,N,02334.32886,E,143339.00,A,A*6B
{"class":"TPV","tag":"GLL","time":1260369219.000,"ept":0.005,"lat":55.776323500,"lon":23.572147667,"alt":122.200,"epx":8.881,"epy":8.766,"epv":56.580,"track":221.7000,"speed":21.509,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143339.00,09,12,2009,00,00*68
@@ -977,7 +977,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.23,1.22,2.99*0D
$GPGSV,3,1,10,32,22,228,32,09,12,037,28,19,58,203,40,11,36,285,36*79
$GPGSV,3,2,10,14,45,118,35,03,31,183,24,28,19,317,34,22,47,070,42*7C
$GPGSV,3,3,10,06,26,174,33,26,44,080,38*7F
-{"class":"SKY","tag":"GSV","vdop":2.99,"hdop":1.22,"pdop":3.23,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":19,"az":317,"ss":34,"used":true},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.99,"tdop":0.99,"hdop":1.22,"gdop":2.20,"pdop":3.23,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":36,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":19,"az":317,"ss":34,"used":true},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.57509,N,02334.32202,E,143339.50,A,A*68
{"class":"TPV","tag":"GLL","time":1260369219.500,"ept":0.005,"lat":55.776251500,"lon":23.572033667,"alt":122.400,"epx":8.881,"epy":8.766,"epv":56.580,"track":221.6100,"speed":21.506,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143339.50,09,12,2009,00,00*6D
@@ -989,7 +989,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,32,09,12,037,27,19,58,203,40,11,36,285,35*75
$GPGSV,3,2,10,14,45,118,35,03,31,183,24,28,19,317,32,22,47,070,42*7A
$GPGSV,3,3,10,06,26,174,34,26,44,080,38*78
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":19,"az":317,"ss":32,"used":true},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":19,"az":317,"ss":32,"used":true},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":34,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.57072,N,02334.31519,E,143340.00,A,A*64
{"class":"TPV","tag":"GLL","time":1260369220.000,"ept":0.005,"lat":55.776178667,"lon":23.571919833,"alt":122.400,"epx":8.881,"epy":8.766,"epv":68.770,"track":221.4300,"speed":21.520,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143340.00,09,12,2009,00,00*66
@@ -1001,7 +1001,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,33,09,12,037,27,19,58,203,39,11,36,285,35*7A
$GPGSV,3,2,10,14,45,118,34,03,31,183,23,28,19,317,32,22,47,070,41*7F
$GPGSV,3,3,10,06,26,174,33,26,44,080,38*7F
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":23,"used":true},{"PRN":28,"el":19,"az":317,"ss":32,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":23,"used":true},{"PRN":28,"el":19,"az":317,"ss":32,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.56636,N,02334.30835,E,143340.50,A,A*64
{"class":"TPV","tag":"GLL","time":1260369220.500,"ept":0.005,"lat":55.776106000,"lon":23.571805833,"alt":122.300,"epx":8.881,"epy":8.766,"epv":56.580,"track":221.6200,"speed":21.535,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143340.50,09,12,2009,00,00*63
@@ -1013,7 +1013,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,33,09,12,037,27,19,58,203,40,11,36,285,35*74
$GPGSV,3,2,10,14,45,118,34,03,31,183,24,28,19,317,33,22,47,070,41*79
$GPGSV,3,3,10,06,26,174,33,26,44,080,38*7F
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":19,"az":317,"ss":33,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":19,"az":317,"ss":33,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.56202,N,02334.30147,E,143341.00,A,A*6F
{"class":"TPV","tag":"GLL","time":1260369221.000,"ept":0.005,"lat":55.776033667,"lon":23.571691167,"alt":122.400,"epx":8.881,"epy":8.766,"epv":56.580,"track":221.6400,"speed":21.579,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143341.00,09,12,2009,00,00*67
@@ -1025,7 +1025,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,33,09,12,037,27,19,58,203,40,11,36,285,35*74
$GPGSV,3,2,10,14,45,118,34,03,31,183,24,28,19,317,35,22,47,070,42*7C
$GPGSV,3,3,10,06,26,174,33,26,44,080,39*7E
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":19,"az":317,"ss":35,"used":true},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":19,"az":317,"ss":35,"used":true},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.55766,N,02334.29457,E,143341.50,A,A*62
{"class":"TPV","tag":"GLL","time":1260369221.500,"ept":0.005,"lat":55.775961000,"lon":23.571576167,"alt":122.300,"epx":8.881,"epy":8.766,"epv":56.580,"track":221.7600,"speed":21.606,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143341.50,09,12,2009,00,00*62
@@ -1037,7 +1037,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,34,09,12,037,27,19,58,203,40,11,36,285,35*73
$GPGSV,3,2,10,14,45,118,35,03,31,183,24,28,19,317,34,22,47,070,42*7C
$GPGSV,3,3,10,06,26,174,33,26,44,080,39*7E
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":19,"az":317,"ss":34,"used":true},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":40,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":35,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":19,"az":317,"ss":34,"used":true},{"PRN":22,"el":47,"az":70,"ss":42,"used":true},{"PRN":6,"el":26,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":39,"used":true}]}
$GPGLL,5546.55331,N,02334.28765,E,143342.00,A,A*61
{"class":"TPV","tag":"GLL","time":1260369222.000,"ept":0.005,"lat":55.775888500,"lon":23.571460833,"alt":122.400,"epx":8.881,"epy":8.766,"epv":56.580,"track":221.6400,"speed":21.650,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143342.00,09,12,2009,00,00*64
@@ -1049,7 +1049,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,34,09,12,037,27,19,58,203,39,11,36,285,35*7D
$GPGSV,3,2,10,14,45,118,34,03,31,183,26,28,19,317,33,22,47,070,41*7B
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":26,"used":true},{"PRN":28,"el":19,"az":317,"ss":33,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":26,"used":true},{"PRN":28,"el":19,"az":317,"ss":33,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.54894,N,02334.28072,E,143342.50,A,A*60
{"class":"TPV","tag":"GLL","time":1260369222.500,"ept":0.005,"lat":55.775815667,"lon":23.571345333,"alt":122.400,"epx":8.881,"epy":8.766,"epv":56.580,"track":221.7900,"speed":21.656,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143342.50,09,12,2009,00,00*61
@@ -1061,7 +1061,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,34,09,12,037,27,19,58,203,39,11,36,285,35*7D
$GPGSV,3,2,10,14,45,118,34,03,31,183,26,28,19,317,32,22,47,070,41*7A
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":26,"used":true},{"PRN":28,"el":19,"az":317,"ss":32,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":26,"used":true},{"PRN":28,"el":19,"az":317,"ss":32,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.54457,N,02334.27380,E,143343.00,A,A*66
{"class":"TPV","tag":"GLL","time":1260369223.000,"ept":0.005,"lat":55.775742833,"lon":23.571230000,"alt":122.400,"epx":8.881,"epy":8.766,"epv":56.580,"track":221.8100,"speed":21.673,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143343.00,09,12,2009,00,00*65
@@ -1073,7 +1073,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,34,09,12,037,27,19,58,203,39,11,36,285,35*7D
$GPGSV,3,2,10,14,45,118,34,03,31,183,23,28,19,317,31,22,47,070,41*7C
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":23,"used":true},{"PRN":28,"el":19,"az":317,"ss":31,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.99,"hdop":1.26,"gdop":2.20,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":34,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":35,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":23,"used":true},{"PRN":28,"el":19,"az":317,"ss":31,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.54019,N,02334.26687,E,143343.50,A,A*6E
{"class":"TPV","tag":"GLL","time":1260369223.500,"ept":0.005,"lat":55.775669833,"lon":23.571114500,"alt":122.500,"epx":8.881,"epy":8.766,"epv":56.580,"track":221.6700,"speed":21.721,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143343.50,09,12,2009,00,00*60
@@ -1085,7 +1085,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,33,09,12,037,27,19,58,203,39,11,36,285,34*7B
$GPGSV,3,2,10,14,45,118,34,03,31,183,24,28,19,317,32,22,47,070,41*78
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":19,"az":317,"ss":32,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":24,"used":true},{"PRN":28,"el":19,"az":317,"ss":32,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.53579,N,02334.25993,E,143344.00,A,A*61
{"class":"TPV","tag":"GLL","time":1260369224.000,"ept":0.005,"lat":55.775596500,"lon":23.570998833,"alt":122.400,"epx":8.881,"epy":8.766,"epv":69.230,"track":221.6500,"speed":21.741,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143344.00,09,12,2009,00,00*62
@@ -1097,7 +1097,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,33,09,12,037,27,19,58,203,39,11,36,285,34*7B
$GPGSV,3,2,10,14,45,118,34,03,31,183,28,28,19,317,32,22,47,070,41*74
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":32,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":33,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":32,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.53138,N,02334.25301,E,143344.50,A,A*64
{"class":"TPV","tag":"GLL","time":1260369224.500,"ept":0.005,"lat":55.775523000,"lon":23.570883500,"alt":122.300,"epx":8.881,"epy":8.766,"epv":56.580,"track":221.6100,"speed":21.763,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143344.50,09,12,2009,00,00*67
@@ -1109,7 +1109,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,32,09,12,037,28,19,58,203,39,11,36,285,33*72
$GPGSV,3,2,10,14,45,118,34,03,31,183,28,28,19,317,31,22,47,070,41*77
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":31,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":34,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":31,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.52698,N,02334.24607,E,143345.00,A,A*6E
{"class":"TPV","tag":"GLL","time":1260369225.000,"ept":0.005,"lat":55.775449667,"lon":23.570767833,"alt":122.200,"epx":8.881,"epy":8.766,"epv":56.580,"track":221.8200,"speed":21.809,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143345.00,09,12,2009,00,00*63
@@ -1121,7 +1121,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,2.66,1.01,2.46*0E
$GPGSV,3,1,10,32,22,228,32,09,12,037,27,19,58,203,39,11,36,285,32*7C
$GPGSV,3,2,10,14,45,118,33,03,31,183,28,28,19,317,31,22,47,070,41*70
$GPGSV,3,3,10,06,26,174,32,26,44,080,37*71
-{"class":"SKY","tag":"GSV","vdop":2.46,"hdop":1.01,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":32,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":31,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":2.46,"tdop":0.99,"hdop":1.01,"gdop":2.20,"pdop":2.66,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":32,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":31,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
$GPGLL,5546.52259,N,02334.23909,E,143345.50,A,A*64
{"class":"TPV","tag":"GLL","time":1260369225.500,"ept":0.005,"lat":55.775376500,"lon":23.570651500,"alt":122.100,"epx":8.881,"epy":8.766,"epv":56.580,"track":221.8800,"speed":21.830,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143345.50,09,12,2009,00,00*66
@@ -1133,7 +1133,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,31,09,12,037,27,19,58,203,38,11,36,285,32*7E
$GPGSV,3,2,10,14,45,118,33,03,31,183,28,28,19,317,30,22,47,070,40*70
$GPGSV,3,3,10,06,26,174,32,26,44,080,37*71
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":32,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.99,"hdop":1.26,"gdop":2.20,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":32,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
$GPGLL,5546.51820,N,02334.23212,E,143346.00,A,A*64
{"class":"TPV","tag":"GLL","time":1260369226.000,"ept":0.005,"lat":55.775303333,"lon":23.570535333,"alt":122.200,"epx":8.881,"epy":8.766,"epv":56.580,"track":221.8200,"speed":21.773,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143346.00,09,12,2009,00,00*60
@@ -1145,7 +1145,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,30,09,12,037,28,19,58,203,39,11,36,285,33*70
$GPGSV,3,2,10,14,45,118,33,03,31,183,28,28,19,317,30,22,47,070,40*70
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":30,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.99,"hdop":1.26,"gdop":2.20,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":30,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.51382,N,02334.22519,E,143346.50,A,A*6F
{"class":"TPV","tag":"GLL","time":1260369226.500,"ept":0.005,"lat":55.775230333,"lon":23.570419833,"alt":122.200,"epx":8.881,"epy":8.766,"epv":69.230,"track":221.9700,"speed":21.615,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143346.50,09,12,2009,00,00*65
@@ -1157,7 +1157,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,31,09,12,037,28,19,58,203,39,11,36,285,33*71
$GPGSV,3,2,10,14,45,118,33,03,31,183,28,28,19,317,30,22,47,070,41*71
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.99,"hdop":1.26,"gdop":2.20,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.50947,N,02334.21831,E,143347.00,A,A*6D
{"class":"TPV","tag":"GLL","time":1260369227.000,"ept":0.005,"lat":55.775157833,"lon":23.570305167,"alt":122.200,"epx":8.881,"epy":8.766,"epv":69.230,"track":221.7800,"speed":21.478,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143347.00,09,12,2009,00,00*61
@@ -1169,7 +1169,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.58,1.90,3.04*0D
$GPGSV,3,1,10,32,22,228,31,09,12,037,28,19,58,203,39,11,36,285,33*71
$GPGSV,3,2,10,14,45,118,33,03,31,183,28,28,19,317,30,22,47,070,40*70
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":3.04,"hdop":1.90,"pdop":3.58,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.04,"tdop":0.99,"hdop":1.90,"gdop":2.20,"pdop":3.58,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.50515,N,02334.21149,E,143347.50,A,A*65
{"class":"TPV","tag":"GLL","time":1260369227.500,"ept":0.005,"lat":55.775085833,"lon":23.570191500,"alt":122.200,"epx":8.881,"epy":8.766,"epv":69.230,"track":221.7000,"speed":21.324,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143347.50,09,12,2009,00,00*64
@@ -1181,7 +1181,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,30,09,12,037,27,19,58,203,38,11,36,285,33*7E
$GPGSV,3,2,10,14,45,118,33,03,31,183,27,28,19,317,30,22,47,070,41*7E
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":30,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.99,"hdop":1.26,"gdop":2.20,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":30,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.50086,N,02334.20472,E,143348.00,A,A*6C
{"class":"TPV","tag":"GLL","time":1260369228.000,"ept":0.005,"lat":55.775014333,"lon":23.570078667,"alt":122.200,"epx":8.881,"epy":8.766,"epv":69.920,"track":221.4600,"speed":21.164,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143348.00,09,12,2009,00,00*6E
@@ -1193,7 +1193,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,31,09,12,037,28,19,58,203,38,11,36,285,33*70
$GPGSV,3,2,10,14,45,118,33,03,31,183,27,28,19,317,30,22,47,070,40*7F
$GPGSV,3,3,10,06,26,174,32,26,44,080,37*71
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.99,"hdop":1.26,"gdop":2.20,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
$GPGLL,5546.49657,N,02334.19806,E,143348.50,A,A*6E
{"class":"TPV","tag":"GLL","time":1260369228.500,"ept":0.005,"lat":55.774942833,"lon":23.569967667,"alt":122.200,"epx":8.881,"epy":8.766,"epv":69.230,"track":221.8600,"speed":21.010,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143348.50,09,12,2009,00,00*6B
@@ -1205,7 +1205,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,31,09,12,037,28,19,58,203,39,11,36,285,34*76
$GPGSV,3,2,10,14,45,118,32,03,31,183,28,28,19,317,30,22,47,070,41*70
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.99,"hdop":1.26,"gdop":2.20,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.49236,N,02334.19138,E,143349.00,A,A*6D
{"class":"TPV","tag":"GLL","time":1260369229.000,"ept":0.005,"lat":55.774872667,"lon":23.569856333,"alt":122.300,"epx":8.881,"epy":8.766,"epv":69.230,"track":221.5400,"speed":20.871,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143349.00,09,12,2009,00,00*6F
@@ -1217,7 +1217,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,31,09,12,037,27,19,58,203,39,11,36,285,34*79
$GPGSV,3,2,10,14,45,118,33,03,31,183,28,28,19,317,30,22,47,070,41*71
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.99,"hdop":1.26,"gdop":2.20,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.48814,N,02334.18482,E,143349.50,A,A*66
{"class":"TPV","tag":"GLL","time":1260369229.500,"ept":0.005,"lat":55.774802333,"lon":23.569747000,"alt":122.300,"epx":8.881,"epy":8.766,"epv":69.230,"track":221.4400,"speed":20.723,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143349.50,09,12,2009,00,00*6A
@@ -1229,7 +1229,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,31,09,12,037,27,19,58,203,39,11,36,285,34*79
$GPGSV,3,2,10,14,45,118,32,03,31,183,27,28,19,317,30,22,47,070,41*7F
$GPGSV,3,3,10,06,26,174,32,26,44,080,38*7E
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.99,"hdop":1.26,"gdop":2.20,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":39,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":30,"used":true},{"PRN":22,"el":47,"az":70,"ss":41,"used":true},{"PRN":6,"el":26,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.48395,N,02334.17830,E,143350.00,A,A*63
{"class":"TPV","tag":"GLL","time":1260369230.000,"ept":0.005,"lat":55.774732500,"lon":23.569638333,"alt":122.300,"epx":8.881,"epy":8.766,"epv":69.230,"track":221.6000,"speed":20.550,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143350.00,09,12,2009,00,00*67
@@ -1241,7 +1241,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,31,09,12,037,27,19,58,203,38,11,36,285,33*7F
$GPGSV,3,2,10,14,45,118,32,03,31,183,28,28,19,317,29,22,47,070,40*79
$GPGSV,3,3,10,06,25,174,32,26,44,080,38*7D
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.98,"hdop":1.26,"gdop":2.18,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.47981,N,02334.17183,E,143350.50,A,A*67
{"class":"TPV","tag":"GLL","time":1260369230.500,"ept":0.005,"lat":55.774663500,"lon":23.569530500,"alt":122.400,"epx":8.881,"epy":8.766,"epv":69.230,"track":221.5000,"speed":20.376,"climb":0.000,"eps":35.52,"mode":3}
$GPZDA,143350.50,09,12,2009,00,00*62
@@ -1253,7 +1253,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,32,09,12,037,27,19,58,203,38,11,36,285,33*7C
$GPGSV,3,2,10,14,45,118,32,03,31,183,27,28,19,317,29,22,47,070,40*76
$GPGSV,3,3,10,06,25,174,33,26,44,080,38*7C
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.98,"hdop":1.26,"gdop":2.18,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":27,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":27,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.47570,N,02334.16543,E,143351.00,A,A*68
{"class":"TPV","tag":"GLL","time":1260369231.000,"ept":0.005,"lat":55.774595000,"lon":23.569423833,"alt":122.500,"epx":8.864,"epy":8.704,"epv":69.230,"track":221.8000,"speed":20.165,"climb":0.000,"eps":35.49,"mode":3}
$GPZDA,143351.00,09,12,2009,00,00*66
@@ -1265,7 +1265,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,32,09,12,037,28,19,58,203,38,11,36,285,33*73
$GPGSV,3,2,10,14,45,118,33,03,31,183,28,28,19,317,29,22,47,070,40*78
$GPGSV,3,3,10,06,25,174,33,26,44,080,38*7C
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.98,"hdop":1.26,"gdop":2.18,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.47167,N,02334.15908,E,143351.50,A,A*6F
{"class":"TPV","tag":"GLL","time":1260369231.500,"ept":0.005,"lat":55.774527833,"lon":23.569318000,"alt":122.600,"epx":8.864,"epy":8.704,"epv":69.230,"track":221.9100,"speed":19.887,"climb":0.000,"eps":35.46,"mode":3}
$GPZDA,143351.50,09,12,2009,00,00*63
@@ -1277,7 +1277,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.25,3.01*0F
$GPGSV,3,1,10,32,22,228,32,09,12,037,28,19,58,203,38,11,36,285,34*74
$GPGSV,3,2,10,14,45,118,32,03,31,183,28,28,19,317,29,22,47,070,40*79
$GPGSV,3,3,10,06,25,174,33,26,44,080,38*7C
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.25,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.98,"hdop":1.25,"gdop":2.18,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.46768,N,02334.15280,E,143352.00,A,A*6A
{"class":"TPV","tag":"GLL","time":1260369232.000,"ept":0.005,"lat":55.774461333,"lon":23.569213333,"alt":122.700,"epx":8.864,"epy":8.704,"epv":69.230,"track":222.2500,"speed":19.640,"climb":0.000,"eps":35.46,"mode":3}
$GPZDA,143352.00,09,12,2009,00,00*65
@@ -1289,7 +1289,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,30,09,12,037,28,19,58,203,38,11,36,285,34*76
$GPGSV,3,2,10,14,45,118,32,03,31,183,28,28,19,317,29,22,47,070,40*79
$GPGSV,3,3,10,06,25,174,33,26,44,080,38*7C
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":30,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.98,"hdop":1.26,"gdop":2.18,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":30,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.46376,N,02334.14654,E,143352.50,A,A*68
{"class":"TPV","tag":"GLL","time":1260369232.500,"ept":0.005,"lat":55.774396000,"lon":23.569109000,"alt":122.800,"epx":8.864,"epy":8.704,"epv":69.230,"track":221.9500,"speed":19.514,"climb":0.000,"eps":35.46,"mode":3}
$GPZDA,143352.50,09,12,2009,00,00*60
@@ -1301,7 +1301,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,31,09,12,037,28,19,58,203,38,11,36,285,33*70
$GPGSV,3,2,10,14,45,118,32,03,31,183,29,28,19,317,29,22,47,070,40*78
$GPGSV,3,3,10,06,25,174,33,26,44,080,38*7C
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":29,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.98,"hdop":1.26,"gdop":2.18,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":29,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":33,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.45986,N,02334.14036,E,143353.00,A,A*68
{"class":"TPV","tag":"GLL","time":1260369233.000,"ept":0.005,"lat":55.774331000,"lon":23.569006000,"alt":123.000,"epx":8.864,"epy":8.704,"epv":69.230,"track":221.9900,"speed":19.323,"climb":0.000,"eps":35.46,"mode":3}
$GPZDA,143353.00,09,12,2009,00,00*64
@@ -1313,7 +1313,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,32,09,12,037,28,19,58,203,38,11,36,285,33*73
$GPGSV,3,2,10,14,45,118,33,03,31,183,28,28,19,317,29,22,47,070,40*78
$GPGSV,3,3,10,06,25,174,32,26,44,080,38*7D
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.98,"hdop":1.26,"gdop":2.18,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.45601,N,02334.13425,E,143353.50,A,A*6C
{"class":"TPV","tag":"GLL","time":1260369233.500,"ept":0.005,"lat":55.774266833,"lon":23.568904167,"alt":123.100,"epx":8.864,"epy":8.704,"epv":69.230,"track":221.7200,"speed":19.034,"climb":0.000,"eps":35.46,"mode":3}
$GPZDA,143353.50,09,12,2009,00,00*61
@@ -1325,7 +1325,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,31,09,12,037,28,19,58,203,38,11,36,285,33*70
$GPGSV,3,2,10,14,45,118,32,03,31,183,28,28,19,317,29,22,47,070,40*79
$GPGSV,3,3,10,06,25,174,32,26,44,080,38*7D
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.98,"hdop":1.26,"gdop":2.18,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":33,"used":true},{"PRN":14,"el":45,"az":118,"ss":32,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.45220,N,02334.12827,E,143354.00,A,A*66
{"class":"TPV","tag":"GLL","time":1260369234.000,"ept":0.005,"lat":55.774203333,"lon":23.568804500,"alt":123.300,"epx":8.864,"epy":8.704,"epv":69.230,"track":221.8900,"speed":18.685,"climb":0.000,"eps":35.46,"mode":3}
$GPZDA,143354.00,09,12,2009,00,00*63
@@ -1337,7 +1337,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.26,3.01*0C
$GPGSV,3,1,10,32,22,228,31,09,12,037,28,19,58,203,38,11,36,285,34*77
$GPGSV,3,2,10,14,45,118,33,03,31,183,28,28,19,317,29,22,47,070,40*78
$GPGSV,3,3,10,06,25,174,32,26,44,080,37*72
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.26,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.98,"hdop":1.26,"gdop":2.18,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":31,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":37,"used":true}]}
$GPGLL,5546.44845,N,02334.12240,E,143354.50,A,A*60
{"class":"TPV","tag":"GLL","time":1260369234.500,"ept":0.005,"lat":55.774140833,"lon":23.568706667,"alt":123.500,"epx":8.864,"epy":8.704,"epv":69.230,"track":221.4800,"speed":18.371,"climb":0.000,"eps":35.46,"mode":3}
$GPZDA,143354.50,09,12,2009,00,00*66
@@ -1349,7 +1349,7 @@ $GPGSA,A,3,32,09,19,11,14,03,28,22,06,26,,,3.26,1.25,3.01*0F
$GPGSV,3,1,10,32,22,228,32,09,12,037,28,19,58,203,38,11,36,285,34*74
$GPGSV,3,2,10,14,45,118,33,03,31,183,28,28,19,317,29,22,47,070,40*78
$GPGSV,3,3,10,06,25,174,32,26,44,080,38*7D
-{"class":"SKY","tag":"GSV","vdop":3.01,"hdop":1.25,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.59,"ydop":0.58,"vdop":3.01,"tdop":0.98,"hdop":1.25,"gdop":2.18,"pdop":3.26,"satellites":[{"PRN":32,"el":22,"az":228,"ss":32,"used":true},{"PRN":9,"el":12,"az":37,"ss":28,"used":true},{"PRN":19,"el":58,"az":203,"ss":38,"used":true},{"PRN":11,"el":36,"az":285,"ss":34,"used":true},{"PRN":14,"el":45,"az":118,"ss":33,"used":true},{"PRN":3,"el":31,"az":183,"ss":28,"used":true},{"PRN":28,"el":19,"az":317,"ss":29,"used":true},{"PRN":22,"el":47,"az":70,"ss":40,"used":true},{"PRN":6,"el":25,"az":174,"ss":32,"used":true},{"PRN":26,"el":44,"az":80,"ss":38,"used":true}]}
$GPGLL,5546.44478,N,02334.11667,E,143355.00,A,A*64
{"class":"TPV","tag":"GLL","time":1260369235.000,"ept":0.005,"lat":55.774079667,"lon":23.568611167,"alt":123.500,"epx":8.864,"epy":8.704,"epv":69.230,"track":221.4700,"speed":17.939,"climb":0.000,"eps":35.46,"mode":3}
$GPZDA,143355.00,09,12,2009,00,00*62
diff --git a/test/daemon/bu303-climbing.log.chk b/test/daemon/bu303-climbing.log.chk
index cb88708c..fab5fa09 100644
--- a/test/daemon/bu303-climbing.log.chk
+++ b/test/daemon/bu303-climbing.log.chk
@@ -3,225 +3,197 @@ $GPGSV,2,2,07,08,44,058,43,27,16,066,37,21,10,301,00*4A
{"class":"SKY","tag":"MID4","time":1119197546.890,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":10,"el":45,"az":196,"ss":10,"used":false},{"PRN":29,"el":67,"az":310,"ss":42,"used":false},{"PRN":28,"el":59,"az":108,"ss":40,"used":false},{"PRN":26,"el":51,"az":304,"ss":44,"used":false},{"PRN":8,"el":44,"az":58,"ss":43,"used":false},{"PRN":27,"el":16,"az":66,"ss":37,"used":false},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161226,4629.8923,N,00734.0837,E,1,05,3.20,1327.69,M,48.183,M,,*7D
$GPRMC,161226,A,4629.8923,N,00734.0837,E,0.1673,180.000,190605,,*29
-$GPGSA,A,3,29,28,26,08,27,,,,,,,,5.6,3.2,5.4*39
-$GPGBS,161226,15.32,M,17.05,M,124.48,M*33
-{"class":"TPV","tag":"MID2","time":1119197546.890,"ept":0.005,"lat":46.498204497,"lon":7.568061439,"alt":1327.689,"epx":15.319,"epy":17.054,"epv":124.484,"track":180.0000,"speed":0.086,"climb":-0.091,"mode":3}
+$GPGSA,A,3,29,28,26,08,27,,,,,,,,0.0,3.2,0.0*3B
+{"class":"TPV","tag":"MID2","time":1119197546.890,"ept":0.005,"lat":46.498204497,"lon":7.568061439,"alt":1327.689,"track":180.0000,"speed":0.086,"climb":-0.091,"mode":3}
$GPGSV,2,1,07,10,45,196,08,29,67,310,41,28,59,108,40,26,51,304,43*7D
$GPGSV,2,2,07,08,44,058,42,27,16,066,36,21,10,301,00*4A
{"class":"SKY","tag":"MID4","time":1119197547.890,"xdop":1.02,"ydop":1.14,"vdop":5.41,"tdop":4.30,"hdop":3.20,"gdop":7.08,"pdop":5.62,"satellites":[{"PRN":10,"el":45,"az":196,"ss":8,"used":false},{"PRN":29,"el":67,"az":310,"ss":41,"used":true},{"PRN":28,"el":59,"az":108,"ss":40,"used":true},{"PRN":26,"el":51,"az":304,"ss":43,"used":true},{"PRN":8,"el":44,"az":58,"ss":42,"used":true},{"PRN":27,"el":16,"az":66,"ss":36,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161227,4629.8923,N,00734.0837,E,1,05,3.20,1327.69,M,48.183,M,,*7C
$GPRMC,161227,A,4629.8923,N,00734.0837,E,0.1776,10.380,190605,,*1F
-$GPGSA,A,3,29,28,26,08,27,,,,,,,,5.6,3.2,5.4*39
-$GPGBS,161227,15.32,M,17.05,M,124.48,M*32
-{"class":"TPV","tag":"MID2","time":1119197547.890,"ept":0.005,"lat":46.498204497,"lon":7.568061439,"alt":1327.689,"epx":15.319,"epy":17.054,"epv":124.484,"track":10.3797,"speed":0.091,"climb":-0.085,"eps":34.11,"mode":3}
+$GPGSA,A,3,29,28,26,08,27,,,,,,,,0.0,3.2,0.0*3B
+{"class":"TPV","tag":"MID2","time":1119197547.890,"ept":0.005,"lat":46.498204497,"lon":7.568061439,"alt":1327.689,"track":10.3797,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,07,10,45,196,33,29,67,310,42,28,59,108,42,26,51,304,43*74
$GPGSV,2,2,07,08,44,058,44,27,16,066,36,21,10,301,00*4C
{"class":"SKY","tag":"MID4","time":1119197548.890,"xdop":1.02,"ydop":1.14,"vdop":5.41,"tdop":4.30,"hdop":3.20,"gdop":7.08,"pdop":5.62,"satellites":[{"PRN":10,"el":45,"az":196,"ss":33,"used":false},{"PRN":29,"el":67,"az":310,"ss":42,"used":true},{"PRN":28,"el":59,"az":108,"ss":42,"used":true},{"PRN":26,"el":51,"az":304,"ss":43,"used":true},{"PRN":8,"el":44,"az":58,"ss":44,"used":true},{"PRN":27,"el":16,"az":66,"ss":36,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161228,4629.8923,N,00734.0837,E,1,06,1.40,1327.69,M,48.183,M,,*74
$GPRMC,161228,A,4629.8923,N,00734.0837,E,0.1673,180.000,190605,,*27
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161228,15.28,M,16.17,M,58.85,M*0F
-{"class":"TPV","tag":"MID2","time":1119197548.890,"ept":0.005,"lat":46.498204497,"lon":7.568061439,"alt":1327.689,"epx":15.279,"epy":16.167,"epv":58.845,"track":180.0000,"speed":0.086,"climb":-0.091,"eps":33.22,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197548.890,"ept":0.005,"lat":46.498204497,"lon":7.568061439,"alt":1327.689,"track":180.0000,"speed":0.086,"climb":-0.091,"mode":3}
$GPGSV,2,1,07,10,45,196,31,29,67,310,43,28,59,108,42,26,51,304,45*71
$GPGSV,2,2,07,08,44,058,46,27,16,066,42,21,10,301,00*4D
{"class":"SKY","tag":"MID4","time":1119197549.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":31,"used":true},{"PRN":29,"el":67,"az":310,"ss":43,"used":true},{"PRN":28,"el":59,"az":108,"ss":42,"used":true},{"PRN":26,"el":51,"az":304,"ss":45,"used":true},{"PRN":8,"el":44,"az":58,"ss":46,"used":true},{"PRN":27,"el":16,"az":66,"ss":42,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161229,4629.8923,N,00734.0837,E,1,06,1.40,1327.69,M,48.183,M,,*75
$GPRMC,161229,A,4629.8923,N,00734.0837,E,0.0000,0.000,190605,,*2C
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161229,15.28,M,16.17,M,58.85,M*0E
-{"class":"TPV","tag":"MID2","time":1119197549.890,"ept":0.005,"lat":46.498204497,"lon":7.568061439,"alt":1327.689,"epx":15.279,"epy":16.167,"epv":58.845,"track":0.0000,"speed":0.000,"climb":0.000,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197549.890,"ept":0.005,"lat":46.498204497,"lon":7.568061439,"alt":1327.689,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,07,10,45,196,33,29,67,310,40,28,59,108,41,26,51,304,43*75
$GPGSV,2,2,07,08,44,058,44,27,16,066,40,21,10,301,00*4D
{"class":"SKY","tag":"MID4","time":1119197550.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":33,"used":true},{"PRN":29,"el":67,"az":310,"ss":40,"used":true},{"PRN":28,"el":59,"az":108,"ss":41,"used":true},{"PRN":26,"el":51,"az":304,"ss":43,"used":true},{"PRN":8,"el":44,"az":58,"ss":44,"used":true},{"PRN":27,"el":16,"az":66,"ss":40,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161230,4629.8919,N,00734.0837,E,1,06,1.40,1326.96,M,48.183,M,,*75
$GPRMC,161230,A,4629.8919,N,00734.0837,E,0.1673,180.000,190605,,*27
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161230,15.28,M,16.17,M,58.85,M*06
-{"class":"TPV","tag":"MID2","time":1119197550.890,"ept":0.005,"lat":46.498198306,"lon":7.568061439,"alt":1326.964,"epx":15.279,"epy":16.167,"epv":58.845,"track":180.0000,"speed":0.086,"climb":-0.091,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197550.890,"ept":0.005,"lat":46.498198306,"lon":7.568061439,"alt":1326.964,"track":180.0000,"speed":0.086,"climb":-0.091,"mode":3}
$GPGSV,2,1,07,10,45,196,34,29,67,310,40,28,59,108,43,26,51,304,43*70
$GPGSV,2,2,07,08,44,058,42,27,16,066,39,21,10,301,00*45
{"class":"SKY","tag":"MID4","time":1119197551.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":34,"used":true},{"PRN":29,"el":67,"az":310,"ss":40,"used":true},{"PRN":28,"el":59,"az":108,"ss":43,"used":true},{"PRN":26,"el":51,"az":304,"ss":43,"used":true},{"PRN":8,"el":44,"az":58,"ss":42,"used":true},{"PRN":27,"el":16,"az":66,"ss":39,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161231,4629.8919,N,00734.0837,E,1,06,1.40,1326.96,M,48.183,M,,*74
$GPRMC,161231,A,4629.8919,N,00734.0837,E,0.0000,0.000,190605,,*2C
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161231,15.28,M,16.17,M,58.85,M*07
-{"class":"TPV","tag":"MID2","time":1119197551.890,"ept":0.005,"lat":46.498198306,"lon":7.568061439,"alt":1326.964,"epx":15.279,"epy":16.167,"epv":58.845,"track":0.0000,"speed":0.000,"climb":0.000,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197551.890,"ept":0.005,"lat":46.498198306,"lon":7.568061439,"alt":1326.964,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,07,10,45,196,35,29,67,310,39,28,59,108,43,26,51,304,43*7F
$GPGSV,2,2,07,08,44,058,42,27,16,066,38,21,10,301,00*44
{"class":"SKY","tag":"MID4","time":1119197552.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":35,"used":true},{"PRN":29,"el":67,"az":310,"ss":39,"used":true},{"PRN":28,"el":59,"az":108,"ss":43,"used":true},{"PRN":26,"el":51,"az":304,"ss":43,"used":true},{"PRN":8,"el":44,"az":58,"ss":42,"used":true},{"PRN":27,"el":16,"az":66,"ss":38,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161232,4629.8919,N,00734.0837,E,1,06,1.40,1326.96,M,48.183,M,,*77
$GPRMC,161232,A,4629.8919,N,00734.0837,E,0.0000,0.000,190605,,*2F
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161232,15.28,M,16.17,M,58.85,M*04
-{"class":"TPV","tag":"MID2","time":1119197552.890,"ept":0.005,"lat":46.498198306,"lon":7.568061439,"alt":1326.964,"epx":15.279,"epy":16.167,"epv":58.845,"track":0.0000,"speed":0.000,"climb":0.000,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197552.890,"ept":0.005,"lat":46.498198306,"lon":7.568061439,"alt":1326.964,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,07,10,45,196,37,29,67,310,40,28,59,108,45,26,51,304,42*74
$GPGSV,2,2,07,08,44,058,42,27,16,066,38,21,10,301,00*44
{"class":"SKY","tag":"MID4","time":1119197553.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":37,"used":true},{"PRN":29,"el":67,"az":310,"ss":40,"used":true},{"PRN":28,"el":59,"az":108,"ss":45,"used":true},{"PRN":26,"el":51,"az":304,"ss":42,"used":true},{"PRN":8,"el":44,"az":58,"ss":42,"used":true},{"PRN":27,"el":16,"az":66,"ss":38,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161233,4629.8919,N,00734.0837,E,1,06,1.40,1326.96,M,48.183,M,,*76
$GPRMC,161233,A,4629.8919,N,00734.0837,E,0.0000,0.000,190605,,*2E
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161233,15.28,M,16.17,M,58.85,M*05
-{"class":"TPV","tag":"MID2","time":1119197553.890,"ept":0.005,"lat":46.498198306,"lon":7.568061439,"alt":1326.964,"epx":15.279,"epy":16.167,"epv":58.845,"track":0.0000,"speed":0.000,"climb":0.000,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197553.890,"ept":0.005,"lat":46.498198306,"lon":7.568061439,"alt":1326.964,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,07,10,45,196,37,29,67,310,41,28,59,108,44,26,51,304,43*75
$GPGSV,2,2,07,08,44,058,42,27,16,066,38,21,10,301,00*44
{"class":"SKY","tag":"MID4","time":1119197554.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":37,"used":true},{"PRN":29,"el":67,"az":310,"ss":41,"used":true},{"PRN":28,"el":59,"az":108,"ss":44,"used":true},{"PRN":26,"el":51,"az":304,"ss":43,"used":true},{"PRN":8,"el":44,"az":58,"ss":42,"used":true},{"PRN":27,"el":16,"az":66,"ss":38,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161234,4629.8918,N,00734.0845,E,1,06,1.40,1327.05,M,48.183,M,,*7E
$GPRMC,161234,A,4629.8918,N,00734.0845,E,0.0000,0.000,190605,,*2D
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161234,15.28,M,16.17,M,58.85,M*02
-{"class":"TPV","tag":"MID2","time":1119197554.890,"ept":0.005,"lat":46.498197446,"lon":7.568074350,"alt":1327.054,"epx":15.279,"epy":16.167,"epv":58.845,"track":0.0000,"speed":0.000,"climb":0.000,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197554.890,"ept":0.005,"lat":46.498197446,"lon":7.568074350,"alt":1327.054,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,07,10,45,196,36,29,67,310,40,28,59,108,43,26,51,304,42*73
$GPGSV,2,2,07,08,44,058,42,27,16,066,38,21,10,301,00*44
{"class":"SKY","tag":"MID4","time":1119197555.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":36,"used":true},{"PRN":29,"el":67,"az":310,"ss":40,"used":true},{"PRN":28,"el":59,"az":108,"ss":43,"used":true},{"PRN":26,"el":51,"az":304,"ss":42,"used":true},{"PRN":8,"el":44,"az":58,"ss":42,"used":true},{"PRN":27,"el":16,"az":66,"ss":38,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161235,4629.8918,N,00734.0845,E,1,06,1.40,1327.05,M,48.183,M,,*7F
$GPRMC,161235,A,4629.8918,N,00734.0845,E,0.0000,0.000,190605,,*2C
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161235,15.28,M,16.17,M,58.85,M*03
-{"class":"TPV","tag":"MID2","time":1119197555.890,"ept":0.005,"lat":46.498197446,"lon":7.568074350,"alt":1327.054,"epx":15.279,"epy":16.167,"epv":58.845,"track":0.0000,"speed":0.000,"climb":0.000,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197555.890,"ept":0.005,"lat":46.498197446,"lon":7.568074350,"alt":1327.054,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,07,10,45,196,35,29,67,310,40,28,59,108,43,26,51,304,41*73
$GPGSV,2,2,07,08,44,058,41,27,16,066,39,21,10,301,00*46
{"class":"SKY","tag":"MID4","time":1119197556.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":35,"used":true},{"PRN":29,"el":67,"az":310,"ss":40,"used":true},{"PRN":28,"el":59,"az":108,"ss":43,"used":true},{"PRN":26,"el":51,"az":304,"ss":41,"used":true},{"PRN":8,"el":44,"az":58,"ss":41,"used":true},{"PRN":27,"el":16,"az":66,"ss":39,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161236,4629.8918,N,00734.0845,E,1,06,1.40,1327.05,M,48.183,M,,*7C
$GPRMC,161236,A,4629.8918,N,00734.0845,E,0.0000,0.000,190605,,*2F
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161236,15.28,M,16.17,M,58.85,M*00
-{"class":"TPV","tag":"MID2","time":1119197556.890,"ept":0.005,"lat":46.498197446,"lon":7.568074350,"alt":1327.054,"epx":15.279,"epy":16.167,"epv":58.845,"track":0.0000,"speed":0.000,"climb":0.000,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197556.890,"ept":0.005,"lat":46.498197446,"lon":7.568074350,"alt":1327.054,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,07,10,45,196,34,29,67,310,40,28,59,108,43,26,51,304,42*71
$GPGSV,2,2,07,08,44,058,41,27,16,066,39,21,10,301,00*46
{"class":"SKY","tag":"MID4","time":1119197557.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":34,"used":true},{"PRN":29,"el":67,"az":310,"ss":40,"used":true},{"PRN":28,"el":59,"az":108,"ss":43,"used":true},{"PRN":26,"el":51,"az":304,"ss":42,"used":true},{"PRN":8,"el":44,"az":58,"ss":41,"used":true},{"PRN":27,"el":16,"az":66,"ss":39,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161237,4629.8918,N,00734.0845,E,1,06,1.40,1327.05,M,48.183,M,,*7D
$GPRMC,161237,A,4629.8918,N,00734.0845,E,0.0000,0.000,190605,,*2E
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161237,15.28,M,16.17,M,58.85,M*01
-{"class":"TPV","tag":"MID2","time":1119197557.890,"ept":0.005,"lat":46.498197446,"lon":7.568074350,"alt":1327.054,"epx":15.279,"epy":16.167,"epv":58.845,"track":0.0000,"speed":0.000,"climb":0.000,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197557.890,"ept":0.005,"lat":46.498197446,"lon":7.568074350,"alt":1327.054,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,07,10,45,196,33,29,67,310,40,28,59,108,44,26,51,304,42*71
$GPGSV,2,2,07,08,44,058,41,27,16,066,38,21,10,301,00*47
{"class":"SKY","tag":"MID4","time":1119197558.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":33,"used":true},{"PRN":29,"el":67,"az":310,"ss":40,"used":true},{"PRN":28,"el":59,"az":108,"ss":44,"used":true},{"PRN":26,"el":51,"az":304,"ss":42,"used":true},{"PRN":8,"el":44,"az":58,"ss":41,"used":true},{"PRN":27,"el":16,"az":66,"ss":38,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161238,4629.8922,N,00734.0845,E,1,06,1.40,1327.78,M,48.183,M,,*71
$GPRMC,161238,A,4629.8922,N,00734.0845,E,0.0000,0.000,190605,,*28
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161238,15.28,M,16.17,M,58.85,M*0E
-{"class":"TPV","tag":"MID2","time":1119197558.890,"ept":0.005,"lat":46.498203638,"lon":7.568074350,"alt":1327.780,"epx":15.279,"epy":16.167,"epv":58.845,"track":0.0000,"speed":0.000,"climb":0.000,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197558.890,"ept":0.005,"lat":46.498203638,"lon":7.568074350,"alt":1327.780,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,07,10,45,196,34,29,67,310,40,28,59,108,43,26,51,304,43*70
$GPGSV,2,2,07,08,44,058,41,27,16,066,40,21,10,301,00*48
{"class":"SKY","tag":"MID4","time":1119197559.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":34,"used":true},{"PRN":29,"el":67,"az":310,"ss":40,"used":true},{"PRN":28,"el":59,"az":108,"ss":43,"used":true},{"PRN":26,"el":51,"az":304,"ss":43,"used":true},{"PRN":8,"el":44,"az":58,"ss":41,"used":true},{"PRN":27,"el":16,"az":66,"ss":40,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161239,4629.8922,N,00734.0845,E,1,06,1.40,1327.78,M,48.183,M,,*70
$GPRMC,161239,A,4629.8922,N,00734.0845,E,0.0000,0.000,190605,,*29
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161239,15.28,M,16.17,M,58.85,M*0F
-{"class":"TPV","tag":"MID2","time":1119197559.890,"ept":0.005,"lat":46.498203638,"lon":7.568074350,"alt":1327.780,"epx":15.279,"epy":16.167,"epv":58.845,"track":0.0000,"speed":0.000,"climb":0.000,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197559.890,"ept":0.005,"lat":46.498203638,"lon":7.568074350,"alt":1327.780,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,07,10,45,196,34,29,67,310,40,28,59,108,43,26,51,304,44*77
$GPGSV,2,2,07,08,44,058,41,27,16,066,40,21,10,301,00*48
{"class":"SKY","tag":"MID4","time":1119197560.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":34,"used":true},{"PRN":29,"el":67,"az":310,"ss":40,"used":true},{"PRN":28,"el":59,"az":108,"ss":43,"used":true},{"PRN":26,"el":51,"az":304,"ss":44,"used":true},{"PRN":8,"el":44,"az":58,"ss":41,"used":true},{"PRN":27,"el":16,"az":66,"ss":40,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161240,4629.8922,N,00734.0845,E,1,06,1.40,1327.78,M,48.183,M,,*7E
$GPRMC,161240,A,4629.8922,N,00734.0845,E,0.0000,0.000,190605,,*27
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161240,15.28,M,16.17,M,58.85,M*01
-{"class":"TPV","tag":"MID2","time":1119197560.890,"ept":0.005,"lat":46.498203638,"lon":7.568074350,"alt":1327.780,"epx":15.279,"epy":16.167,"epv":58.845,"track":0.0000,"speed":0.000,"climb":0.000,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197560.890,"ept":0.005,"lat":46.498203638,"lon":7.568074350,"alt":1327.780,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,07,10,45,196,34,29,67,310,40,28,59,108,43,26,51,304,44*77
$GPGSV,2,2,07,08,44,058,42,27,16,066,40,21,10,301,00*4B
{"class":"SKY","tag":"MID4","time":1119197561.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":34,"used":true},{"PRN":29,"el":67,"az":310,"ss":40,"used":true},{"PRN":28,"el":59,"az":108,"ss":43,"used":true},{"PRN":26,"el":51,"az":304,"ss":44,"used":true},{"PRN":8,"el":44,"az":58,"ss":42,"used":true},{"PRN":27,"el":16,"az":66,"ss":40,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161241,4629.8925,N,00734.0852,E,1,06,1.40,1328.60,M,48.183,M,,*78
$GPRMC,161241,A,4629.8925,N,00734.0852,E,0.0000,0.000,190605,,*27
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161241,15.28,M,16.17,M,58.85,M*00
-{"class":"TPV","tag":"MID2","time":1119197561.890,"ept":0.005,"lat":46.498208970,"lon":7.568087260,"alt":1328.596,"epx":15.279,"epy":16.167,"epv":58.845,"track":0.0000,"speed":0.000,"climb":0.000,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197561.890,"ept":0.005,"lat":46.498208970,"lon":7.568087260,"alt":1328.596,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,07,10,45,196,31,29,67,310,37,28,59,108,38,26,51,304,41*7B
$GPGSV,2,2,07,08,44,058,39,27,16,066,37,21,10,301,00*47
{"class":"SKY","tag":"MID4","time":1119197562.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":31,"used":true},{"PRN":29,"el":67,"az":310,"ss":37,"used":true},{"PRN":28,"el":59,"az":108,"ss":38,"used":true},{"PRN":26,"el":51,"az":304,"ss":41,"used":true},{"PRN":8,"el":44,"az":58,"ss":39,"used":true},{"PRN":27,"el":16,"az":66,"ss":37,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161242,4629.8925,N,00734.0852,E,1,06,1.40,1328.60,M,48.183,M,,*7B
$GPRMC,161242,A,4629.8925,N,00734.0852,E,0.1776,190.380,190605,,*20
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161242,15.28,M,16.17,M,58.85,M*03
-{"class":"TPV","tag":"MID2","time":1119197562.890,"ept":0.005,"lat":46.498208970,"lon":7.568087260,"alt":1328.596,"epx":15.279,"epy":16.167,"epv":58.845,"track":190.3797,"speed":0.091,"climb":0.085,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197562.890,"ept":0.005,"lat":46.498208970,"lon":7.568087260,"alt":1328.596,"track":190.3797,"speed":0.091,"climb":0.085,"mode":3}
$GPGSV,2,1,07,10,45,196,41,29,67,310,43,28,59,108,39,26,51,304,44*7B
$GPGSV,2,2,07,08,44,058,39,27,16,066,21,21,10,301,00*40
{"class":"SKY","tag":"MID4","time":1119197563.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":41,"used":true},{"PRN":29,"el":67,"az":310,"ss":43,"used":true},{"PRN":28,"el":59,"az":108,"ss":39,"used":true},{"PRN":26,"el":51,"az":304,"ss":44,"used":true},{"PRN":8,"el":44,"az":58,"ss":39,"used":true},{"PRN":27,"el":16,"az":66,"ss":21,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161243,4629.8929,N,00734.0852,E,1,06,1.40,1329.32,M,48.183,M,,*70
$GPRMC,161243,A,4629.8929,N,00734.0852,E,0.1673,0.000,190605,,*2A
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161243,15.28,M,16.17,M,58.85,M*02
-{"class":"TPV","tag":"MID2","time":1119197563.890,"ept":0.005,"lat":46.498215161,"lon":7.568087260,"alt":1329.321,"epx":15.279,"epy":16.167,"epv":58.845,"track":0.0000,"speed":0.086,"climb":0.091,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197563.890,"ept":0.005,"lat":46.498215161,"lon":7.568087260,"alt":1329.321,"track":0.0000,"speed":0.086,"climb":0.091,"mode":3}
$GPGSV,2,1,07,10,45,196,44,29,67,310,44,28,59,108,44,26,51,304,42*75
$GPGSV,2,2,07,08,44,058,42,27,16,066,36,21,10,301,00*4A
{"class":"SKY","tag":"MID4","time":1119197564.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":44,"used":true},{"PRN":29,"el":67,"az":310,"ss":44,"used":true},{"PRN":28,"el":59,"az":108,"ss":44,"used":true},{"PRN":26,"el":51,"az":304,"ss":42,"used":true},{"PRN":8,"el":44,"az":58,"ss":42,"used":true},{"PRN":27,"el":16,"az":66,"ss":36,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161244,4629.8933,N,00734.0853,E,1,06,1.40,1328.64,M,48.183,M,,*7F
$GPRMC,161244,A,4629.8933,N,00734.0853,E,0.1673,0.000,190605,,*27
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161244,15.28,M,16.17,M,58.85,M*05
-{"class":"TPV","tag":"MID2","time":1119197564.890,"ept":0.005,"lat":46.498221628,"lon":7.568088976,"alt":1328.639,"epx":15.279,"epy":16.167,"epv":58.845,"track":0.0000,"speed":0.086,"climb":0.091,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197564.890,"ept":0.005,"lat":46.498221628,"lon":7.568088976,"alt":1328.639,"track":0.0000,"speed":0.086,"climb":0.091,"mode":3}
$GPGSV,2,1,07,10,45,196,44,29,67,310,44,28,59,108,45,26,51,304,43*75
$GPGSV,2,2,07,08,44,058,42,27,16,066,39,21,10,301,00*45
{"class":"SKY","tag":"MID4","time":1119197565.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":44,"used":true},{"PRN":29,"el":67,"az":310,"ss":44,"used":true},{"PRN":28,"el":59,"az":108,"ss":45,"used":true},{"PRN":26,"el":51,"az":304,"ss":43,"used":true},{"PRN":8,"el":44,"az":58,"ss":42,"used":true},{"PRN":27,"el":16,"az":66,"ss":39,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161245,4629.8933,N,00734.0853,E,1,06,1.40,1328.64,M,48.183,M,,*7E
$GPRMC,161245,A,4629.8933,N,00734.0853,E,0.2420,95.505,190605,,*1D
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161245,15.28,M,16.17,M,58.85,M*04
-{"class":"TPV","tag":"MID2","time":1119197565.890,"ept":0.005,"lat":46.498221628,"lon":7.568088976,"alt":1328.639,"epx":15.279,"epy":16.167,"epv":58.845,"track":95.5047,"speed":0.124,"climb":0.011,"eps":32.33,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197565.890,"ept":0.005,"lat":46.498221628,"lon":7.568088976,"alt":1328.639,"track":95.5047,"speed":0.124,"climb":0.011,"mode":3}
$GPGSV,2,1,07,10,45,196,43,29,67,312,46,28,59,108,45,26,51,304,43*72
$GPGSV,2,2,07,08,44,058,45,27,16,066,39,21,10,301,00*42
-{"class":"SKY","tag":"MID4","time":1119197566.890,"xdop":1.02,"ydop":1.08,"vdop":2.56,"tdop":1.96,"hdop":1.40,"gdop":3.55,"pdop":2.96,"satellites":[{"PRN":10,"el":45,"az":196,"ss":43,"used":true},{"PRN":29,"el":67,"az":312,"ss":46,"used":true},{"PRN":28,"el":59,"az":108,"ss":45,"used":true},{"PRN":26,"el":51,"az":304,"ss":43,"used":true},{"PRN":8,"el":44,"az":58,"ss":45,"used":true},{"PRN":27,"el":16,"az":66,"ss":39,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
+{"class":"SKY","tag":"MID4","time":1119197566.890,"xdop":1.02,"ydop":1.07,"vdop":2.55,"tdop":1.96,"hdop":1.40,"gdop":3.54,"pdop":2.95,"satellites":[{"PRN":10,"el":45,"az":196,"ss":43,"used":true},{"PRN":29,"el":67,"az":312,"ss":46,"used":true},{"PRN":28,"el":59,"az":108,"ss":45,"used":true},{"PRN":26,"el":51,"az":304,"ss":43,"used":true},{"PRN":8,"el":44,"az":58,"ss":45,"used":true},{"PRN":27,"el":16,"az":66,"ss":39,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161246,4629.8933,N,00734.0853,E,1,06,1.40,1328.64,M,48.183,M,,*7D
$GPRMC,161246,A,4629.8933,N,00734.0853,E,0.1776,190.380,190605,,*22
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161246,15.30,M,16.12,M,58.73,M*02
-{"class":"TPV","tag":"MID2","time":1119197566.890,"ept":0.005,"lat":46.498221628,"lon":7.568088976,"alt":1328.639,"epx":15.296,"epy":16.119,"epv":58.728,"track":190.3797,"speed":0.091,"climb":0.085,"eps":32.29,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197566.890,"ept":0.005,"lat":46.498221628,"lon":7.568088976,"alt":1328.639,"track":190.3797,"speed":0.091,"climb":0.085,"mode":3}
$GPGSV,2,1,07,10,45,196,44,29,67,312,47,28,59,108,45,26,51,304,41*76
$GPGSV,2,2,07,08,44,058,46,27,16,066,40,21,10,301,00*4F
{"class":"SKY","tag":"MID4","time":1119197567.890,"xdop":1.02,"ydop":1.07,"vdop":2.55,"tdop":1.96,"hdop":1.40,"gdop":3.54,"pdop":2.95,"satellites":[{"PRN":10,"el":45,"az":196,"ss":44,"used":true},{"PRN":29,"el":67,"az":312,"ss":47,"used":true},{"PRN":28,"el":59,"az":108,"ss":45,"used":true},{"PRN":26,"el":51,"az":304,"ss":41,"used":true},{"PRN":8,"el":44,"az":58,"ss":46,"used":true},{"PRN":27,"el":16,"az":66,"ss":40,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161247,4629.8929,N,00734.0852,E,1,06,1.40,1329.32,M,48.183,M,,*74
$GPRMC,161247,A,4629.8929,N,00734.0852,E,0.1776,190.380,190605,,*29
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161247,15.30,M,16.12,M,58.73,M*03
-{"class":"TPV","tag":"MID2","time":1119197567.890,"ept":0.005,"lat":46.498215161,"lon":7.568087260,"alt":1329.321,"epx":15.296,"epy":16.119,"epv":58.728,"track":190.3797,"speed":0.091,"climb":0.085,"eps":32.24,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197567.890,"ept":0.005,"lat":46.498215161,"lon":7.568087260,"alt":1329.321,"track":190.3797,"speed":0.091,"climb":0.085,"mode":3}
$GPGSV,2,1,07,10,45,196,45,29,67,312,47,28,59,108,45,26,51,304,40*76
$GPGSV,2,2,07,08,44,058,46,27,16,066,38,21,10,301,00*40
{"class":"SKY","tag":"MID4","time":1119197568.890,"xdop":1.02,"ydop":1.07,"vdop":2.55,"tdop":1.96,"hdop":1.40,"gdop":3.54,"pdop":2.95,"satellites":[{"PRN":10,"el":45,"az":196,"ss":45,"used":true},{"PRN":29,"el":67,"az":312,"ss":47,"used":true},{"PRN":28,"el":59,"az":108,"ss":45,"used":true},{"PRN":26,"el":51,"az":304,"ss":40,"used":true},{"PRN":8,"el":44,"az":58,"ss":46,"used":true},{"PRN":27,"el":16,"az":66,"ss":38,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161248,4629.8929,N,00734.0852,E,1,06,1.40,1329.32,M,48.183,M,,*7B
$GPRMC,161248,A,4629.8929,N,00734.0852,E,0.1776,190.380,190605,,*26
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161248,15.30,M,16.12,M,58.73,M*0C
-{"class":"TPV","tag":"MID2","time":1119197568.890,"ept":0.005,"lat":46.498215161,"lon":7.568087260,"alt":1329.321,"epx":15.296,"epy":16.119,"epv":58.728,"track":190.3797,"speed":0.091,"climb":0.085,"eps":32.24,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197568.890,"ept":0.005,"lat":46.498215161,"lon":7.568087260,"alt":1329.321,"track":190.3797,"speed":0.091,"climb":0.085,"mode":3}
$GPGSV,2,1,07,10,45,196,45,29,67,312,47,28,59,108,43,26,51,304,41*71
$GPGSV,2,2,07,08,44,058,46,27,16,066,39,21,10,301,00*41
{"class":"SKY","tag":"MID4","time":1119197569.890,"xdop":1.02,"ydop":1.07,"vdop":2.55,"tdop":1.96,"hdop":1.40,"gdop":3.54,"pdop":2.95,"satellites":[{"PRN":10,"el":45,"az":196,"ss":45,"used":true},{"PRN":29,"el":67,"az":312,"ss":47,"used":true},{"PRN":28,"el":59,"az":108,"ss":43,"used":true},{"PRN":26,"el":51,"az":304,"ss":41,"used":true},{"PRN":8,"el":44,"az":58,"ss":46,"used":true},{"PRN":27,"el":16,"az":66,"ss":39,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161249,4629.8933,N,00734.0852,E,1,06,1.40,1330.05,M,48.183,M,,*7D
$GPRMC,161249,A,4629.8933,N,00734.0852,E,0.1776,190.380,190605,,*2C
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161249,15.30,M,16.12,M,58.73,M*0D
-{"class":"TPV","tag":"MID2","time":1119197569.890,"ept":0.005,"lat":46.498221352,"lon":7.568087260,"alt":1330.046,"epx":15.296,"epy":16.119,"epv":58.728,"track":190.3797,"speed":0.091,"climb":0.085,"eps":32.24,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197569.890,"ept":0.005,"lat":46.498221352,"lon":7.568087260,"alt":1330.046,"track":190.3797,"speed":0.091,"climb":0.085,"mode":3}
$GPGSV,2,1,07,10,45,196,43,29,67,312,46,28,59,108,43,26,51,304,42*75
$GPGSV,2,2,07,08,44,058,46,27,16,066,40,21,10,301,00*4F
{"class":"SKY","tag":"MID4","time":1119197570.890,"xdop":1.02,"ydop":1.07,"vdop":2.55,"tdop":1.96,"hdop":1.40,"gdop":3.54,"pdop":2.95,"satellites":[{"PRN":10,"el":45,"az":196,"ss":43,"used":true},{"PRN":29,"el":67,"az":312,"ss":46,"used":true},{"PRN":28,"el":59,"az":108,"ss":43,"used":true},{"PRN":26,"el":51,"az":304,"ss":42,"used":true},{"PRN":8,"el":44,"az":58,"ss":46,"used":true},{"PRN":27,"el":16,"az":66,"ss":40,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161250,4629.8929,N,00734.0851,E,1,06,1.40,1330.73,M,48.183,M,,*7C
$GPRMC,161250,A,4629.8929,N,00734.0851,E,0.1776,190.380,190605,,*2C
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161250,15.30,M,16.12,M,58.73,M*05
-{"class":"TPV","tag":"MID2","time":1119197570.890,"ept":0.005,"lat":46.498214885,"lon":7.568085545,"alt":1330.729,"epx":15.296,"epy":16.119,"epv":58.728,"track":190.3797,"speed":0.091,"climb":0.085,"eps":32.24,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197570.890,"ept":0.005,"lat":46.498214885,"lon":7.568085545,"alt":1330.729,"track":190.3797,"speed":0.091,"climb":0.085,"mode":3}
$GPGSV,2,1,07,10,45,196,44,29,67,312,46,28,59,108,46,26,51,304,46*73
$GPGSV,2,2,07,08,44,058,47,27,16,066,38,21,10,301,00*41
{"class":"SKY","tag":"MID4","time":1119197571.890,"xdop":1.02,"ydop":1.07,"vdop":2.55,"tdop":1.96,"hdop":1.40,"gdop":3.54,"pdop":2.95,"satellites":[{"PRN":10,"el":45,"az":196,"ss":44,"used":true},{"PRN":29,"el":67,"az":312,"ss":46,"used":true},{"PRN":28,"el":59,"az":108,"ss":46,"used":true},{"PRN":26,"el":51,"az":304,"ss":46,"used":true},{"PRN":8,"el":44,"az":58,"ss":47,"used":true},{"PRN":27,"el":16,"az":66,"ss":38,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161251,4629.8929,N,00734.0851,E,1,06,1.40,1330.73,M,48.183,M,,*7D
$GPRMC,161251,A,4629.8929,N,00734.0851,E,0.2420,275.505,190605,,*2D
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161251,15.30,M,16.12,M,58.73,M*04
-{"class":"TPV","tag":"MID2","time":1119197571.890,"ept":0.005,"lat":46.498214885,"lon":7.568085545,"alt":1330.729,"epx":15.296,"epy":16.119,"epv":58.728,"track":275.5047,"speed":0.124,"climb":-0.011,"eps":32.24,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197571.890,"ept":0.005,"lat":46.498214885,"lon":7.568085545,"alt":1330.729,"track":275.5047,"speed":0.124,"climb":-0.011,"mode":3}
$GPGSV,2,1,07,10,45,196,45,29,67,312,47,28,59,108,44,26,51,304,46*71
$GPGSV,2,2,07,08,44,058,45,27,16,066,39,21,10,301,00*42
{"class":"SKY","tag":"MID4","time":1119197572.890,"xdop":1.02,"ydop":1.07,"vdop":2.55,"tdop":1.96,"hdop":1.40,"gdop":3.54,"pdop":2.95,"satellites":[{"PRN":10,"el":45,"az":196,"ss":45,"used":true},{"PRN":29,"el":67,"az":312,"ss":47,"used":true},{"PRN":28,"el":59,"az":108,"ss":44,"used":true},{"PRN":26,"el":51,"az":304,"ss":46,"used":true},{"PRN":8,"el":44,"az":58,"ss":45,"used":true},{"PRN":27,"el":16,"az":66,"ss":39,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161252,4629.8929,N,00734.0844,E,1,06,1.40,1330.64,M,48.183,M,,*7C
$GPRMC,161252,A,4629.8929,N,00734.0844,E,1.4953,310.306,190605,,*23
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161252,15.30,M,16.12,M,58.73,M*07
-{"class":"TPV","tag":"MID2","time":1119197572.890,"ept":0.005,"lat":46.498215744,"lon":7.568072634,"alt":1330.638,"epx":15.296,"epy":16.119,"epv":58.728,"track":310.3062,"speed":0.769,"climb":0.045,"eps":32.24,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197572.890,"ept":0.005,"lat":46.498215744,"lon":7.568072634,"alt":1330.638,"track":310.3062,"speed":0.769,"climb":0.045,"mode":3}
$GPGSV,2,1,07,10,45,196,45,29,67,312,46,28,59,108,45,26,51,304,44*73
$GPGSV,2,2,07,08,44,058,44,27,16,066,37,21,10,301,00*4D
{"class":"SKY","tag":"MID4","time":1119197573.890,"xdop":1.02,"ydop":1.07,"vdop":2.55,"tdop":1.96,"hdop":1.40,"gdop":3.54,"pdop":2.95,"satellites":[{"PRN":10,"el":45,"az":196,"ss":45,"used":true},{"PRN":29,"el":67,"az":312,"ss":46,"used":true},{"PRN":28,"el":59,"az":108,"ss":45,"used":true},{"PRN":26,"el":51,"az":304,"ss":44,"used":true},{"PRN":8,"el":44,"az":58,"ss":44,"used":true},{"PRN":27,"el":16,"az":66,"ss":37,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
$GPGGA,161253,4629.8934,N,00734.0836,E,1,06,1.40,1331.27,M,48.183,M,,*72
$GPRMC,161253,A,4629.8934,N,00734.0836,E,2.2921,306.984,190605,,*2C
-$GPGSA,A,3,10,29,28,26,08,27,,,,,,,3.0,1.4,2.6*39
-$GPGBS,161253,15.30,M,16.12,M,58.73,M*06
-{"class":"TPV","tag":"MID2","time":1119197573.890,"ept":0.005,"lat":46.498222795,"lon":7.568059724,"alt":1331.273,"epx":15.296,"epy":16.119,"epv":58.728,"track":306.9839,"speed":1.179,"climb":0.016,"eps":32.24,"mode":3}
+$GPGSA,A,3,10,29,28,26,08,27,,,,,,,0.0,1.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1119197573.890,"ept":0.005,"lat":46.498222795,"lon":7.568059724,"alt":1331.273,"track":306.9839,"speed":1.179,"climb":0.016,"mode":3}
$GPGSV,2,1,07,10,45,196,45,29,67,312,44,28,59,108,45,26,51,304,44*71
$GPGSV,2,2,07,08,44,058,42,27,16,066,41,21,10,301,00*4A
{"class":"SKY","tag":"MID4","time":1119197574.890,"xdop":1.02,"ydop":1.07,"vdop":2.55,"tdop":1.96,"hdop":1.40,"gdop":3.54,"pdop":2.95,"satellites":[{"PRN":10,"el":45,"az":196,"ss":45,"used":true},{"PRN":29,"el":67,"az":312,"ss":44,"used":true},{"PRN":28,"el":59,"az":108,"ss":45,"used":true},{"PRN":26,"el":51,"az":304,"ss":44,"used":true},{"PRN":8,"el":44,"az":58,"ss":42,"used":true},{"PRN":27,"el":16,"az":66,"ss":41,"used":true},{"PRN":21,"el":10,"az":301,"ss":0,"used":false}]}
diff --git a/test/daemon/bu303-moving.log.chk b/test/daemon/bu303-moving.log.chk
index a9d959cc..2fab9849 100644
--- a/test/daemon/bu303-moving.log.chk
+++ b/test/daemon/bu303-moving.log.chk
@@ -4,220 +4,193 @@ $GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
{"class":"TPV","tag":"MID2","time":1118327687.280,"ept":0.005,"lat":46.498287178,"lon":7.567411672,"alt":1342.402,"track":10.3788,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,44,29,13,273,00*74
$GPGSV,2,2,08,10,51,304,29,04,15,199,36,02,34,241,43,27,71,076,43*7C
-{"class":"SKY","tag":"MID4","time":1118327688.280,"hdop":2.40,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":44,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":29,"used":true},{"PRN":4,"el":15,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":43,"used":true},{"PRN":27,"el":71,"az":76,"ss":43,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118327688.280,"xdop":0.73,"ydop":1.04,"vdop":1.41,"tdop":0.78,"hdop":2.40,"gdop":2.05,"pdop":1.89,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":44,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":29,"used":true},{"PRN":4,"el":15,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":43,"used":true},{"PRN":27,"el":71,"az":76,"ss":43,"used":true}]}
$GPGGA,143448,4629.8976,N,00734.0447,E,1,05,2.40,1343.13,M,48.183,M,,*70
$GPRMC,143448,A,4629.8976,N,00734.0447,E,0.1776,10.379,090605,,*1C
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143448,10.97,M,15.58,M,32.32,M*06
-{"class":"TPV","tag":"MID2","time":1118327688.280,"ept":0.005,"lat":46.498293369,"lon":7.567411672,"alt":1343.127,"epx":10.972,"epy":15.581,"epv":32.321,"track":10.3788,"speed":0.091,"climb":-0.085,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327688.280,"ept":0.005,"lat":46.498293369,"lon":7.567411672,"alt":1343.127,"track":10.3788,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,44,29,13,273,00*74
$GPGSV,2,2,08,10,51,304,28,04,15,199,37,02,34,241,43,27,71,076,43*7C
{"class":"SKY","tag":"MID4","time":1118327689.280,"xdop":0.73,"ydop":1.04,"vdop":1.41,"tdop":0.78,"hdop":2.40,"gdop":2.05,"pdop":1.89,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":44,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":28,"used":true},{"PRN":4,"el":15,"az":199,"ss":37,"used":true},{"PRN":2,"el":34,"az":241,"ss":43,"used":true},{"PRN":27,"el":71,"az":76,"ss":43,"used":true}]}
$GPGGA,143449,4629.8980,N,00734.0440,E,1,05,2.40,1342.35,M,48.183,M,,*7A
$GPRMC,143449,A,4629.8980,N,00734.0440,E,0.1776,10.379,090605,,*13
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143449,10.97,M,15.58,M,32.32,M*07
-{"class":"TPV","tag":"MID2","time":1118327689.280,"ept":0.005,"lat":46.498300695,"lon":7.567400477,"alt":1342.354,"epx":10.972,"epy":15.581,"epv":32.321,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":31.16,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327689.280,"ept":0.005,"lat":46.498300695,"lon":7.567400477,"alt":1342.354,"track":10.3788,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,44,29,13,273,00*74
$GPGSV,2,2,08,10,51,304,27,04,15,199,35,02,34,241,42,27,71,076,42*71
{"class":"SKY","tag":"MID4","time":1118327690.280,"xdop":0.73,"ydop":1.04,"vdop":1.41,"tdop":0.78,"hdop":2.40,"gdop":2.05,"pdop":1.89,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":44,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":27,"used":true},{"PRN":4,"el":15,"az":199,"ss":35,"used":true},{"PRN":2,"el":34,"az":241,"ss":42,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143450,4629.8984,N,00734.0440,E,1,04,3.20,1343.08,M,48.183,M,,*7F
$GPRMC,143450,A,4629.8984,N,00734.0440,E,0.1776,10.379,090605,,*1F
-$GPGSA,A,3,08,04,02,27,,,,,,,,,2.1,3.2,1.6*3C
-$GPGBS,143450,11.01,M,18.29,M,35.88,M*0C
-{"class":"TPV","tag":"MID2","time":1118327690.280,"ept":0.005,"lat":46.498306887,"lon":7.567400477,"alt":1343.079,"epx":11.014,"epy":18.289,"epv":35.884,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":33.87,"mode":3}
+$GPGSA,A,3,08,04,02,27,,,,,,,,,0.0,3.2,0.0*38
+{"class":"TPV","tag":"MID2","time":1118327690.280,"ept":0.005,"lat":46.498306887,"lon":7.567400477,"alt":1343.079,"track":10.3788,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,44,29,13,273,00*74
$GPGSV,2,2,08,10,51,304,28,04,15,199,36,02,34,241,42,27,71,076,42*7D
{"class":"SKY","tag":"MID4","time":1118327691.280,"xdop":0.73,"ydop":1.22,"vdop":1.56,"tdop":0.79,"hdop":3.20,"gdop":2.25,"pdop":2.11,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":44,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":28,"used":false},{"PRN":4,"el":15,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":42,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143451,4629.8984,N,00734.0440,E,1,05,2.40,1343.08,M,48.183,M,,*78
$GPRMC,143451,A,4629.8984,N,00734.0440,E,0.1776,10.379,090605,,*1E
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143451,10.97,M,15.58,M,32.32,M*0E
-{"class":"TPV","tag":"MID2","time":1118327691.280,"ept":0.005,"lat":46.498306887,"lon":7.567400477,"alt":1343.079,"epx":10.972,"epy":15.581,"epv":32.321,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":33.87,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327691.280,"ept":0.005,"lat":46.498306887,"lon":7.567400477,"alt":1343.079,"track":10.3788,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,45,29,13,273,00*75
$GPGSV,2,2,08,10,51,304,28,04,15,199,38,02,34,241,43,27,71,076,42*72
{"class":"SKY","tag":"MID4","time":1118327692.280,"xdop":0.73,"ydop":1.04,"vdop":1.41,"tdop":0.78,"hdop":2.40,"gdop":2.05,"pdop":1.89,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":28,"used":true},{"PRN":4,"el":15,"az":199,"ss":38,"used":true},{"PRN":2,"el":34,"az":241,"ss":43,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143452,4629.8992,N,00734.0441,E,1,05,2.40,1343.12,M,48.183,M,,*76
$GPRMC,143452,A,4629.8992,N,00734.0441,E,0.1776,10.379,090605,,*1B
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143452,10.97,M,15.58,M,32.32,M*0D
-{"class":"TPV","tag":"MID2","time":1118327692.280,"ept":0.005,"lat":46.498319545,"lon":7.567402192,"alt":1343.122,"epx":10.972,"epy":15.581,"epv":32.321,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":31.16,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327692.280,"ept":0.005,"lat":46.498319545,"lon":7.567402192,"alt":1343.122,"track":10.3788,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,45,29,13,273,00*75
$GPGSV,2,2,08,10,51,304,29,04,15,199,37,02,34,241,42,27,71,076,42*7D
{"class":"SKY","tag":"MID4","time":1118327693.280,"xdop":0.73,"ydop":1.04,"vdop":1.41,"tdop":0.78,"hdop":2.40,"gdop":2.05,"pdop":1.89,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":29,"used":true},{"PRN":4,"el":15,"az":199,"ss":37,"used":true},{"PRN":2,"el":34,"az":241,"ss":42,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143453,4629.8992,N,00734.0441,E,1,05,2.40,1343.12,M,48.183,M,,*77
$GPRMC,143453,A,4629.8992,N,00734.0441,E,0.1776,10.379,090605,,*1A
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143453,10.97,M,15.58,M,32.32,M*0C
-{"class":"TPV","tag":"MID2","time":1118327693.280,"ept":0.005,"lat":46.498319545,"lon":7.567402192,"alt":1343.122,"epx":10.972,"epy":15.581,"epv":32.321,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":31.16,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327693.280,"ept":0.005,"lat":46.498319545,"lon":7.567402192,"alt":1343.122,"track":10.3788,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,45,29,13,273,00*75
$GPGSV,2,2,08,10,51,304,32,04,15,199,36,02,34,241,43,27,71,076,42*77
{"class":"SKY","tag":"MID4","time":1118327694.280,"xdop":0.73,"ydop":1.04,"vdop":1.41,"tdop":0.78,"hdop":2.40,"gdop":2.05,"pdop":1.89,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":32,"used":true},{"PRN":4,"el":15,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":43,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143454,4629.8992,N,00734.0441,E,1,05,2.40,1343.12,M,48.183,M,,*70
$GPRMC,143454,A,4629.8992,N,00734.0441,E,0.1776,10.379,090605,,*1D
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143454,10.97,M,15.58,M,32.32,M*0B
-{"class":"TPV","tag":"MID2","time":1118327694.280,"ept":0.005,"lat":46.498319545,"lon":7.567402192,"alt":1343.122,"epx":10.972,"epy":15.581,"epv":32.321,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":31.16,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327694.280,"ept":0.005,"lat":46.498319545,"lon":7.567402192,"alt":1343.122,"track":10.3788,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,45,29,13,273,00*75
$GPGSV,2,2,08,10,51,304,29,04,15,199,36,02,34,241,41,27,71,076,42*7F
{"class":"SKY","tag":"MID4","time":1118327695.280,"xdop":0.73,"ydop":1.04,"vdop":1.41,"tdop":0.78,"hdop":2.40,"gdop":2.05,"pdop":1.89,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":29,"used":true},{"PRN":4,"el":15,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":41,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143455,4629.8999,N,00734.0442,E,1,05,2.40,1343.17,M,48.183,M,,*7C
$GPRMC,143455,A,4629.8999,N,00734.0442,E,0.1776,10.379,090605,,*14
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143455,10.97,M,15.58,M,32.32,M*0A
-{"class":"TPV","tag":"MID2","time":1118327695.280,"ept":0.005,"lat":46.498332203,"lon":7.567403907,"alt":1343.165,"epx":10.972,"epy":15.581,"epv":32.321,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":31.16,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327695.280,"ept":0.005,"lat":46.498332203,"lon":7.567403907,"alt":1343.165,"track":10.3788,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,45,29,13,273,00*75
$GPGSV,2,2,08,10,51,304,25,04,15,199,36,02,34,241,42,27,71,076,42*70
{"class":"SKY","tag":"MID4","time":1118327696.280,"xdop":0.73,"ydop":1.04,"vdop":1.41,"tdop":0.78,"hdop":2.40,"gdop":2.05,"pdop":1.89,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":25,"used":true},{"PRN":4,"el":15,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":42,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143456,4629.8999,N,00734.0442,E,1,04,3.20,1343.17,M,48.183,M,,*79
$GPRMC,143456,A,4629.8999,N,00734.0442,E,0.1776,10.379,090605,,*17
-$GPGSA,A,3,08,04,02,27,,,,,,,,,2.1,3.2,1.6*3C
-$GPGBS,143456,11.01,M,18.29,M,35.88,M*0A
-{"class":"TPV","tag":"MID2","time":1118327696.280,"ept":0.005,"lat":46.498332203,"lon":7.567403907,"alt":1343.165,"epx":11.014,"epy":18.289,"epv":35.884,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":33.87,"mode":3}
+$GPGSA,A,3,08,04,02,27,,,,,,,,,0.0,3.2,0.0*38
+{"class":"TPV","tag":"MID2","time":1118327696.280,"ept":0.005,"lat":46.498332203,"lon":7.567403907,"alt":1343.165,"track":10.3788,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,46,29,13,273,00*76
$GPGSV,2,2,08,10,51,304,32,04,15,199,36,02,34,241,42,27,71,076,42*76
{"class":"SKY","tag":"MID4","time":1118327697.280,"xdop":0.73,"ydop":1.22,"vdop":1.56,"tdop":0.79,"hdop":3.20,"gdop":2.25,"pdop":2.11,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":46,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":32,"used":false},{"PRN":4,"el":15,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":42,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143457,4629.9000,N,00734.0435,E,1,05,2.40,1343.07,M,48.183,M,,*77
$GPRMC,143457,A,4629.9000,N,00734.0435,E,0.1776,10.379,090605,,*1E
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143457,10.97,M,15.58,M,32.32,M*08
-{"class":"TPV","tag":"MID2","time":1118327697.280,"ept":0.005,"lat":46.498333062,"lon":7.567390997,"alt":1343.075,"epx":10.972,"epy":15.581,"epv":32.321,"track":10.3787,"speed":0.091,"climb":-0.085,"eps":33.87,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327697.280,"ept":0.005,"lat":46.498333062,"lon":7.567390997,"alt":1343.075,"track":10.3787,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,46,29,13,273,00*76
$GPGSV,2,2,08,10,51,304,31,04,15,199,37,02,34,241,42,27,71,076,43*75
{"class":"SKY","tag":"MID4","time":1118327698.280,"xdop":0.73,"ydop":1.04,"vdop":1.41,"tdop":0.78,"hdop":2.40,"gdop":2.05,"pdop":1.89,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":46,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":31,"used":true},{"PRN":4,"el":15,"az":199,"ss":37,"used":true},{"PRN":2,"el":34,"az":241,"ss":42,"used":true},{"PRN":27,"el":71,"az":76,"ss":43,"used":true}]}
$GPGGA,143458,4629.9004,N,00734.0436,E,1,05,2.40,1342.39,M,48.183,M,,*73
$GPRMC,143458,A,4629.9004,N,00734.0436,E,0.1776,10.379,090605,,*16
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143458,10.97,M,15.58,M,32.32,M*07
-{"class":"TPV","tag":"MID2","time":1118327698.280,"ept":0.005,"lat":46.498339529,"lon":7.567392712,"alt":1342.392,"epx":10.972,"epy":15.581,"epv":32.321,"track":10.3787,"speed":0.091,"climb":-0.085,"eps":31.16,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327698.280,"ept":0.005,"lat":46.498339529,"lon":7.567392712,"alt":1342.392,"track":10.3787,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,46,29,13,273,00*76
$GPGSV,2,2,08,10,51,304,30,04,15,199,34,02,34,241,43,27,71,076,43*76
{"class":"SKY","tag":"MID4","time":1118327699.280,"xdop":0.73,"ydop":1.04,"vdop":1.41,"tdop":0.78,"hdop":2.40,"gdop":2.05,"pdop":1.89,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":46,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":30,"used":true},{"PRN":4,"el":15,"az":199,"ss":34,"used":true},{"PRN":2,"el":34,"az":241,"ss":43,"used":true},{"PRN":27,"el":71,"az":76,"ss":43,"used":true}]}
$GPGGA,143459,4629.9004,N,00734.0436,E,1,05,2.40,1342.39,M,48.183,M,,*72
$GPRMC,143459,A,4629.9004,N,00734.0436,E,0.1776,10.379,090605,,*17
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143459,10.97,M,15.58,M,32.32,M*06
-{"class":"TPV","tag":"MID2","time":1118327699.280,"ept":0.005,"lat":46.498339529,"lon":7.567392712,"alt":1342.392,"epx":10.972,"epy":15.581,"epv":32.321,"track":10.3787,"speed":0.091,"climb":-0.085,"eps":31.16,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327699.280,"ept":0.005,"lat":46.498339529,"lon":7.567392712,"alt":1342.392,"track":10.3787,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,45,29,13,273,00*75
$GPGSV,2,2,08,10,51,304,25,04,15,199,36,02,34,241,40,27,71,076,42*72
{"class":"SKY","tag":"MID4","time":1118327700.280,"xdop":0.73,"ydop":1.04,"vdop":1.41,"tdop":0.78,"hdop":2.40,"gdop":2.05,"pdop":1.89,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":25,"used":true},{"PRN":4,"el":15,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":40,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143500,4629.9004,N,00734.0436,E,1,04,3.20,1342.39,M,48.183,M,,*79
$GPRMC,143500,A,4629.9004,N,00734.0436,E,0.1776,10.379,090605,,*1A
-$GPGSA,A,3,08,04,02,27,,,,,,,,,2.1,3.2,1.6*3C
-$GPGBS,143500,11.01,M,18.29,M,35.88,M*08
-{"class":"TPV","tag":"MID2","time":1118327700.280,"ept":0.005,"lat":46.498339529,"lon":7.567392712,"alt":1342.392,"epx":11.014,"epy":18.289,"epv":35.884,"track":10.3787,"speed":0.091,"climb":-0.085,"eps":33.87,"mode":3}
+$GPGSA,A,3,08,04,02,27,,,,,,,,,0.0,3.2,0.0*38
+{"class":"TPV","tag":"MID2","time":1118327700.280,"ept":0.005,"lat":46.498339529,"lon":7.567392712,"alt":1342.392,"track":10.3787,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,45,29,13,273,00*75
$GPGSV,2,2,08,10,51,304,30,04,15,199,36,02,34,241,43,27,71,076,42*75
{"class":"SKY","tag":"MID4","time":1118327701.280,"xdop":0.73,"ydop":1.22,"vdop":1.56,"tdop":0.79,"hdop":3.20,"gdop":2.25,"pdop":2.11,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":30,"used":false},{"PRN":4,"el":15,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":43,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143501,4629.9008,N,00734.0437,E,1,05,2.40,1341.71,M,48.183,M,,*7C
$GPRMC,143501,A,4629.9008,N,00734.0437,E,0.1776,10.379,090605,,*16
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143501,10.97,M,15.58,M,32.32,M*0A
-{"class":"TPV","tag":"MID2","time":1118327701.280,"ept":0.005,"lat":46.498345996,"lon":7.567394427,"alt":1341.710,"epx":10.972,"epy":15.581,"epv":32.321,"track":10.3787,"speed":0.091,"climb":-0.085,"eps":33.87,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327701.280,"ept":0.005,"lat":46.498345996,"lon":7.567394427,"alt":1341.710,"track":10.3787,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,45,29,13,273,00*75
$GPGSV,2,2,08,10,51,304,05,04,15,199,35,02,34,241,42,27,71,076,43*70
{"class":"SKY","tag":"MID4","time":1118327702.280,"xdop":0.73,"ydop":1.04,"vdop":1.41,"tdop":0.78,"hdop":2.40,"gdop":2.05,"pdop":1.89,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":5,"used":true},{"PRN":4,"el":15,"az":199,"ss":35,"used":true},{"PRN":2,"el":34,"az":241,"ss":42,"used":true},{"PRN":27,"el":71,"az":76,"ss":43,"used":true}]}
$GPGGA,143502,4629.9008,N,00734.0429,E,1,04,3.20,1341.62,M,48.183,M,,*74
$GPRMC,143502,A,4629.9008,N,00734.0429,E,0.1776,10.379,090605,,*1A
-$GPGSA,A,3,08,04,02,27,,,,,,,,,2.1,3.2,1.6*3C
-$GPGBS,143502,11.01,M,18.29,M,35.88,M*0A
-{"class":"TPV","tag":"MID2","time":1118327702.280,"ept":0.005,"lat":46.498346855,"lon":7.567381517,"alt":1341.619,"epx":11.014,"epy":18.289,"epv":35.884,"track":10.3787,"speed":0.091,"climb":-0.085,"eps":33.87,"mode":3}
+$GPGSA,A,3,08,04,02,27,,,,,,,,,0.0,3.2,0.0*38
+{"class":"TPV","tag":"MID2","time":1118327702.280,"ept":0.005,"lat":46.498346855,"lon":7.567381517,"alt":1341.619,"track":10.3787,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,45,29,13,273,00*75
$GPGSV,2,2,08,10,51,304,00,04,15,199,34,02,34,241,42,27,71,076,43*74
{"class":"SKY","tag":"MID4","time":1118327703.280,"xdop":0.73,"ydop":1.22,"vdop":1.56,"tdop":0.79,"hdop":3.20,"gdop":2.25,"pdop":2.11,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":0,"used":false},{"PRN":4,"el":15,"az":199,"ss":34,"used":true},{"PRN":2,"el":34,"az":241,"ss":42,"used":true},{"PRN":27,"el":71,"az":76,"ss":43,"used":true}]}
$GPGGA,143503,4629.9008,N,00734.0429,E,1,04,3.20,1341.62,M,48.183,M,,*75
$GPRMC,143503,A,4629.9008,N,00734.0429,E,0.1776,10.379,090605,,*1B
-$GPGSA,A,3,08,04,02,27,,,,,,,,,2.1,3.2,1.6*3C
-$GPGBS,143503,11.01,M,18.29,M,35.88,M*0B
-{"class":"TPV","tag":"MID2","time":1118327703.280,"ept":0.005,"lat":46.498346855,"lon":7.567381517,"alt":1341.619,"epx":11.014,"epy":18.289,"epv":35.884,"track":10.3787,"speed":0.091,"climb":-0.085,"eps":36.58,"mode":3}
+$GPGSA,A,3,08,04,02,27,,,,,,,,,0.0,3.2,0.0*38
+{"class":"TPV","tag":"MID2","time":1118327703.280,"ept":0.005,"lat":46.498346855,"lon":7.567381517,"alt":1341.619,"track":10.3787,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,46,29,13,273,00*76
$GPGSV,2,2,08,10,51,304,00,04,15,199,34,02,34,241,40,27,71,076,42*77
{"class":"SKY","tag":"MID4","time":1118327704.280,"xdop":0.73,"ydop":1.22,"vdop":1.56,"tdop":0.79,"hdop":3.20,"gdop":2.25,"pdop":2.11,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":46,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":0,"used":false},{"PRN":4,"el":15,"az":199,"ss":34,"used":true},{"PRN":2,"el":34,"az":241,"ss":40,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143504,4629.9008,N,00734.0429,E,1,04,3.20,1341.62,M,48.183,M,,*72
$GPRMC,143504,A,4629.9008,N,00734.0429,E,0.1776,10.379,090605,,*1C
-$GPGSA,A,3,08,04,02,27,,,,,,,,,2.1,3.2,1.6*3C
-$GPGBS,143504,11.01,M,18.29,M,35.88,M*0C
-{"class":"TPV","tag":"MID2","time":1118327704.280,"ept":0.005,"lat":46.498346855,"lon":7.567381517,"alt":1341.619,"epx":11.014,"epy":18.289,"epv":35.884,"track":10.3787,"speed":0.091,"climb":-0.085,"eps":36.58,"mode":3}
+$GPGSA,A,3,08,04,02,27,,,,,,,,,0.0,3.2,0.0*38
+{"class":"TPV","tag":"MID2","time":1118327704.280,"ept":0.005,"lat":46.498346855,"lon":7.567381517,"alt":1341.619,"track":10.3787,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,45,29,13,273,00*75
$GPGSV,2,2,08,10,51,304,00,04,15,199,35,02,34,241,40,27,71,076,43*77
{"class":"SKY","tag":"MID4","time":1118327705.280,"xdop":0.73,"ydop":1.22,"vdop":1.56,"tdop":0.79,"hdop":3.20,"gdop":2.25,"pdop":2.11,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":0,"used":false},{"PRN":4,"el":15,"az":199,"ss":35,"used":true},{"PRN":2,"el":34,"az":241,"ss":40,"used":true},{"PRN":27,"el":71,"az":76,"ss":43,"used":true}]}
$GPGGA,143505,4629.9008,N,00734.0430,E,1,04,3.20,1340.21,M,48.183,M,,*7D
$GPRMC,143505,A,4629.9008,N,00734.0430,E,0.1776,10.379,090605,,*15
-$GPGSA,A,3,08,04,02,27,,,,,,,,,2.1,3.2,1.6*3C
-$GPGBS,143505,11.01,M,18.29,M,35.88,M*0D
-{"class":"TPV","tag":"MID2","time":1118327705.280,"ept":0.005,"lat":46.498347131,"lon":7.567383232,"alt":1340.211,"epx":11.014,"epy":18.289,"epv":35.884,"track":10.3787,"speed":0.091,"climb":-0.085,"eps":36.58,"mode":3}
+$GPGSA,A,3,08,04,02,27,,,,,,,,,0.0,3.2,0.0*38
+{"class":"TPV","tag":"MID2","time":1118327705.280,"ept":0.005,"lat":46.498347131,"lon":7.567383232,"alt":1340.211,"track":10.3787,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,45,29,13,273,00*75
$GPGSV,2,2,08,10,51,304,00,04,15,199,35,02,34,241,40,27,71,076,42*76
{"class":"SKY","tag":"MID4","time":1118327706.280,"xdop":0.73,"ydop":1.22,"vdop":1.56,"tdop":0.79,"hdop":3.20,"gdop":2.25,"pdop":2.11,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":0,"used":false},{"PRN":4,"el":15,"az":199,"ss":35,"used":true},{"PRN":2,"el":34,"az":241,"ss":40,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143506,4629.9008,N,00734.0430,E,1,04,3.20,1340.21,M,48.183,M,,*7E
$GPRMC,143506,A,4629.9008,N,00734.0430,E,0.1776,10.379,090605,,*16
-$GPGSA,A,3,08,04,02,27,,,,,,,,,2.1,3.2,1.6*3C
-$GPGBS,143506,11.01,M,18.29,M,35.88,M*0E
-{"class":"TPV","tag":"MID2","time":1118327706.280,"ept":0.005,"lat":46.498347131,"lon":7.567383232,"alt":1340.211,"epx":11.014,"epy":18.289,"epv":35.884,"track":10.3787,"speed":0.091,"climb":-0.085,"eps":36.58,"mode":3}
+$GPGSA,A,3,08,04,02,27,,,,,,,,,0.0,3.2,0.0*38
+{"class":"TPV","tag":"MID2","time":1118327706.280,"ept":0.005,"lat":46.498347131,"lon":7.567383232,"alt":1340.211,"track":10.3787,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,45,29,13,273,00*75
$GPGSV,2,2,08,10,51,304,00,04,15,199,36,02,34,241,40,27,71,076,42*75
{"class":"SKY","tag":"MID4","time":1118327707.280,"xdop":0.73,"ydop":1.22,"vdop":1.56,"tdop":0.79,"hdop":3.20,"gdop":2.25,"pdop":2.11,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":0,"used":false},{"PRN":4,"el":15,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":40,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143507,4629.9008,N,00734.0430,E,1,04,3.20,1340.21,M,48.183,M,,*7F
$GPRMC,143507,A,4629.9008,N,00734.0430,E,0.1776,10.379,090605,,*17
-$GPGSA,A,3,08,04,02,27,,,,,,,,,2.1,3.2,1.6*3C
-$GPGBS,143507,11.01,M,18.29,M,35.88,M*0F
-{"class":"TPV","tag":"MID2","time":1118327707.280,"ept":0.005,"lat":46.498347131,"lon":7.567383232,"alt":1340.211,"epx":11.014,"epy":18.289,"epv":35.884,"track":10.3787,"speed":0.091,"climb":-0.085,"eps":36.58,"mode":3}
+$GPGSA,A,3,08,04,02,27,,,,,,,,,0.0,3.2,0.0*38
+{"class":"TPV","tag":"MID2","time":1118327707.280,"ept":0.005,"lat":46.498347131,"lon":7.567383232,"alt":1340.211,"track":10.3787,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,45,29,13,273,00*75
$GPGSV,2,2,08,10,51,304,23,04,15,199,38,02,34,241,40,27,71,076,41*79
{"class":"SKY","tag":"MID4","time":1118327708.280,"xdop":0.73,"ydop":1.22,"vdop":1.56,"tdop":0.79,"hdop":3.20,"gdop":2.25,"pdop":2.11,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":23,"used":false},{"PRN":4,"el":15,"az":199,"ss":38,"used":true},{"PRN":2,"el":34,"az":241,"ss":40,"used":true},{"PRN":27,"el":71,"az":76,"ss":41,"used":true}]}
$GPGGA,143508,4629.9004,N,00734.0429,E,1,05,2.40,1340.89,M,48.183,M,,*70
$GPRMC,143508,A,4629.9004,N,00734.0429,E,0.1776,10.379,090605,,*1C
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143508,10.97,M,15.58,M,32.32,M*03
-{"class":"TPV","tag":"MID2","time":1118327708.280,"ept":0.005,"lat":46.498340664,"lon":7.567381517,"alt":1340.894,"epx":10.972,"epy":15.581,"epv":32.321,"track":10.3787,"speed":0.091,"climb":-0.085,"eps":33.87,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327708.280,"ept":0.005,"lat":46.498340664,"lon":7.567381517,"alt":1340.894,"track":10.3787,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,44,29,13,273,00*74
$GPGSV,2,2,08,10,51,304,34,04,15,199,38,02,34,241,41,27,71,076,42*7D
{"class":"SKY","tag":"MID4","time":1118327709.280,"xdop":0.73,"ydop":1.04,"vdop":1.41,"tdop":0.78,"hdop":2.40,"gdop":2.05,"pdop":1.89,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":44,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":34,"used":true},{"PRN":4,"el":15,"az":199,"ss":38,"used":true},{"PRN":2,"el":34,"az":241,"ss":41,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143509,4629.9004,N,00734.0429,E,1,05,2.40,1340.89,M,48.183,M,,*71
$GPRMC,143509,A,4629.9004,N,00734.0429,E,0.0000,0.000,090605,,*26
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143509,10.97,M,15.58,M,32.32,M*02
-{"class":"TPV","tag":"MID2","time":1118327709.280,"ept":0.005,"lat":46.498340664,"lon":7.567381517,"alt":1340.894,"epx":10.972,"epy":15.581,"epv":32.321,"track":0.0000,"speed":0.000,"climb":0.000,"eps":31.16,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327709.280,"ept":0.005,"lat":46.498340664,"lon":7.567381517,"alt":1340.894,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,45,29,13,273,00*75
$GPGSV,2,2,08,10,51,304,32,04,15,199,37,02,34,241,42,27,71,076,44*71
{"class":"SKY","tag":"MID4","time":1118327710.280,"xdop":0.73,"ydop":1.04,"vdop":1.41,"tdop":0.78,"hdop":2.40,"gdop":2.05,"pdop":1.89,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":32,"used":true},{"PRN":4,"el":15,"az":199,"ss":37,"used":true},{"PRN":2,"el":34,"az":241,"ss":42,"used":true},{"PRN":27,"el":71,"az":76,"ss":44,"used":true}]}
$GPGGA,143510,4629.9001,N,00734.0428,E,1,05,2.40,1341.58,M,48.183,M,,*70
$GPRMC,143510,A,4629.9001,N,00734.0428,E,0.0000,0.000,090605,,*2A
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143510,10.97,M,15.58,M,32.32,M*0A
-{"class":"TPV","tag":"MID2","time":1118327710.280,"ept":0.005,"lat":46.498334197,"lon":7.567379802,"alt":1341.576,"epx":10.972,"epy":15.581,"epv":32.321,"track":0.0000,"speed":0.000,"climb":0.000,"eps":31.16,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327710.280,"ept":0.005,"lat":46.498334197,"lon":7.567379802,"alt":1341.576,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,39,29,13,273,00*7E
$GPGSV,2,2,08,10,51,304,25,04,15,199,29,02,34,241,20,27,71,076,38*77
{"class":"SKY","tag":"MID4","time":1118327711.280,"xdop":0.73,"ydop":1.04,"vdop":1.41,"tdop":0.78,"hdop":2.40,"gdop":2.05,"pdop":1.89,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":39,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":25,"used":true},{"PRN":4,"el":15,"az":199,"ss":29,"used":true},{"PRN":2,"el":34,"az":241,"ss":20,"used":true},{"PRN":27,"el":71,"az":76,"ss":38,"used":true}]}
$GPGGA,143511,4629.9000,N,00734.0436,E,1,04,3.20,1341.67,M,48.183,M,,*75
$GPRMC,143511,A,4629.9000,N,00734.0436,E,0.3121,60.960,090605,,*1D
-$GPGSA,A,3,08,04,02,27,,,,,,,,,2.1,3.2,1.6*3C
-$GPGBS,143511,11.01,M,18.29,M,35.88,M*08
-{"class":"TPV","tag":"MID2","time":1118327711.280,"ept":0.005,"lat":46.498333338,"lon":7.567392712,"alt":1341.667,"epx":11.014,"epy":18.289,"epv":35.884,"track":60.9597,"speed":0.161,"climb":-0.074,"eps":33.87,"mode":3}
+$GPGSA,A,3,08,04,02,27,,,,,,,,,0.0,3.2,0.0*38
+{"class":"TPV","tag":"MID2","time":1118327711.280,"ept":0.005,"lat":46.498333338,"lon":7.567392712,"alt":1341.667,"track":60.9597,"speed":0.161,"climb":-0.074,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,40,29,13,273,00*70
$GPGSV,2,2,08,10,51,304,35,04,15,199,13,02,34,241,27,27,71,076,41*76
{"class":"SKY","tag":"MID4","time":1118327712.280,"xdop":0.73,"ydop":1.22,"vdop":1.56,"tdop":0.79,"hdop":3.20,"gdop":2.25,"pdop":2.11,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":40,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":35,"used":false},{"PRN":4,"el":15,"az":199,"ss":13,"used":true},{"PRN":2,"el":34,"az":241,"ss":27,"used":true},{"PRN":27,"el":71,"az":76,"ss":41,"used":true}]}
$GPGGA,143512,4629.8996,N,00734.0435,E,1,04,3.80,1342.35,M,48.183,M,,*7C
$GPRMC,143512,A,4629.8996,N,00734.0435,E,1.5556,157.529,090605,,*2D
-$GPGSA,A,3,08,10,02,27,,,,,,,,,2.1,3.8,1.6*33
-$GPGBS,143512,11.01,M,18.29,M,35.88,M*0B
-{"class":"TPV","tag":"MID2","time":1118327712.280,"ept":0.005,"lat":46.498326871,"lon":7.567390997,"alt":1342.349,"epx":11.014,"epy":18.289,"epv":35.884,"track":157.5287,"speed":0.800,"climb":0.013,"eps":36.58,"mode":3}
+$GPGSA,A,3,08,10,02,27,,,,,,,,,0.0,3.8,0.0*37
+{"class":"TPV","tag":"MID2","time":1118327712.280,"ept":0.005,"lat":46.498326871,"lon":7.567390997,"alt":1342.349,"track":157.5287,"speed":0.800,"climb":0.013,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,40,29,13,273,00*70
$GPGSV,2,2,08,10,51,304,36,04,15,199,27,02,34,241,36,27,71,076,43*70
{"class":"SKY","tag":"MID4","time":1118327713.280,"xdop":0.73,"ydop":1.22,"vdop":1.56,"tdop":0.79,"hdop":3.80,"gdop":2.25,"pdop":2.11,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":40,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":36,"used":true},{"PRN":4,"el":15,"az":199,"ss":27,"used":false},{"PRN":2,"el":34,"az":241,"ss":36,"used":true},{"PRN":27,"el":71,"az":76,"ss":43,"used":true}]}
$GPGGA,143513,4629.8992,N,00734.0434,E,1,04,3.80,1343.03,M,48.183,M,,*7C
$GPRMC,143513,A,4629.8992,N,00734.0434,E,0.7149,141.014,090605,,*2C
-$GPGSA,A,3,08,10,02,27,,,,,,,,,2.1,3.8,1.6*33
-$GPGBS,143513,11.01,M,18.29,M,35.88,M*0A
-{"class":"TPV","tag":"MID2","time":1118327713.280,"ept":0.005,"lat":46.498320404,"lon":7.567389282,"alt":1343.032,"epx":11.014,"epy":18.289,"epv":35.884,"track":141.0144,"speed":0.368,"climb":-0.073,"eps":36.58,"mode":3}
+$GPGSA,A,3,08,10,02,27,,,,,,,,,0.0,3.8,0.0*37
+{"class":"TPV","tag":"MID2","time":1118327713.280,"ept":0.005,"lat":46.498320404,"lon":7.567389282,"alt":1343.032,"track":141.0144,"speed":0.368,"climb":-0.073,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,29,29,13,273,00*7F
$GPGSV,2,2,08,10,51,304,31,04,15,199,27,02,34,241,34,27,71,076,42*74
{"class":"SKY","tag":"MID4","time":1118327714.280,"xdop":0.73,"ydop":1.22,"vdop":1.56,"tdop":0.79,"hdop":3.80,"gdop":2.25,"pdop":2.11,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":29,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":31,"used":true},{"PRN":4,"el":15,"az":199,"ss":27,"used":false},{"PRN":2,"el":34,"az":241,"ss":34,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143514,4629.8984,N,00734.0440,E,1,04,3.80,1343.08,M,48.183,M,,*74
$GPRMC,143514,A,4629.8984,N,00734.0440,E,0.5719,158.581,090605,,*2F
-$GPGSA,A,3,08,10,02,27,,,,,,,,,2.1,3.8,1.6*33
-$GPGBS,143514,11.01,M,18.29,M,35.88,M*0D
-{"class":"TPV","tag":"MID2","time":1118327714.280,"ept":0.005,"lat":46.498306887,"lon":7.567400477,"alt":1343.079,"epx":11.014,"epy":18.289,"epv":35.884,"track":158.5811,"speed":0.294,"climb":-0.085,"eps":36.58,"mode":3}
+$GPGSA,A,3,08,10,02,27,,,,,,,,,0.0,3.8,0.0*37
+{"class":"TPV","tag":"MID2","time":1118327714.280,"ept":0.005,"lat":46.498306887,"lon":7.567400477,"alt":1343.079,"track":158.5811,"speed":0.294,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,36,29,13,273,00*71
$GPGSV,2,2,08,10,51,304,19,04,15,199,00,02,34,241,38,27,71,076,38*7A
{"class":"SKY","tag":"MID4","time":1118327715.280,"xdop":0.73,"ydop":1.22,"vdop":1.56,"tdop":0.79,"hdop":3.80,"gdop":2.25,"pdop":2.11,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":36,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":19,"used":true},{"PRN":4,"el":15,"az":199,"ss":0,"used":false},{"PRN":2,"el":34,"az":241,"ss":38,"used":true},{"PRN":27,"el":71,"az":76,"ss":38,"used":true}]}
@@ -230,17 +203,15 @@ $GPGSV,2,2,08,10,51,304,20,04,15,199,00,02,34,241,29,27,71,075,37*7C
{"class":"SKY","tag":"MID4","time":1118327716.280,"hdop":12.80,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":34,"used":true},{"PRN":29,"el":14,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":20,"used":false},{"PRN":4,"el":15,"az":199,"ss":0,"used":false},{"PRN":2,"el":34,"az":241,"ss":29,"used":true},{"PRN":27,"el":71,"az":75,"ss":37,"used":true}]}
$GPGGA,143516,4629.8980,N,00734.0439,E,1,04,3.80,1343.76,M,48.183,M,,*75
$GPRMC,143516,A,4629.8980,N,00734.0439,E,0.3435,5.346,090605,,*28
-$GPGSA,A,3,08,10,02,27,,,,,,,,,2.1,3.8,1.6*33
-$GPGBS,143516,11.10,M,18.27,M,36.20,M*00
-{"class":"TPV","tag":"MID2","time":1118327716.280,"ept":0.005,"lat":46.498300420,"lon":7.567398762,"alt":1343.762,"epx":11.098,"epy":18.270,"epv":36.204,"track":5.3456,"speed":0.177,"climb":0.005,"mode":3}
+$GPGSA,A,3,08,10,02,27,,,,,,,,,0.0,3.8,0.0*37
+{"class":"TPV","tag":"MID2","time":1118327716.280,"ept":0.005,"lat":46.498300420,"lon":7.567398762,"alt":1343.762,"track":5.3456,"speed":0.177,"climb":0.005,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,37,29,14,273,00*77
$GPGSV,2,2,08,10,51,304,30,04,15,199,31,02,34,241,26,27,71,075,33*74
{"class":"SKY","tag":"MID4","time":1118327717.280,"xdop":0.74,"ydop":1.22,"vdop":1.57,"tdop":0.80,"hdop":3.80,"gdop":2.27,"pdop":2.12,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":37,"used":true},{"PRN":29,"el":14,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":30,"used":true},{"PRN":4,"el":15,"az":199,"ss":31,"used":false},{"PRN":2,"el":34,"az":241,"ss":26,"used":true},{"PRN":27,"el":71,"az":75,"ss":33,"used":true}]}
$GPGGA,143517,4629.8976,N,00734.0438,E,1,04,2.80,1344.44,M,48.183,M,,*7B
$GPRMC,143517,A,4629.8976,N,00734.0438,E,0.0000,0.000,090605,,*24
-$GPGSA,A,3,08,10,04,27,,,,,,,,,2.1,2.8,1.6*34
-$GPGBS,143517,11.10,M,18.27,M,36.20,M*01
-{"class":"TPV","tag":"MID2","time":1118327717.280,"ept":0.005,"lat":46.498293953,"lon":7.567397047,"alt":1344.444,"epx":11.098,"epy":18.270,"epv":36.204,"track":0.0000,"speed":0.000,"climb":0.000,"eps":36.54,"mode":3}
+$GPGSA,A,3,08,10,04,27,,,,,,,,,0.0,2.8,0.0*30
+{"class":"TPV","tag":"MID2","time":1118327717.280,"ept":0.005,"lat":46.498293953,"lon":7.567397047,"alt":1344.444,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,66,189,41,29,14,273,00*76
$GPGSV,2,2,08,10,51,304,35,04,15,199,23,02,34,241,37,27,71,075,41*77
{"class":"SKY","tag":"MID4","time":1118327718.280,"xdop":0.74,"ydop":1.22,"vdop":1.57,"tdop":0.80,"hdop":2.80,"gdop":2.27,"pdop":2.12,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":41,"used":true},{"PRN":29,"el":14,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":35,"used":true},{"PRN":4,"el":15,"az":199,"ss":23,"used":true},{"PRN":2,"el":34,"az":241,"ss":37,"used":false},{"PRN":27,"el":71,"az":75,"ss":41,"used":true}]}
diff --git a/test/daemon/bu303-stillfix.log.chk b/test/daemon/bu303-stillfix.log.chk
index 72f89805..cc6c4050 100644
--- a/test/daemon/bu303-stillfix.log.chk
+++ b/test/daemon/bu303-stillfix.log.chk
@@ -3,86 +3,75 @@ $GPGSV,2,2,08,10,50,304,37,04,16,199,36,02,34,241,43,27,71,076,43*71
{"class":"SKY","tag":"MID4","time":1118327655.280,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":23,"el":7,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":65,"az":189,"ss":45,"used":false},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":50,"az":304,"ss":37,"used":false},{"PRN":4,"el":16,"az":199,"ss":36,"used":false},{"PRN":2,"el":34,"az":241,"ss":43,"used":false},{"PRN":27,"el":71,"az":76,"ss":43,"used":false}]}
$GPGGA,143415,4629.8901,N,00734.0471,E,1,05,2.40,1349.51,M,48.183,M,,*71
$GPRMC,143415,A,4629.8901,N,00734.0471,E,0.1776,10.379,090605,,*11
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143415,10.93,M,15.48,M,32.90,M*03
-{"class":"TPV","tag":"MID2","time":1118327655.280,"ept":0.005,"lat":46.498167579,"lon":7.567452213,"alt":1349.507,"epx":10.931,"epy":15.480,"epv":32.905,"track":10.3789,"speed":0.091,"climb":-0.085,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327655.280,"ept":0.005,"lat":46.498167579,"lon":7.567452213,"alt":1349.507,"track":10.3789,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,65,189,43,29,13,273,00*70
$GPGSV,2,2,08,10,50,304,36,04,16,199,36,02,34,241,44,27,71,076,43*77
-{"class":"SKY","tag":"MID4","time":1118327656.280,"xdop":0.73,"ydop":1.03,"vdop":1.43,"tdop":0.79,"hdop":2.40,"gdop":2.06,"pdop":1.91,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":65,"az":189,"ss":43,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":50,"az":304,"ss":36,"used":true},{"PRN":4,"el":16,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":44,"used":true},{"PRN":27,"el":71,"az":76,"ss":43,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118327656.280,"xdop":0.73,"ydop":1.03,"vdop":1.42,"tdop":0.78,"hdop":2.40,"gdop":2.06,"pdop":1.90,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":65,"az":189,"ss":43,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":50,"az":304,"ss":36,"used":true},{"PRN":4,"el":16,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":44,"used":true},{"PRN":27,"el":71,"az":76,"ss":43,"used":true}]}
$GPGGA,143416,4629.8905,N,00734.0473,E,1,05,2.40,1347.42,M,48.183,M,,*78
$GPRMC,143416,A,4629.8905,N,00734.0473,E,0.1776,10.379,090605,,*14
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143416,10.98,M,15.45,M,32.72,M*0A
-{"class":"TPV","tag":"MID2","time":1118327656.280,"ept":0.005,"lat":46.498174322,"lon":7.567455643,"alt":1347.417,"epx":10.980,"epy":15.454,"epv":32.724,"track":10.3789,"speed":0.091,"climb":-0.085,"eps":30.93,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327656.280,"ept":0.005,"lat":46.498174322,"lon":7.567455643,"alt":1347.417,"track":10.3789,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,65,189,44,29,13,273,00*77
$GPGSV,2,2,08,10,50,304,38,04,16,199,35,02,34,241,44,27,71,076,42*7B
{"class":"SKY","tag":"MID4","time":1118327657.280,"xdop":0.73,"ydop":1.03,"vdop":1.42,"tdop":0.78,"hdop":2.40,"gdop":2.06,"pdop":1.90,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":65,"az":189,"ss":44,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":50,"az":304,"ss":38,"used":true},{"PRN":4,"el":16,"az":199,"ss":35,"used":true},{"PRN":2,"el":34,"az":241,"ss":44,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143417,4629.8908,N,00734.0474,E,1,05,2.40,1346.73,M,48.183,M,,*70
$GPRMC,143417,A,4629.8908,N,00734.0474,E,0.0000,0.000,090605,,*24
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143417,10.98,M,15.45,M,32.72,M*0B
-{"class":"TPV","tag":"MID2","time":1118327657.280,"ept":0.005,"lat":46.498180789,"lon":7.567457358,"alt":1346.734,"epx":10.980,"epy":15.454,"epv":32.724,"track":0.0000,"speed":0.000,"climb":0.000,"eps":30.91,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327657.280,"ept":0.005,"lat":46.498180789,"lon":7.567457358,"alt":1346.734,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,65,189,45,29,13,273,00*76
$GPGSV,2,2,08,10,50,304,38,04,16,199,35,02,34,241,43,27,71,076,43*7D
{"class":"SKY","tag":"MID4","time":1118327658.280,"xdop":0.73,"ydop":1.03,"vdop":1.42,"tdop":0.78,"hdop":2.40,"gdop":2.06,"pdop":1.90,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":65,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":50,"az":304,"ss":38,"used":true},{"PRN":4,"el":16,"az":199,"ss":35,"used":true},{"PRN":2,"el":34,"az":241,"ss":43,"used":true},{"PRN":27,"el":71,"az":76,"ss":43,"used":true}]}
$GPGGA,143418,4629.8912,N,00734.0475,E,1,05,2.40,1346.05,M,48.183,M,,*74
$GPRMC,143418,A,4629.8912,N,00734.0475,E,0.1776,10.379,090605,,*1A
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143418,10.98,M,15.45,M,32.72,M*04
-{"class":"TPV","tag":"MID2","time":1118327658.280,"ept":0.005,"lat":46.498187256,"lon":7.567459073,"alt":1346.052,"epx":10.980,"epy":15.454,"epv":32.724,"track":10.3789,"speed":0.091,"climb":-0.085,"eps":30.91,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327658.280,"ept":0.005,"lat":46.498187256,"lon":7.567459073,"alt":1346.052,"track":10.3789,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,65,189,44,29,13,273,00*77
$GPGSV,2,2,08,10,50,304,36,04,16,199,32,02,34,241,39,27,71,076,41*7B
{"class":"SKY","tag":"MID4","time":1118327659.280,"xdop":0.73,"ydop":1.03,"vdop":1.42,"tdop":0.78,"hdop":2.40,"gdop":2.06,"pdop":1.90,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":65,"az":189,"ss":44,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":50,"az":304,"ss":36,"used":true},{"PRN":4,"el":16,"az":199,"ss":32,"used":true},{"PRN":2,"el":34,"az":241,"ss":39,"used":true},{"PRN":27,"el":71,"az":76,"ss":41,"used":true}]}
$GPGGA,143419,4629.8909,N,00734.0475,E,1,05,2.40,1345.33,M,48.183,M,,*79
$GPRMC,143419,A,4629.8909,N,00734.0475,E,0.1776,10.379,090605,,*11
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143419,10.98,M,15.45,M,32.72,M*05
-{"class":"TPV","tag":"MID2","time":1118327659.280,"ept":0.005,"lat":46.498181065,"lon":7.567459073,"alt":1345.327,"epx":10.980,"epy":15.454,"epv":32.724,"track":10.3789,"speed":0.091,"climb":-0.085,"eps":30.91,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327659.280,"ept":0.005,"lat":46.498181065,"lon":7.567459073,"alt":1345.327,"track":10.3789,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,65,189,46,29,13,273,00*75
$GPGSV,2,2,08,10,50,304,38,04,16,199,34,02,34,241,41,27,71,076,41*7C
{"class":"SKY","tag":"MID4","time":1118327660.280,"xdop":0.73,"ydop":1.03,"vdop":1.42,"tdop":0.78,"hdop":2.40,"gdop":2.06,"pdop":1.90,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":65,"az":189,"ss":46,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":50,"az":304,"ss":38,"used":true},{"PRN":4,"el":16,"az":199,"ss":34,"used":true},{"PRN":2,"el":34,"az":241,"ss":41,"used":true},{"PRN":27,"el":71,"az":76,"ss":41,"used":true}]}
$GPGGA,143420,4629.8913,N,00734.0476,E,1,05,2.40,1344.64,M,48.183,M,,*78
$GPRMC,143420,A,4629.8913,N,00734.0476,E,0.1673,180.000,090605,,*22
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143420,10.98,M,15.45,M,32.72,M*0F
-{"class":"TPV","tag":"MID2","time":1118327660.280,"ept":0.005,"lat":46.498187532,"lon":7.567460788,"alt":1344.644,"epx":10.980,"epy":15.454,"epv":32.724,"track":180.0000,"speed":0.086,"climb":-0.091,"eps":30.91,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327660.280,"ept":0.005,"lat":46.498187532,"lon":7.567460788,"alt":1344.644,"track":180.0000,"speed":0.086,"climb":-0.091,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,65,189,46,29,13,273,00*75
$GPGSV,2,2,08,10,50,304,37,04,16,199,36,02,34,241,43,27,71,076,41*73
{"class":"SKY","tag":"MID4","time":1118327661.280,"xdop":0.73,"ydop":1.03,"vdop":1.42,"tdop":0.78,"hdop":2.40,"gdop":2.06,"pdop":1.90,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":65,"az":189,"ss":46,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":50,"az":304,"ss":37,"used":true},{"PRN":4,"el":16,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":43,"used":true},{"PRN":27,"el":71,"az":76,"ss":41,"used":true}]}
$GPGGA,143421,4629.8916,N,00734.0478,E,1,05,2.40,1343.96,M,48.183,M,,*78
$GPRMC,143421,A,4629.8916,N,00734.0478,E,0.1776,10.379,090605,,*19
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143421,10.98,M,15.45,M,32.72,M*0E
-{"class":"TPV","tag":"MID2","time":1118327661.280,"ept":0.005,"lat":46.498193999,"lon":7.567462504,"alt":1343.962,"epx":10.980,"epy":15.454,"epv":32.724,"track":10.3789,"speed":0.091,"climb":-0.085,"eps":30.91,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327661.280,"ept":0.005,"lat":46.498193999,"lon":7.567462504,"alt":1343.962,"track":10.3789,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,65,189,45,29,13,273,00*76
$GPGSV,2,2,08,10,50,304,38,04,16,199,36,02,34,241,42,27,71,076,42*7E
{"class":"SKY","tag":"MID4","time":1118327662.280,"xdop":0.73,"ydop":1.03,"vdop":1.42,"tdop":0.78,"hdop":2.40,"gdop":2.06,"pdop":1.90,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":65,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":50,"az":304,"ss":38,"used":true},{"PRN":4,"el":16,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":42,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143422,4629.8916,N,00734.0478,E,1,05,2.40,1343.96,M,48.183,M,,*7B
$GPRMC,143422,A,4629.8916,N,00734.0478,E,0.0000,0.000,090605,,*21
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143422,10.98,M,15.45,M,32.72,M*0D
-{"class":"TPV","tag":"MID2","time":1118327662.280,"ept":0.005,"lat":46.498193999,"lon":7.567462504,"alt":1343.962,"epx":10.980,"epy":15.454,"epv":32.724,"track":0.0000,"speed":0.000,"climb":0.000,"eps":30.91,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327662.280,"ept":0.005,"lat":46.498193999,"lon":7.567462504,"alt":1343.962,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,65,189,45,29,13,273,00*76
$GPGSV,2,2,08,10,50,304,37,04,16,199,36,02,34,241,42,27,71,076,43*70
{"class":"SKY","tag":"MID4","time":1118327663.280,"xdop":0.73,"ydop":1.03,"vdop":1.42,"tdop":0.78,"hdop":2.40,"gdop":2.06,"pdop":1.90,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":65,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":50,"az":304,"ss":37,"used":true},{"PRN":4,"el":16,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":42,"used":true},{"PRN":27,"el":71,"az":76,"ss":43,"used":true}]}
$GPGGA,143423,4629.8917,N,00734.0470,E,1,05,2.40,1343.87,M,48.183,M,,*73
$GPRMC,143423,A,4629.8917,N,00734.0470,E,0.0000,0.000,090605,,*29
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143423,10.98,M,15.45,M,32.72,M*0C
-{"class":"TPV","tag":"MID2","time":1118327663.280,"ept":0.005,"lat":46.498194858,"lon":7.567449593,"alt":1343.871,"epx":10.980,"epy":15.454,"epv":32.724,"track":0.0000,"speed":0.000,"climb":0.000,"eps":30.91,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327663.280,"ept":0.005,"lat":46.498194858,"lon":7.567449593,"alt":1343.871,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,65,189,46,29,13,273,00*75
$GPGSV,2,2,08,10,50,304,36,04,16,199,36,02,34,241,42,27,71,076,42*70
{"class":"SKY","tag":"MID4","time":1118327664.280,"xdop":0.73,"ydop":1.03,"vdop":1.42,"tdop":0.78,"hdop":2.40,"gdop":2.06,"pdop":1.90,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":65,"az":189,"ss":46,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":50,"az":304,"ss":36,"used":true},{"PRN":4,"el":16,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":42,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143424,4629.8921,N,00734.0471,E,1,05,2.40,1343.19,M,48.183,M,,*77
$GPRMC,143424,A,4629.8921,N,00734.0471,E,0.1776,10.379,090605,,*11
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143424,10.98,M,15.45,M,32.72,M*0B
-{"class":"TPV","tag":"MID2","time":1118327664.280,"ept":0.005,"lat":46.498201325,"lon":7.567451308,"alt":1343.189,"epx":10.980,"epy":15.454,"epv":32.724,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":30.91,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327664.280,"ept":0.005,"lat":46.498201325,"lon":7.567451308,"alt":1343.189,"track":10.3788,"speed":0.091,"climb":-0.085,"mode":3}
$GPGSV,2,1,08,23,06,084,00,28,07,160,00,08,65,189,46,29,13,273,00*75
$GPGSV,2,2,08,10,50,304,36,04,16,199,37,02,34,241,42,27,71,076,42*71
{"class":"SKY","tag":"MID4","time":1118327665.280,"xdop":0.73,"ydop":1.03,"vdop":1.42,"tdop":0.78,"hdop":2.40,"gdop":2.06,"pdop":1.90,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":65,"az":189,"ss":46,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":50,"az":304,"ss":36,"used":true},{"PRN":4,"el":16,"az":199,"ss":37,"used":true},{"PRN":2,"el":34,"az":241,"ss":42,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}
$GPGGA,143425,4629.8921,N,00734.0471,E,1,05,2.40,1343.19,M,48.183,M,,*76
$GPRMC,143425,A,4629.8921,N,00734.0471,E,0.1776,10.379,090605,,*10
-$GPGSA,A,3,08,10,04,02,27,,,,,,,,1.9,2.4,1.4*33
-$GPGBS,143425,10.98,M,15.45,M,32.72,M*0A
-{"class":"TPV","tag":"MID2","time":1118327665.280,"ept":0.005,"lat":46.498201325,"lon":7.567451308,"alt":1343.189,"epx":10.980,"epy":15.454,"epv":32.724,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":30.91,"mode":3}
+$GPGSA,A,3,08,10,04,02,27,,,,,,,,0.0,2.4,0.0*3E
+{"class":"TPV","tag":"MID2","time":1118327665.280,"ept":0.005,"lat":46.498201325,"lon":7.567451308,"alt":1343.189,"track":10.3788,"speed":0.091,"climb":-0.085,"mode":3}
diff --git a/test/daemon/ch-4711.log.chk b/test/daemon/ch-4711.log.chk
index 340399fa..c9717408 100644
--- a/test/daemon/ch-4711.log.chk
+++ b/test/daemon/ch-4711.log.chk
@@ -19,10 +19,10 @@ $GPGSV,4,1,14,03,50,217,,06,49,201,,09,10,068,,14,30,153,*74
$GPGSV,4,2,14,18,43,068,,19,58,270,35,21,16,107,,22,76,110,*7F
$GPGSV,4,3,14,26,42,127,,27,13,055,27,28,08,344,,33,11,238,*77
$GPGSV,4,4,14,37,25,199,,39,25,194,*7F
-{"class":"SKY","tag":"GSV","vdop":0.90,"hdop":1.80,"pdop":2.10,"satellites":[{"PRN":3,"el":50,"az":217,"ss":0,"used":false},{"PRN":6,"el":49,"az":201,"ss":0,"used":false},{"PRN":9,"el":10,"az":68,"ss":0,"used":false},{"PRN":14,"el":30,"az":153,"ss":0,"used":false},{"PRN":18,"el":43,"az":68,"ss":0,"used":false},{"PRN":19,"el":58,"az":270,"ss":35,"used":false},{"PRN":21,"el":16,"az":107,"ss":0,"used":false},{"PRN":22,"el":76,"az":110,"ss":0,"used":false},{"PRN":26,"el":42,"az":127,"ss":0,"used":false},{"PRN":27,"el":13,"az":55,"ss":27,"used":false},{"PRN":28,"el":8,"az":344,"ss":0,"used":false},{"PRN":33,"el":11,"az":238,"ss":0,"used":false},{"PRN":37,"el":25,"az":199,"ss":0,"used":false},{"PRN":39,"el":25,"az":194,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":14.63,"ydop":4.47,"vdop":0.90,"tdop":21.29,"hdop":1.80,"gdop":45.46,"pdop":2.10,"satellites":[{"PRN":3,"el":50,"az":217,"ss":0,"used":false},{"PRN":6,"el":49,"az":201,"ss":0,"used":false},{"PRN":9,"el":10,"az":68,"ss":0,"used":false},{"PRN":14,"el":30,"az":153,"ss":0,"used":false},{"PRN":18,"el":43,"az":68,"ss":0,"used":false},{"PRN":19,"el":58,"az":270,"ss":35,"used":false},{"PRN":21,"el":16,"az":107,"ss":0,"used":false},{"PRN":22,"el":76,"az":110,"ss":0,"used":false},{"PRN":26,"el":42,"az":127,"ss":0,"used":false},{"PRN":27,"el":13,"az":55,"ss":27,"used":false},{"PRN":28,"el":8,"az":344,"ss":0,"used":false},{"PRN":33,"el":11,"az":238,"ss":0,"used":false},{"PRN":37,"el":25,"az":199,"ss":0,"used":false},{"PRN":39,"el":25,"az":194,"ss":0,"used":false}]}
$GLGSV,2,1,06,66,18,048,,67,72,050,31,75,16,358,38,82,47,171,*68
$GLGSV,2,2,06,83,66,292,37,84,16,325,34*6D
-{"class":"SKY","tag":"GSV","vdop":0.90,"hdop":1.80,"pdop":2.10,"satellites":[{"PRN":66,"el":18,"az":48,"ss":0,"used":false},{"PRN":67,"el":72,"az":50,"ss":31,"used":true},{"PRN":75,"el":16,"az":358,"ss":38,"used":true},{"PRN":82,"el":47,"az":171,"ss":0,"used":false},{"PRN":83,"el":66,"az":292,"ss":37,"used":true},{"PRN":84,"el":16,"az":325,"ss":34,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":14.63,"ydop":4.47,"vdop":0.90,"tdop":21.29,"hdop":1.80,"gdop":45.46,"pdop":2.10,"satellites":[{"PRN":66,"el":18,"az":48,"ss":0,"used":false},{"PRN":67,"el":72,"az":50,"ss":31,"used":true},{"PRN":75,"el":16,"az":358,"ss":38,"used":true},{"PRN":82,"el":47,"az":171,"ss":0,"used":false},{"PRN":83,"el":66,"az":292,"ss":37,"used":true},{"PRN":84,"el":16,"az":325,"ss":34,"used":true}]}
$GNGSA,A,2,19,27,,,,,,,,,,,02.1,01.8,00.9*13
$GNGSA,A,2,67,84,83,75,,,,,,,,,02.1,01.8,00.9*1A
$GNGBS,135629.997,17.2,16.9,1.0,,,,*69
@@ -64,10 +64,10 @@ $GPGSV,4,1,14,03,50,217,,06,49,201,,09,10,068,,14,30,153,*74
$GPGSV,4,2,14,18,43,068,,19,58,270,34,21,16,107,,22,76,110,*7E
$GPGSV,4,3,14,26,42,127,,27,13,055,27,28,08,344,,33,11,238,*77
$GPGSV,4,4,14,37,25,199,,39,25,194,*7F
-{"class":"SKY","tag":"GSV","vdop":0.90,"hdop":1.80,"pdop":2.10,"satellites":[{"PRN":3,"el":50,"az":217,"ss":0,"used":false},{"PRN":6,"el":49,"az":201,"ss":0,"used":false},{"PRN":9,"el":10,"az":68,"ss":0,"used":false},{"PRN":14,"el":30,"az":153,"ss":0,"used":false},{"PRN":18,"el":43,"az":68,"ss":0,"used":false},{"PRN":19,"el":58,"az":270,"ss":34,"used":false},{"PRN":21,"el":16,"az":107,"ss":0,"used":false},{"PRN":22,"el":76,"az":110,"ss":0,"used":false},{"PRN":26,"el":42,"az":127,"ss":0,"used":false},{"PRN":27,"el":13,"az":55,"ss":27,"used":false},{"PRN":28,"el":8,"az":344,"ss":0,"used":false},{"PRN":33,"el":11,"az":238,"ss":0,"used":false},{"PRN":37,"el":25,"az":199,"ss":0,"used":false},{"PRN":39,"el":25,"az":194,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":14.63,"ydop":4.47,"vdop":0.90,"tdop":21.29,"hdop":1.80,"gdop":45.46,"pdop":2.10,"satellites":[{"PRN":3,"el":50,"az":217,"ss":0,"used":false},{"PRN":6,"el":49,"az":201,"ss":0,"used":false},{"PRN":9,"el":10,"az":68,"ss":0,"used":false},{"PRN":14,"el":30,"az":153,"ss":0,"used":false},{"PRN":18,"el":43,"az":68,"ss":0,"used":false},{"PRN":19,"el":58,"az":270,"ss":34,"used":false},{"PRN":21,"el":16,"az":107,"ss":0,"used":false},{"PRN":22,"el":76,"az":110,"ss":0,"used":false},{"PRN":26,"el":42,"az":127,"ss":0,"used":false},{"PRN":27,"el":13,"az":55,"ss":27,"used":false},{"PRN":28,"el":8,"az":344,"ss":0,"used":false},{"PRN":33,"el":11,"az":238,"ss":0,"used":false},{"PRN":37,"el":25,"az":199,"ss":0,"used":false},{"PRN":39,"el":25,"az":194,"ss":0,"used":false}]}
$GLGSV,2,1,06,66,18,048,,67,72,050,31,75,16,358,37,82,47,171,*67
$GLGSV,2,2,06,83,66,292,37,84,16,325,33*6A
-{"class":"SKY","tag":"GSV","vdop":0.90,"hdop":1.80,"pdop":2.10,"satellites":[{"PRN":66,"el":18,"az":48,"ss":0,"used":false},{"PRN":67,"el":72,"az":50,"ss":31,"used":true},{"PRN":75,"el":16,"az":358,"ss":37,"used":true},{"PRN":82,"el":47,"az":171,"ss":0,"used":false},{"PRN":83,"el":66,"az":292,"ss":37,"used":true},{"PRN":84,"el":16,"az":325,"ss":33,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":14.63,"ydop":4.47,"vdop":0.90,"tdop":21.29,"hdop":1.80,"gdop":45.46,"pdop":2.10,"satellites":[{"PRN":66,"el":18,"az":48,"ss":0,"used":false},{"PRN":67,"el":72,"az":50,"ss":31,"used":true},{"PRN":75,"el":16,"az":358,"ss":37,"used":true},{"PRN":82,"el":47,"az":171,"ss":0,"used":false},{"PRN":83,"el":66,"az":292,"ss":37,"used":true},{"PRN":84,"el":16,"az":325,"ss":33,"used":true}]}
$GNGSA,A,2,19,27,,,,,,,,,,,02.1,01.8,00.9*13
$GNGSA,A,2,67,84,83,75,,,,,,,,,02.1,01.8,00.9*1A
$GNGGA,135636.997,5543.0326,N,03724.7196,E,1,06,01.8,165.6,M,14.6,M,,*72
@@ -110,10 +110,10 @@ $GPGSV,4,1,14,03,50,217,,06,49,201,,09,10,068,,14,30,153,*74
$GPGSV,4,2,14,18,43,068,,19,58,270,34,21,16,107,,22,76,110,*7E
$GPGSV,4,3,14,26,42,127,,27,13,055,27,28,08,344,,33,11,238,*77
$GPGSV,4,4,14,37,25,199,,39,25,194,*7F
-{"class":"SKY","tag":"GSV","vdop":0.90,"hdop":1.80,"pdop":2.10,"satellites":[{"PRN":3,"el":50,"az":217,"ss":0,"used":false},{"PRN":6,"el":49,"az":201,"ss":0,"used":false},{"PRN":9,"el":10,"az":68,"ss":0,"used":false},{"PRN":14,"el":30,"az":153,"ss":0,"used":false},{"PRN":18,"el":43,"az":68,"ss":0,"used":false},{"PRN":19,"el":58,"az":270,"ss":34,"used":false},{"PRN":21,"el":16,"az":107,"ss":0,"used":false},{"PRN":22,"el":76,"az":110,"ss":0,"used":false},{"PRN":26,"el":42,"az":127,"ss":0,"used":false},{"PRN":27,"el":13,"az":55,"ss":27,"used":false},{"PRN":28,"el":8,"az":344,"ss":0,"used":false},{"PRN":33,"el":11,"az":238,"ss":0,"used":false},{"PRN":37,"el":25,"az":199,"ss":0,"used":false},{"PRN":39,"el":25,"az":194,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":14.63,"ydop":4.47,"vdop":0.90,"tdop":21.29,"hdop":1.80,"gdop":45.46,"pdop":2.10,"satellites":[{"PRN":3,"el":50,"az":217,"ss":0,"used":false},{"PRN":6,"el":49,"az":201,"ss":0,"used":false},{"PRN":9,"el":10,"az":68,"ss":0,"used":false},{"PRN":14,"el":30,"az":153,"ss":0,"used":false},{"PRN":18,"el":43,"az":68,"ss":0,"used":false},{"PRN":19,"el":58,"az":270,"ss":34,"used":false},{"PRN":21,"el":16,"az":107,"ss":0,"used":false},{"PRN":22,"el":76,"az":110,"ss":0,"used":false},{"PRN":26,"el":42,"az":127,"ss":0,"used":false},{"PRN":27,"el":13,"az":55,"ss":27,"used":false},{"PRN":28,"el":8,"az":344,"ss":0,"used":false},{"PRN":33,"el":11,"az":238,"ss":0,"used":false},{"PRN":37,"el":25,"az":199,"ss":0,"used":false},{"PRN":39,"el":25,"az":194,"ss":0,"used":false}]}
$GLGSV,2,1,06,66,18,048,,67,72,050,31,75,16,358,37,82,47,171,*67
$GLGSV,2,2,06,83,66,292,37,84,16,325,32*6B
-{"class":"SKY","tag":"GSV","vdop":0.90,"hdop":1.80,"pdop":2.10,"satellites":[{"PRN":66,"el":18,"az":48,"ss":0,"used":false},{"PRN":67,"el":72,"az":50,"ss":31,"used":true},{"PRN":75,"el":16,"az":358,"ss":37,"used":true},{"PRN":82,"el":47,"az":171,"ss":0,"used":false},{"PRN":83,"el":66,"az":292,"ss":37,"used":true},{"PRN":84,"el":16,"az":325,"ss":32,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":14.63,"ydop":4.47,"vdop":0.90,"tdop":21.29,"hdop":1.80,"gdop":45.46,"pdop":2.10,"satellites":[{"PRN":66,"el":18,"az":48,"ss":0,"used":false},{"PRN":67,"el":72,"az":50,"ss":31,"used":true},{"PRN":75,"el":16,"az":358,"ss":37,"used":true},{"PRN":82,"el":47,"az":171,"ss":0,"used":false},{"PRN":83,"el":66,"az":292,"ss":37,"used":true},{"PRN":84,"el":16,"az":325,"ss":32,"used":true}]}
$GNGSA,A,2,19,27,,,,,,,,,,,02.1,01.8,00.9*13
$GNGSA,A,2,67,84,83,75,,,,,,,,,02.1,01.8,00.9*1A
$GNGGA,135642.997,5543.0327,N,03724.7197,E,1,06,01.8,165.6,M,14.6,M,,*71
@@ -154,10 +154,10 @@ $GPGSV,4,1,14,03,50,217,,06,49,201,,09,10,068,,14,30,153,*74
$GPGSV,4,2,14,18,42,068,,19,58,270,34,21,16,107,,22,76,109,*77
$GPGSV,4,3,14,26,42,127,,27,13,055,26,28,08,344,,33,11,238,*76
$GPGSV,4,4,14,37,25,199,,39,25,194,*7F
-{"class":"SKY","tag":"GSV","vdop":0.90,"hdop":1.80,"pdop":2.10,"satellites":[{"PRN":3,"el":50,"az":217,"ss":0,"used":false},{"PRN":6,"el":49,"az":201,"ss":0,"used":false},{"PRN":9,"el":10,"az":68,"ss":0,"used":false},{"PRN":14,"el":30,"az":153,"ss":0,"used":false},{"PRN":18,"el":42,"az":68,"ss":0,"used":false},{"PRN":19,"el":58,"az":270,"ss":34,"used":false},{"PRN":21,"el":16,"az":107,"ss":0,"used":false},{"PRN":22,"el":76,"az":109,"ss":0,"used":false},{"PRN":26,"el":42,"az":127,"ss":0,"used":false},{"PRN":27,"el":13,"az":55,"ss":26,"used":false},{"PRN":28,"el":8,"az":344,"ss":0,"used":false},{"PRN":33,"el":11,"az":238,"ss":0,"used":false},{"PRN":37,"el":25,"az":199,"ss":0,"used":false},{"PRN":39,"el":25,"az":194,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":14.63,"ydop":4.47,"vdop":0.90,"tdop":21.29,"hdop":1.80,"gdop":45.46,"pdop":2.10,"satellites":[{"PRN":3,"el":50,"az":217,"ss":0,"used":false},{"PRN":6,"el":49,"az":201,"ss":0,"used":false},{"PRN":9,"el":10,"az":68,"ss":0,"used":false},{"PRN":14,"el":30,"az":153,"ss":0,"used":false},{"PRN":18,"el":42,"az":68,"ss":0,"used":false},{"PRN":19,"el":58,"az":270,"ss":34,"used":false},{"PRN":21,"el":16,"az":107,"ss":0,"used":false},{"PRN":22,"el":76,"az":109,"ss":0,"used":false},{"PRN":26,"el":42,"az":127,"ss":0,"used":false},{"PRN":27,"el":13,"az":55,"ss":26,"used":false},{"PRN":28,"el":8,"az":344,"ss":0,"used":false},{"PRN":33,"el":11,"az":238,"ss":0,"used":false},{"PRN":37,"el":25,"az":199,"ss":0,"used":false},{"PRN":39,"el":25,"az":194,"ss":0,"used":false}]}
$GLGSV,2,1,06,66,18,048,,67,72,050,31,75,16,358,38,82,47,171,*68
$GLGSV,2,2,06,83,66,291,37,84,17,325,34*6F
-{"class":"SKY","tag":"GSV","vdop":0.90,"hdop":1.80,"pdop":2.10,"satellites":[{"PRN":66,"el":18,"az":48,"ss":0,"used":false},{"PRN":67,"el":72,"az":50,"ss":31,"used":true},{"PRN":75,"el":16,"az":358,"ss":38,"used":true},{"PRN":82,"el":47,"az":171,"ss":0,"used":false},{"PRN":83,"el":66,"az":291,"ss":37,"used":true},{"PRN":84,"el":17,"az":325,"ss":34,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":14.63,"ydop":4.47,"vdop":0.90,"tdop":21.29,"hdop":1.80,"gdop":45.46,"pdop":2.10,"satellites":[{"PRN":66,"el":18,"az":48,"ss":0,"used":false},{"PRN":67,"el":72,"az":50,"ss":31,"used":true},{"PRN":75,"el":16,"az":358,"ss":38,"used":true},{"PRN":82,"el":47,"az":171,"ss":0,"used":false},{"PRN":83,"el":66,"az":291,"ss":37,"used":true},{"PRN":84,"el":17,"az":325,"ss":34,"used":true}]}
$GNGSA,A,2,19,27,,,,,,,,,,,02.1,01.8,00.9*13
$GNGSA,A,2,67,84,83,75,,,,,,,,,02.1,01.8,00.9*1A
$GNGGA,135648.997,5543.0327,N,03724.7197,E,1,06,01.8,165.6,M,14.6,M,,*7B
@@ -200,10 +200,10 @@ $GPGSV,4,1,14,03,50,217,,06,49,201,,09,10,068,,14,30,153,*74
$GPGSV,4,2,14,18,42,068,,19,58,270,36,21,16,107,,22,76,109,*75
$GPGSV,4,3,14,26,42,127,,27,13,055,25,28,08,344,22,33,11,238,*75
$GPGSV,4,4,14,37,25,199,,39,25,194,*7F
-{"class":"SKY","tag":"GSV","vdop":0.90,"hdop":1.80,"pdop":2.10,"satellites":[{"PRN":3,"el":50,"az":217,"ss":0,"used":false},{"PRN":6,"el":49,"az":201,"ss":0,"used":false},{"PRN":9,"el":10,"az":68,"ss":0,"used":false},{"PRN":14,"el":30,"az":153,"ss":0,"used":false},{"PRN":18,"el":42,"az":68,"ss":0,"used":false},{"PRN":19,"el":58,"az":270,"ss":36,"used":false},{"PRN":21,"el":16,"az":107,"ss":0,"used":false},{"PRN":22,"el":76,"az":109,"ss":0,"used":false},{"PRN":26,"el":42,"az":127,"ss":0,"used":false},{"PRN":27,"el":13,"az":55,"ss":25,"used":false},{"PRN":28,"el":8,"az":344,"ss":22,"used":false},{"PRN":33,"el":11,"az":238,"ss":0,"used":false},{"PRN":37,"el":25,"az":199,"ss":0,"used":false},{"PRN":39,"el":25,"az":194,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":14.63,"ydop":4.47,"vdop":0.90,"tdop":21.29,"hdop":1.80,"gdop":45.46,"pdop":2.10,"satellites":[{"PRN":3,"el":50,"az":217,"ss":0,"used":false},{"PRN":6,"el":49,"az":201,"ss":0,"used":false},{"PRN":9,"el":10,"az":68,"ss":0,"used":false},{"PRN":14,"el":30,"az":153,"ss":0,"used":false},{"PRN":18,"el":42,"az":68,"ss":0,"used":false},{"PRN":19,"el":58,"az":270,"ss":36,"used":false},{"PRN":21,"el":16,"az":107,"ss":0,"used":false},{"PRN":22,"el":76,"az":109,"ss":0,"used":false},{"PRN":26,"el":42,"az":127,"ss":0,"used":false},{"PRN":27,"el":13,"az":55,"ss":25,"used":false},{"PRN":28,"el":8,"az":344,"ss":22,"used":false},{"PRN":33,"el":11,"az":238,"ss":0,"used":false},{"PRN":37,"el":25,"az":199,"ss":0,"used":false},{"PRN":39,"el":25,"az":194,"ss":0,"used":false}]}
$GLGSV,2,1,06,66,18,048,,67,72,050,32,75,16,358,39,82,47,171,*6A
$GLGSV,2,2,06,83,66,291,37,84,17,325,34*6F
-{"class":"SKY","tag":"GSV","vdop":0.90,"hdop":1.80,"pdop":2.10,"satellites":[{"PRN":66,"el":18,"az":48,"ss":0,"used":false},{"PRN":67,"el":72,"az":50,"ss":32,"used":true},{"PRN":75,"el":16,"az":358,"ss":39,"used":true},{"PRN":82,"el":47,"az":171,"ss":0,"used":false},{"PRN":83,"el":66,"az":291,"ss":37,"used":true},{"PRN":84,"el":17,"az":325,"ss":34,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":14.63,"ydop":4.47,"vdop":0.90,"tdop":21.29,"hdop":1.80,"gdop":45.46,"pdop":2.10,"satellites":[{"PRN":66,"el":18,"az":48,"ss":0,"used":false},{"PRN":67,"el":72,"az":50,"ss":32,"used":true},{"PRN":75,"el":16,"az":358,"ss":39,"used":true},{"PRN":82,"el":47,"az":171,"ss":0,"used":false},{"PRN":83,"el":66,"az":291,"ss":37,"used":true},{"PRN":84,"el":17,"az":325,"ss":34,"used":true}]}
$GNGSA,A,2,19,27,,,,,,,,,,,02.1,01.8,00.9*13
$GNGSA,A,2,67,84,83,75,,,,,,,,,02.1,01.8,00.9*1A
$GLGGA,135654.997,5543.0328,N,03724.7197,E,1,04,02.3,165.6,M,14.6,M,,*71
diff --git a/test/daemon/com-1289.log.chk b/test/daemon/com-1289.log.chk
index ddf61f60..4ba5ec72 100644
--- a/test/daemon/com-1289.log.chk
+++ b/test/daemon/com-1289.log.chk
@@ -3,7 +3,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,35,05,16,114,43,06,65,063,50,07,72,061,47*79
$GPGSV,3,2,11,10,09,057,40,16,35,295,48,21,43,153,53,23,12,316,51*72
$GPGSV,3,3,11,24,51,098,55,30,33,110,50,31,60,230,47*4A
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":35,"used":false},{"PRN":5,"el":16,"az":114,"ss":43,"used":true},{"PRN":6,"el":65,"az":63,"ss":50,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":43,"az":153,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":98,"ss":55,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.71,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":35,"used":false},{"PRN":5,"el":16,"az":114,"ss":43,"used":true},{"PRN":6,"el":65,"az":63,"ss":50,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":43,"az":153,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":98,"ss":55,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
$GPRMC,143748.77,A,4806.3731,N,00138.6217,W,0.00,266.5,121007,2.6,W,A*0A
{"class":"TPV","tag":"RMC","time":1192199868.770,"ept":0.005,"lat":48.106218333,"lon":-1.643695000,"epx":7.849,"epy":10.678,"track":266.5000,"speed":0.000,"mode":2}
$GPGGA,143748.77,4806.3731,N,00138.6217,W,1,10,1.1,42.2,M,48.5,M,,*4B
@@ -14,7 +14,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,35,05,16,114,43,06,65,063,50,07,72,061,47*79
$GPGSV,3,2,11,10,09,057,39,16,35,295,48,21,43,153,53,23,12,316,51*7C
$GPGSV,3,3,11,24,51,098,55,30,33,110,50,31,60,230,47*4A
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":35,"used":false},{"PRN":5,"el":16,"az":114,"ss":43,"used":true},{"PRN":6,"el":65,"az":63,"ss":50,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":43,"az":153,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":98,"ss":55,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.71,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":35,"used":false},{"PRN":5,"el":16,"az":114,"ss":43,"used":true},{"PRN":6,"el":65,"az":63,"ss":50,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":43,"az":153,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":98,"ss":55,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
$GPRMC,143749.77,A,4806.3731,N,00138.6217,W,0.00,266.5,121007,2.6,W,A*0B
$GPGGA,143749.77,4806.3731,N,00138.6217,W,1,10,1.1,42.2,M,48.5,M,,*4A
{"class":"TPV","tag":"GGA","time":1192199869.770,"ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.200,"epx":7.849,"epy":10.678,"epv":27.600,"track":266.5000,"speed":0.000,"eps":21.36,"mode":3}
@@ -23,7 +23,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,34,05,16,114,42,06,65,063,50,07,72,061,47*79
$GPGSV,3,2,11,10,09,057,40,16,35,295,48,21,43,153,53,23,12,316,51*72
$GPGSV,3,3,11,24,51,098,55,30,33,110,50,31,60,230,47*4A
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":50,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":43,"az":153,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":98,"ss":55,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.71,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":50,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":43,"az":153,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":98,"ss":55,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
$GPRMC,143750.77,A,4806.3731,N,00138.6217,W,0.00,266.5,121007,2.6,W,A*03
$GPGGA,143750.77,4806.3731,N,00138.6217,W,1,10,1.0,42.2,M,48.5,M,,*43
{"class":"TPV","tag":"GGA","time":1192199870.770,"ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.200,"epx":7.849,"epy":10.678,"epv":27.600,"track":266.5000,"speed":0.000,"eps":21.36,"mode":3}
@@ -39,16 +39,16 @@ $GPGSA,A,3,01,05,06,07,16,21,23,24,30,31,,,1.9,1.3,1.3*3D
$GPGSV,3,1,11,01,06,230,35,05,16,114,42,06,65,063,50,07,72,061,47*78
$GPGSV,3,2,11,10,09,057,40,16,35,295,48,21,43,153,53,23,12,316,51*72
$GPGSV,3,3,11,24,51,098,55,30,33,110,50,31,60,230,46*4B
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.30,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":35,"used":true},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":50,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":43,"az":153,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":98,"ss":55,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.71,"vdop":1.30,"tdop":0.63,"hdop":1.30,"gdop":1.54,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":35,"used":true},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":50,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":43,"az":153,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":98,"ss":55,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":46,"used":true}]}
$GPRMC,143752.77,A,4806.3731,N,00138.6217,W,0.00,266.5,121007,2.6,W,A*01
$GPGGA,143752.77,4806.3731,N,00138.6217,W,1,10,1.1,42.1,M,48.5,M,,*43
-{"class":"TPV","tag":"GGA","time":1192199872.770,"ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.100,"epx":7.849,"epy":10.678,"epv":29.900,"track":266.5000,"speed":0.000,"mode":3}
+{"class":"TPV","tag":"GGA","time":1192199872.770,"ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.100,"epx":7.849,"epy":10.678,"epv":29.900,"track":266.5000,"speed":0.000,"eps":21.36,"mode":3}
$PFST,FOM,5*60
$GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,35,05,16,114,42,06,65,063,50,07,72,061,47*78
$GPGSV,3,2,11,10,09,057,41,16,35,295,48,21,44,152,53,23,12,316,51*75
$GPGSV,3,3,11,24,51,098,55,30,33,110,50,31,60,230,46*4B
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":35,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":50,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":41,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":98,"ss":55,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":35,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":50,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":41,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":98,"ss":55,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":46,"used":true}]}
$GPRMC,143753.77,A,4806.3731,N,00138.6217,W,0.00,266.5,121007,2.6,W,A*00
$GPGGA,143753.77,4806.3731,N,00138.6217,W,1,10,1.1,42.2,M,48.5,M,,*41
{"class":"TPV","tag":"GGA","time":1192199873.770,"ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.200,"epx":7.850,"epy":10.734,"epv":27.600,"track":266.5000,"speed":0.000,"eps":21.41,"mode":3}
@@ -57,7 +57,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,34,05,16,114,42,06,65,063,50,07,72,061,47*79
$GPGSV,3,2,11,10,09,057,41,16,35,295,48,21,44,152,53,23,12,316,51*75
$GPGSV,3,3,11,24,51,098,55,30,33,110,50,31,60,230,46*4B
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":50,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":41,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":98,"ss":55,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":50,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":41,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":98,"ss":55,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":46,"used":true}]}
$GPRMC,143754.77,A,4806.3731,N,00138.6217,W,0.00,266.5,121007,2.6,W,A*07
$GPGGA,143754.77,4806.3731,N,00138.6217,W,1,10,1.1,42.1,M,48.5,M,,*45
{"class":"TPV","tag":"GGA","time":1192199874.770,"ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.100,"epx":7.850,"epy":10.734,"epv":27.600,"track":266.5000,"speed":0.000,"eps":21.47,"mode":3}
@@ -66,7 +66,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,34,05,16,114,41,06,65,063,50,07,72,061,47*7A
$GPGSV,3,2,11,10,09,057,40,16,35,295,48,21,44,152,53,23,12,316,51*74
$GPGSV,3,3,11,24,51,098,55,30,33,110,50,31,60,230,47*4A
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":41,"used":true},{"PRN":6,"el":65,"az":63,"ss":50,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":98,"ss":55,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":41,"used":true},{"PRN":6,"el":65,"az":63,"ss":50,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":98,"ss":55,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
$GPRMC,143755.77,A,4806.3731,N,00138.6217,W,0.00,266.5,121007,2.6,W,A*06
$GPGGA,143755.77,4806.3731,N,00138.6217,W,1,10,1.1,42.1,M,48.5,M,,*44
{"class":"TPV","tag":"GGA","time":1192199875.770,"ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.100,"epx":7.850,"epy":10.734,"epv":27.600,"track":266.5000,"speed":0.000,"eps":21.47,"mode":3}
@@ -75,7 +75,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,34,05,16,114,41,06,65,063,49,07,72,061,47*72
$GPGSV,3,2,11,10,09,057,40,16,35,295,48,21,44,152,53,23,12,316,51*74
$GPGSV,3,3,11,24,51,097,55,30,33,110,51,31,60,230,47*44
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":41,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":33,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":41,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":33,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
$GPRMC,143756.77,A,4806.3731,N,00138.6217,W,0.00,266.5,121007,2.6,W,A*05
$GPGGA,143756.77,4806.3731,N,00138.6217,W,1,10,1.1,42.1,M,48.5,M,,*47
{"class":"TPV","tag":"GGA","time":1192199876.770,"ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.100,"epx":7.848,"epy":10.736,"epv":27.600,"track":266.5000,"speed":0.000,"eps":21.47,"mode":3}
@@ -84,7 +84,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,33,05,16,114,42,06,65,063,49,07,72,061,47*76
$GPGSV,3,2,11,10,09,057,39,16,35,295,48,21,44,152,53,23,12,316,51*7A
$GPGSV,3,3,11,24,51,097,54,30,33,110,50,31,60,230,47*44
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":33,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":33,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
$GPRMC,143757.77,A,4806.3731,N,00138.6217,W,0.00,266.5,121007,2.6,W,A*04
$GPGGA,143757.77,4806.3731,N,00138.6217,W,1,10,1.3,42.1,M,48.5,M,,*44
{"class":"TPV","tag":"GGA","time":1192199877.770,"ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.100,"epx":7.848,"epy":10.736,"epv":27.600,"track":266.5000,"speed":0.000,"eps":21.47,"mode":3}
@@ -93,7 +93,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.9,1.3,1.3*3D
$GPGSV,3,1,11,01,06,230,33,05,16,114,42,06,65,063,49,07,72,061,47*76
$GPGSV,3,2,11,10,09,057,38,16,35,295,48,21,44,152,53,23,12,316,51*7B
$GPGSV,3,3,11,24,51,097,54,30,33,110,50,31,60,230,47*44
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.30,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":33,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.30,"tdop":0.63,"hdop":1.30,"gdop":1.54,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":33,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
$GPRMC,143758.77,A,4806.3731,N,00138.6217,W,0.00,266.5,121007,2.6,W,A*0B
$GPGGA,143758.77,4806.3731,N,00138.6217,W,1,09,1.3,42.1,M,48.5,M,,*43
{"class":"TPV","tag":"GGA","time":1192199878.770,"ept":0.005,"lat":48.106218333,"lon":-1.643695000,"alt":42.100,"epx":7.848,"epy":10.736,"epv":29.900,"track":266.5000,"speed":0.000,"eps":21.47,"mode":3}
@@ -102,7 +102,7 @@ $GPGSA,A,3,05,06,07,16,21,23,24,30,31,,,,1.9,1.3,1.3*3C
$GPGSV,3,1,11,01,06,230,32,05,16,114,42,06,65,063,49,07,72,061,46*76
$GPGSV,3,2,11,10,09,057,37,16,35,295,48,21,44,152,53,23,12,316,51*74
$GPGSV,3,3,11,24,51,097,54,30,33,110,50,31,60,230,47*44
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.30,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":32,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":37,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.73,"vdop":1.30,"tdop":0.64,"hdop":1.30,"gdop":1.56,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":32,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":37,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
$GPRMC,143759.77,A,4806.3731,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*0B
$GPGGA,143759.77,4806.3731,N,00138.6216,W,1,09,1.3,42.1,M,48.5,M,,*43
{"class":"TPV","tag":"GGA","time":1192199879.770,"ept":0.005,"lat":48.106218333,"lon":-1.643693333,"alt":42.100,"epx":8.203,"epy":10.876,"epv":29.900,"track":266.5000,"speed":0.000,"eps":21.61,"mode":3}
@@ -111,7 +111,7 @@ $GPGSA,A,3,05,06,07,16,21,23,24,30,31,,,,2.2,1.3,1.7*30
$GPGSV,3,1,11,01,06,230,32,05,16,114,42,06,65,063,49,07,72,061,46*76
$GPGSV,3,2,11,10,09,057,38,16,35,295,48,21,44,152,53,23,12,316,51*7B
$GPGSV,3,3,11,24,51,097,54,30,33,110,50,31,60,230,47*44
-{"class":"SKY","tag":"GSV","vdop":1.70,"hdop":1.30,"pdop":2.20,"satellites":[{"PRN":1,"el":6,"az":230,"ss":32,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.73,"vdop":1.70,"tdop":0.64,"hdop":1.30,"gdop":1.56,"pdop":2.20,"satellites":[{"PRN":1,"el":6,"az":230,"ss":32,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":47,"used":true}]}
$GPRMC,143800.77,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*0B
$GPGGA,143800.77,4806.3732,N,00138.6216,W,1,09,1.3,42.1,M,48.5,M,,*43
{"class":"TPV","tag":"GGA","time":1192199880.770,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":8.203,"epy":10.876,"epv":39.100,"track":266.5000,"speed":0.000,"eps":21.75,"mode":3}
@@ -120,7 +120,7 @@ $GPGSA,A,3,05,06,07,16,21,23,24,30,31,,,,1.9,1.3,1.3*3C
$GPGSV,3,1,11,01,06,230,31,05,16,114,42,06,65,063,49,07,72,061,46*75
$GPGSV,3,2,11,10,09,057,38,16,35,295,48,21,44,152,53,23,12,316,51*7B
$GPGSV,3,3,11,24,51,097,54,30,33,110,50,31,60,230,46*45
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.30,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":31,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.73,"vdop":1.30,"tdop":0.64,"hdop":1.30,"gdop":1.56,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":31,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":33,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":46,"used":true}]}
$GPRMC,143801.77,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*0A
$GPGGA,143801.77,4806.3732,N,00138.6216,W,1,10,1.7,42.1,M,48.5,M,,*4E
{"class":"TPV","tag":"GGA","time":1192199881.770,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":8.203,"epy":10.876,"epv":29.900,"track":266.5000,"speed":0.000,"eps":21.75,"mode":3}
@@ -129,7 +129,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,2.4,1.7,1.6*32
$GPGSV,3,1,11,01,06,230,32,05,16,114,43,06,65,063,49,07,72,061,46*77
$GPGSV,3,2,11,10,09,057,38,16,35,295,48,21,44,152,53,23,12,316,51*7B
$GPGSV,3,3,11,24,51,097,54,30,32,110,50,31,60,230,46*44
-{"class":"SKY","tag":"GSV","vdop":1.60,"hdop":1.70,"pdop":2.40,"satellites":[{"PRN":1,"el":6,"az":230,"ss":32,"used":false},{"PRN":5,"el":16,"az":114,"ss":43,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.60,"tdop":0.63,"hdop":1.70,"gdop":1.54,"pdop":2.40,"satellites":[{"PRN":1,"el":6,"az":230,"ss":32,"used":false},{"PRN":5,"el":16,"az":114,"ss":43,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":230,"ss":46,"used":true}]}
$GPRMC,143802.77,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*09
$GPGGA,143802.77,4806.3732,N,00138.6216,W,1,09,1.7,42.1,M,48.5,M,,*45
{"class":"TPV","tag":"GGA","time":1192199882.770,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":7.830,"epy":10.734,"epv":36.800,"track":266.5000,"speed":0.000,"eps":21.61,"mode":3}
@@ -138,7 +138,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,,,,2.4,1.7,1.6*30
$GPGSV,3,1,11,01,06,230,32,05,16,114,43,06,65,063,49,07,72,061,47*76
$GPGSV,3,2,11,10,09,057,39,16,35,295,48,21,44,152,53,23,12,316,51*7A
$GPGSV,3,3,11,24,51,097,54,30,32,110,50,31,60,229,46*4C
-{"class":"SKY","tag":"GSV","vdop":1.60,"hdop":1.70,"pdop":2.40,"satellites":[{"PRN":1,"el":6,"az":230,"ss":32,"used":false},{"PRN":5,"el":16,"az":114,"ss":43,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.73,"vdop":1.60,"tdop":0.64,"hdop":1.70,"gdop":1.56,"pdop":2.40,"satellites":[{"PRN":1,"el":6,"az":230,"ss":32,"used":false},{"PRN":5,"el":16,"az":114,"ss":43,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":false}]}
$GPRMC,143803.77,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*08
$GPGGA,143803.77,4806.3732,N,00138.6216,W,1,11,1.1,42.1,M,48.5,M,,*4B
{"class":"TPV","tag":"GGA","time":1192199883.770,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":8.203,"epy":10.876,"epv":36.800,"track":266.5000,"speed":0.000,"eps":21.61,"mode":3}
@@ -147,7 +147,7 @@ $GPGSA,A,3,01,05,06,07,10,16,21,23,24,30,31,,1.7,1.1,1.2*31
$GPGSV,3,1,11,01,06,230,32,05,16,114,44,06,65,063,49,07,72,061,47*71
$GPGSV,3,2,11,10,09,057,39,16,35,295,48,21,44,152,53,23,12,316,52*79
$GPGSV,3,3,11,24,51,097,55,30,32,110,50,31,60,229,46*4D
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":32,"used":true},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.49,"ydop":0.70,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.46,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":32,"used":true},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
$GPRMC,143804.78,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*00
$GPGGA,143804.78,4806.3732,N,00138.6216,W,1,09,1.3,42.1,M,48.5,M,,*48
{"class":"TPV","tag":"GGA","time":1192199884.780,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":7.317,"epy":10.425,"epv":27.600,"track":266.5000,"speed":0.000,"eps":21.09,"mode":3}
@@ -156,7 +156,7 @@ $GPGSA,A,3,05,06,07,16,21,23,24,30,31,,,,1.9,1.3,1.3*3C
$GPGSV,3,1,11,01,06,230,33,05,16,114,44,06,65,063,49,07,72,061,47*70
$GPGSV,3,2,11,10,09,057,40,16,35,295,48,21,44,152,53,23,12,316,52*77
$GPGSV,3,3,11,24,51,097,55,30,32,110,50,31,60,229,46*4D
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.30,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":33,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.73,"vdop":1.30,"tdop":0.64,"hdop":1.30,"gdop":1.56,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":33,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
$GPRMC,143805.78,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*01
$GPGGA,143805.78,4806.3732,N,00138.6216,W,1,09,1.3,42.1,M,48.5,M,,*49
{"class":"TPV","tag":"GGA","time":1192199885.780,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":8.203,"epy":10.876,"epv":29.900,"track":266.5000,"speed":0.000,"eps":21.30,"mode":3}
@@ -165,7 +165,7 @@ $GPGSA,A,3,05,06,07,16,21,23,24,30,31,,,,1.9,1.3,1.3*3C
$GPGSV,3,1,11,01,06,230,00,05,16,114,44,06,65,063,49,07,72,061,47*70
$GPGSV,3,2,11,10,09,057,40,16,35,295,48,21,44,152,53,23,12,316,51*74
$GPGSV,3,3,11,24,51,097,55,30,32,110,50,31,60,229,46*4D
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.30,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":0,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.73,"vdop":1.30,"tdop":0.64,"hdop":1.30,"gdop":1.56,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":0,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
$GPRMC,143806.78,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*02
$GPGGA,143806.78,4806.3732,N,00138.6216,W,1,10,1.1,42.1,M,48.5,M,,*40
{"class":"TPV","tag":"GGA","time":1192199886.780,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":8.203,"epy":10.876,"epv":29.900,"track":266.5000,"speed":0.000,"eps":21.75,"mode":3}
@@ -174,7 +174,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,13,05,16,114,44,06,65,063,49,07,72,061,47*72
$GPGSV,3,2,11,10,09,057,41,16,35,295,48,21,44,152,53,23,12,316,52*76
$GPGSV,3,3,11,24,51,097,55,30,32,110,50,31,60,229,46*4D
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":13,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":41,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":13,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":41,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
$GPRMC,143807.78,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*03
$GPGGA,143807.78,4806.3732,N,00138.6216,W,1,10,1.1,42.1,M,48.5,M,,*41
{"class":"TPV","tag":"GGA","time":1192199887.780,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":7.830,"epy":10.734,"epv":27.600,"track":266.5000,"speed":0.000,"eps":21.61,"mode":3}
@@ -183,7 +183,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,30,05,16,114,44,06,65,063,49,07,72,061,47*73
$GPGSV,3,2,11,10,09,057,41,16,35,295,48,21,44,152,53,23,12,316,52*76
$GPGSV,3,3,11,24,51,097,55,30,32,110,50,31,60,229,46*4D
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":30,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":41,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":30,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":41,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
$GPRMC,143808.78,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*0C
$GPGGA,143808.78,4806.3732,N,00138.6216,W,1,10,1.1,42.1,M,48.5,M,,*4E
{"class":"TPV","tag":"GGA","time":1192199888.780,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":7.830,"epy":10.734,"epv":27.600,"track":266.5000,"speed":0.000,"eps":21.47,"mode":3}
@@ -192,7 +192,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,33,05,16,114,43,06,65,063,49,07,72,061,47*77
$GPGSV,3,2,11,10,09,057,40,16,35,295,48,21,44,152,53,23,12,316,51*74
$GPGSV,3,3,11,24,51,097,55,30,32,110,51,31,60,229,47*4D
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":33,"used":false},{"PRN":5,"el":16,"az":114,"ss":43,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":33,"used":false},{"PRN":5,"el":16,"az":114,"ss":43,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
$GPRMC,143809.78,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*0D
$GPGGA,143809.78,4806.3732,N,00138.6216,W,1,09,1.3,42.1,M,48.5,M,,*45
{"class":"TPV","tag":"GGA","time":1192199889.780,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":7.830,"epy":10.734,"epv":27.600,"track":266.5000,"speed":0.000,"eps":21.47,"mode":3}
@@ -201,7 +201,7 @@ $GPGSA,A,3,05,06,07,16,21,23,24,30,31,,,,2.2,1.3,1.7*30
$GPGSV,3,1,11,01,06,230,33,05,16,114,45,06,65,063,49,07,72,061,47*71
$GPGSV,3,2,11,10,09,057,38,16,35,295,48,21,44,152,53,23,12,316,52*78
$GPGSV,3,3,11,24,51,097,54,30,32,110,51,31,60,229,46*4D
-{"class":"SKY","tag":"GSV","vdop":1.70,"hdop":1.30,"pdop":2.20,"satellites":[{"PRN":1,"el":6,"az":230,"ss":33,"used":false},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.73,"vdop":1.70,"tdop":0.64,"hdop":1.30,"gdop":1.56,"pdop":2.20,"satellites":[{"PRN":1,"el":6,"az":230,"ss":33,"used":false},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
$GPRMC,143810.78,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*05
$GPGGA,143810.78,4806.3732,N,00138.6216,W,1,10,1.0,42.1,M,48.5,M,,*46
{"class":"TPV","tag":"GGA","time":1192199890.780,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":8.203,"epy":10.876,"epv":39.100,"track":266.5000,"speed":0.000,"eps":21.61,"mode":3}
@@ -210,7 +210,7 @@ $GPGSA,A,3,01,05,06,07,16,21,23,24,30,31,,,1.5,1.0,1.2*33
$GPGSV,3,1,11,01,06,230,36,05,16,114,44,06,65,063,49,07,72,061,47*75
$GPGSV,3,2,11,10,09,057,37,16,35,295,49,21,44,152,53,23,12,316,52*76
$GPGSV,3,3,11,24,51,097,53,30,32,110,51,31,60,229,46*4A
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.00,"pdop":1.50,"satellites":[{"PRN":1,"el":6,"az":230,"ss":36,"used":true},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":37,"used":false},{"PRN":16,"el":35,"az":295,"ss":49,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":53,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.00,"gdop":1.54,"pdop":1.50,"satellites":[{"PRN":1,"el":6,"az":230,"ss":36,"used":true},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":37,"used":false},{"PRN":16,"el":35,"az":295,"ss":49,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":53,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
$GPRMC,143811.78,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*04
$GPGGA,143811.78,4806.3732,N,00138.6216,W,1,10,1.3,42.1,M,48.5,M,,*44
{"class":"TPV","tag":"GGA","time":1192199891.780,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":7.830,"epy":10.734,"epv":27.600,"track":266.5000,"speed":0.000,"eps":21.61,"mode":3}
@@ -219,7 +219,7 @@ $GPGSA,A,3,01,05,06,07,16,21,23,24,30,31,,,1.9,1.3,1.3*3D
$GPGSV,3,1,11,01,06,230,38,05,16,114,42,06,65,063,49,07,72,061,47*7D
$GPGSV,3,2,11,10,09,057,38,16,35,295,48,21,44,152,53,23,12,316,51*7B
$GPGSV,3,3,11,24,51,097,54,30,32,110,51,31,60,229,46*4D
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.30,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":38,"used":true},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.30,"tdop":0.63,"hdop":1.30,"gdop":1.54,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":38,"used":true},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
$GPRMC,143812.78,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*07
$GPGGA,143812.78,4806.3732,N,00138.6216,W,1,11,1.3,42.1,M,48.5,M,,*46
{"class":"TPV","tag":"GGA","time":1192199892.780,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":7.830,"epy":10.734,"epv":29.900,"track":266.5000,"speed":0.000,"eps":21.47,"mode":3}
@@ -228,7 +228,7 @@ $GPGSA,A,3,01,05,06,07,10,16,21,23,24,30,31,,1.9,1.3,1.3*3C
$GPGSV,3,1,11,01,06,230,39,05,16,114,43,06,65,063,48,07,72,061,47*7C
$GPGSV,3,2,11,10,09,057,37,16,35,295,48,21,44,152,52,23,12,316,52*76
$GPGSV,3,3,11,24,51,097,54,30,32,110,51,31,60,229,47*4C
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.30,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":39,"used":true},{"PRN":5,"el":16,"az":114,"ss":43,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":37,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.49,"ydop":0.70,"vdop":1.30,"tdop":0.63,"hdop":1.30,"gdop":1.46,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":39,"used":true},{"PRN":5,"el":16,"az":114,"ss":43,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":37,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
$GPRMC,143813.78,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*06
$GPGGA,143813.78,4806.3732,N,00138.6216,W,1,09,1.3,42.1,M,48.5,M,,*4E
{"class":"TPV","tag":"GGA","time":1192199893.780,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":7.317,"epy":10.425,"epv":29.900,"track":266.5000,"speed":0.000,"eps":21.16,"mode":3}
@@ -237,7 +237,7 @@ $GPGSA,A,3,05,06,07,16,21,23,24,30,31,,,,1.9,1.3,1.3*3C
$GPGSV,3,1,11,01,06,230,38,05,16,114,44,06,65,063,48,07,72,061,47*7A
$GPGSV,3,2,11,10,09,057,36,16,35,295,47,21,44,152,53,23,12,316,51*7A
$GPGSV,3,3,11,24,51,097,54,30,32,110,50,31,60,229,48*42
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.30,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":38,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":36,"used":false},{"PRN":16,"el":35,"az":295,"ss":47,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.73,"vdop":1.30,"tdop":0.64,"hdop":1.30,"gdop":1.56,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":38,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":36,"used":false},{"PRN":16,"el":35,"az":295,"ss":47,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
$GPRMC,143814.78,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*01
$GPGGA,143814.78,4806.3732,N,00138.6216,W,1,10,1.3,42.1,M,48.5,M,,*41
{"class":"TPV","tag":"GGA","time":1192199894.780,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":8.203,"epy":10.876,"epv":29.900,"track":266.5000,"speed":0.000,"eps":21.30,"mode":3}
@@ -246,7 +246,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.9,1.3,1.3*3D
$GPGSV,3,1,11,01,06,230,38,05,16,114,44,06,65,063,47,07,72,061,47*75
$GPGSV,3,2,11,10,09,057,37,16,35,295,48,21,44,152,52,23,12,316,52*76
$GPGSV,3,3,11,24,51,097,54,30,32,110,51,31,60,229,48*43
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.30,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":38,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":47,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":37,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.30,"tdop":0.63,"hdop":1.30,"gdop":1.54,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":38,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":47,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":37,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
$GPRMC,143815.78,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*00
$GPGGA,143815.78,4806.3732,N,00138.6216,W,1,10,1.2,42.1,M,48.5,M,,*41
{"class":"TPV","tag":"GGA","time":1192199895.780,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":7.830,"epy":10.734,"epv":29.900,"track":266.5000,"speed":0.000,"eps":21.61,"mode":3}
@@ -255,7 +255,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.2,1.3*32
$GPGSV,3,1,11,01,06,230,37,05,16,114,45,06,65,063,48,07,72,061,47*74
$GPGSV,3,2,11,10,09,057,40,16,35,295,49,21,44,152,52,23,12,316,50*75
$GPGSV,3,3,11,24,51,097,54,30,32,110,51,31,60,229,46*4D
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.20,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":37,"used":false},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":49,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":50,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.30,"tdop":0.63,"hdop":1.20,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":37,"used":false},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":49,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":50,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
$GPRMC,143816.78,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*03
$GPGGA,143816.78,4806.3732,N,00138.6216,W,1,10,1.2,42.1,M,48.5,M,,*42
{"class":"TPV","tag":"GGA","time":1192199896.780,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":7.830,"epy":10.734,"epv":29.900,"track":266.5000,"speed":0.000,"eps":21.47,"mode":3}
@@ -264,7 +264,7 @@ $GPGSA,A,3,01,05,06,07,10,16,21,23,24,30,,,1.7,1.2,1.3*31
$GPGSV,3,1,11,01,06,230,37,05,16,114,45,06,65,063,48,07,72,061,46*75
$GPGSV,3,2,11,10,09,057,40,16,35,295,48,21,44,152,53,23,12,316,52*77
$GPGSV,3,3,11,24,51,097,54,30,32,110,51,31,60,229,45*4E
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.20,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":37,"used":true},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":45,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.30,"tdop":0.63,"hdop":1.20,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":37,"used":true},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":52,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":45,"used":false}]}
$GPRMC,143817.78,A,4806.3732,N,00138.6216,W,0.00,266.5,121007,2.6,W,A*02
$GPGGA,143817.78,4806.3732,N,00138.6216,W,1,11,0.8,42.1,M,48.5,M,,*49
{"class":"TPV","tag":"GGA","time":1192199897.780,"ept":0.005,"lat":48.106220000,"lon":-1.643693333,"alt":42.100,"epx":7.830,"epy":10.734,"epv":29.900,"track":266.5000,"speed":0.000,"eps":21.47,"mode":3}
@@ -273,7 +273,7 @@ $GPGSA,A,3,01,05,06,07,10,16,21,23,24,30,31,,1.3,0.8,1.0*3F
$GPGSV,3,1,11,01,06,230,34,05,16,114,44,06,65,063,48,07,72,061,46*77
$GPGSV,3,2,11,10,09,057,39,16,35,295,48,21,44,152,53,23,12,316,51*7A
$GPGSV,3,3,11,24,51,097,54,30,32,110,50,31,60,229,44*4E
-{"class":"SKY","tag":"GSV","vdop":1.00,"hdop":0.80,"pdop":1.30,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":true},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":229,"ss":44,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.49,"ydop":0.70,"vdop":1.00,"tdop":0.63,"hdop":0.80,"gdop":1.46,"pdop":1.30,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":true},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":50,"used":true},{"PRN":31,"el":60,"az":229,"ss":44,"used":true}]}
$GPRMC,143818.78,A,4806.3728,N,00138.6239,W,1.56,266.1,121007,2.6,W,A*0D
$GPGGA,143818.78,4806.3728,N,00138.6239,W,1,10,1.3,41.5,M,48.5,M,,*4C
{"class":"TPV","tag":"GGA","time":1192199898.780,"ept":0.005,"lat":48.106213333,"lon":-1.643731667,"alt":41.500,"epx":7.317,"epy":10.425,"epv":23.000,"track":266.1000,"speed":0.803,"eps":21.16,"mode":3}
@@ -282,7 +282,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.9,1.3,1.3*3D
$GPGSV,3,1,11,01,06,230,34,05,16,114,44,06,65,063,48,07,72,061,46*77
$GPGSV,3,2,11,10,09,057,42,16,35,295,47,21,44,152,52,23,12,316,51*78
$GPGSV,3,3,11,24,51,097,54,30,32,110,51,31,60,229,46*4D
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.30,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":42,"used":true},{"PRN":16,"el":35,"az":295,"ss":47,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.30,"tdop":0.63,"hdop":1.30,"gdop":1.54,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":42,"used":true},{"PRN":16,"el":35,"az":295,"ss":47,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
$GPRMC,143819.79,A,4806.3729,N,00138.6247,W,0.00,266.1,121007,2.6,W,A*07
$GPGGA,143819.79,4806.3729,N,00138.6247,W,1,10,1.1,41.4,M,48.5,M,,*47
{"class":"TPV","tag":"GGA","time":1192199899.790,"ept":0.005,"lat":48.106215000,"lon":-1.643745000,"alt":41.400,"epx":7.830,"epy":10.734,"epv":29.900,"track":266.1000,"speed":0.000,"eps":20.95,"mode":3}
@@ -291,7 +291,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,00,05,16,114,44,06,65,063,48,07,72,061,46*70
$GPGSV,3,2,11,10,09,057,39,16,35,295,49,21,44,152,52,23,12,316,51*7A
$GPGSV,3,3,11,24,51,097,54,30,32,110,52,31,60,229,48*40
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":0,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":49,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":0,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":49,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
$GPRMC,143820.79,A,4806.3730,N,00138.6251,W,0.00,266.1,121007,2.6,W,A*02
$GPGGA,143820.79,4806.3730,N,00138.6251,W,1,10,1.2,41.4,M,48.5,M,,*41
{"class":"TPV","tag":"GGA","time":1192199900.790,"ept":0.005,"lat":48.106216667,"lon":-1.643751667,"alt":41.400,"epx":7.830,"epy":10.734,"epv":27.600,"track":266.1000,"speed":0.000,"eps":21.47,"mode":3}
@@ -300,7 +300,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.9,1.2,1.5*3A
$GPGSV,3,1,11,01,06,230,20,05,16,114,44,06,65,063,48,07,72,061,45*71
$GPGSV,3,2,11,10,09,057,40,16,35,295,50,21,44,152,53,23,12,316,51*7D
$GPGSV,3,3,11,24,51,097,54,30,32,110,52,31,60,229,47*4F
-{"class":"SKY","tag":"GSV","vdop":1.50,"hdop":1.20,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":20,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":45,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":50,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.50,"tdop":0.63,"hdop":1.20,"gdop":1.54,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":20,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":45,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":50,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
$GPRMC,143821.79,A,4806.3732,N,00138.6265,W,2.31,266.8,121007,2.6,W,A*0F
$GPGGA,143821.79,4806.3732,N,00138.6265,W,1,10,1.2,41.4,M,48.5,M,,*45
{"class":"TPV","tag":"GGA","time":1192199901.790,"ept":0.005,"lat":48.106220000,"lon":-1.643775000,"alt":41.400,"epx":7.830,"epy":10.734,"epv":34.500,"track":266.8000,"speed":1.188,"eps":21.47,"mode":3}
@@ -309,7 +309,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.9,1.2,1.5*3A
$GPGSV,3,1,11,01,06,230,34,05,16,114,45,06,65,063,48,07,72,061,46*76
$GPGSV,3,2,11,10,09,057,40,16,35,295,50,21,44,152,53,23,12,316,51*7D
$GPGSV,3,3,11,24,51,097,54,30,32,110,52,31,60,229,46*4E
-{"class":"SKY","tag":"GSV","vdop":1.50,"hdop":1.20,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":50,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.50,"tdop":0.63,"hdop":1.20,"gdop":1.54,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":50,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
$GPRMC,143822.79,A,4806.3731,N,00138.6276,W,2.58,266.3,121007,2.6,W,A*09
$GPGGA,143822.79,4806.3731,N,00138.6276,W,1,10,1.2,41.4,M,48.5,M,,*47
{"class":"TPV","tag":"GGA","time":1192199902.790,"ept":0.005,"lat":48.106218333,"lon":-1.643793333,"alt":41.400,"epx":7.830,"epy":10.734,"epv":34.500,"track":266.3000,"speed":1.327,"eps":21.47,"mode":3}
@@ -317,7 +317,7 @@ $PFST,FOM,2*67
$GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.2,1.3*32
$GPGSV,3,2,11,10,09,057,39,16,35,295,50,21,44,152,53,23,12,316,51*73
$GPGSV,3,3,11,24,51,097,54,30,32,110,52,31,60,229,45*4D
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.20,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":50,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":50,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":45,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.30,"tdop":0.63,"hdop":1.20,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":50,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":50,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":45,"used":true}]}
$GPRMC,143823.79,A,4806.3728,N,00138.6293,W,2.82,266.9,121007,2.6,W,A*06
$GPGGA,143823.79,4806.3728,N,00138.6293,W,1,10,1.1,41.4,M,48.5,M,,*46
{"class":"TPV","tag":"GGA","time":1192199903.790,"ept":0.005,"lat":48.106213333,"lon":-1.643821667,"alt":41.400,"epx":7.830,"epy":10.734,"epv":29.900,"track":266.9000,"speed":1.451,"eps":21.47,"mode":3}
@@ -326,7 +326,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,17,05,16,114,45,06,65,063,49,07,72,061,47*77
$GPGSV,3,2,11,10,09,057,42,16,35,295,49,21,44,152,52,23,12,316,51*76
$GPGSV,3,3,11,24,51,097,54,30,32,110,52,31,60,229,46*4E
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":17,"used":false},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":42,"used":true},{"PRN":16,"el":35,"az":295,"ss":49,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":17,"used":false},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":42,"used":true},{"PRN":16,"el":35,"az":295,"ss":49,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
$GPRMC,143824.79,A,4806.3727,N,00138.6306,W,3.10,266.8,121007,2.6,W,A*08
$GPGGA,143824.79,4806.3727,N,00138.6306,W,1,10,1.1,41.4,M,48.5,M,,*43
{"class":"TPV","tag":"GGA","time":1192199904.790,"ept":0.005,"lat":48.106211667,"lon":-1.643843333,"alt":41.400,"epx":7.830,"epy":10.734,"epv":27.600,"track":266.8000,"speed":1.595,"eps":21.47,"mode":3}
@@ -335,7 +335,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,34,05,16,114,44,06,65,063,49,07,72,061,46*76
$GPGSV,3,2,11,10,09,057,42,16,35,295,50,21,44,152,52,23,12,316,50*7F
$GPGSV,3,3,11,24,51,097,55,30,32,110,51,31,60,229,47*4D
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":42,"used":true},{"PRN":16,"el":35,"az":295,"ss":50,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":50,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":42,"used":true},{"PRN":16,"el":35,"az":295,"ss":50,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":50,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
$GPRMC,143825.79,A,4806.3725,N,00138.6321,W,3.34,267.0,121007,2.6,W,A*01
$GPGGA,143825.79,4806.3725,N,00138.6321,W,1,10,0.9,41.4,M,48.5,M,,*4C
{"class":"TPV","tag":"GGA","time":1192199905.790,"ept":0.005,"lat":48.106208333,"lon":-1.643868333,"alt":41.400,"epx":7.830,"epy":10.734,"epv":27.600,"track":267.0000,"speed":1.718,"eps":21.47,"mode":3}
@@ -344,7 +344,7 @@ $GPGSA,A,3,01,06,07,10,16,21,23,24,30,31,,,1.4,0.9,1.1*3D
$GPGSV,3,1,11,01,06,230,35,05,16,114,45,06,65,063,48,07,72,061,48*79
$GPGSV,3,2,11,10,09,057,43,16,35,295,48,21,44,152,52,23,12,316,51*76
$GPGSV,3,3,11,24,51,097,55,30,32,110,53,31,60,229,46*4E
-{"class":"SKY","tag":"GSV","vdop":1.10,"hdop":0.90,"pdop":1.40,"satellites":[{"PRN":1,"el":6,"az":230,"ss":35,"used":true},{"PRN":5,"el":16,"az":114,"ss":45,"used":false},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":48,"used":true},{"PRN":10,"el":9,"az":57,"ss":43,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":53,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.10,"tdop":0.63,"hdop":0.90,"gdop":1.54,"pdop":1.40,"satellites":[{"PRN":1,"el":6,"az":230,"ss":35,"used":true},{"PRN":5,"el":16,"az":114,"ss":45,"used":false},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":48,"used":true},{"PRN":10,"el":9,"az":57,"ss":43,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":51,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":53,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
$GPRMC,143826.79,A,4806.3724,N,00138.6335,W,3.61,266.8,121007,2.6,W,A*0F
$GPGGA,143826.79,4806.3724,N,00138.6335,W,1,10,1.1,41.4,M,48.5,M,,*42
{"class":"TPV","tag":"GGA","time":1192199906.790,"ept":0.005,"lat":48.106206667,"lon":-1.643891667,"alt":41.400,"epx":7.830,"epy":10.734,"epv":25.300,"track":266.8000,"speed":1.857,"eps":21.47,"mode":3}
@@ -353,7 +353,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,38,05,16,114,46,06,65,063,49,07,72,061,47*79
$GPGSV,3,2,11,10,09,057,42,16,35,295,49,21,44,152,53,23,12,316,50*76
$GPGSV,3,3,11,24,51,097,55,30,32,110,52,31,60,229,46*4F
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":38,"used":false},{"PRN":5,"el":16,"az":114,"ss":46,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":42,"used":true},{"PRN":16,"el":35,"az":295,"ss":49,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":50,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":38,"used":false},{"PRN":5,"el":16,"az":114,"ss":46,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":42,"used":true},{"PRN":16,"el":35,"az":295,"ss":49,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":50,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":46,"used":true}]}
$GPRMC,143827.79,A,4806.3724,N,00138.6352,W,3.85,267.0,121007,2.6,W,A*0C
$GPGGA,143827.79,4806.3724,N,00138.6352,W,1,10,1.1,41.4,M,48.5,M,,*42
{"class":"TPV","tag":"GGA","time":1192199907.790,"ept":0.005,"lat":48.106206667,"lon":-1.643920000,"alt":41.400,"epx":7.830,"epy":10.734,"epv":27.600,"track":267.0000,"speed":1.981,"eps":21.47,"mode":3}
@@ -362,7 +362,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,37,05,16,114,46,06,65,063,49,07,72,061,46*77
$GPGSV,3,2,11,10,09,057,43,16,35,295,49,21,44,152,52,23,12,316,49*7E
$GPGSV,3,3,11,24,51,097,55,30,32,110,52,31,60,229,47*4E
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":37,"used":false},{"PRN":5,"el":16,"az":114,"ss":46,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":43,"used":true},{"PRN":16,"el":35,"az":295,"ss":49,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":49,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":37,"used":false},{"PRN":5,"el":16,"az":114,"ss":46,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":43,"used":true},{"PRN":16,"el":35,"az":295,"ss":49,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":49,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
$GPRMC,143828.79,A,4806.3725,N,00138.6368,W,4.12,266.8,121007,2.6,W,A*0B
$GPGGA,143828.79,4806.3725,N,00138.6368,W,1,11,0.8,41.4,M,48.5,M,,*4C
{"class":"TPV","tag":"GGA","time":1192199908.790,"ept":0.005,"lat":48.106208333,"lon":-1.643946667,"alt":41.400,"epx":7.830,"epy":10.734,"epv":27.600,"track":266.8000,"speed":2.120,"eps":21.47,"mode":3}
@@ -371,7 +371,7 @@ $GPGSA,A,3,01,05,06,07,10,16,21,23,24,30,31,,1.3,0.8,1.0*3F
$GPGSV,3,1,11,01,06,230,36,05,16,114,46,06,65,063,49,07,72,061,48*78
$GPGSV,3,2,11,10,09,057,42,16,35,295,49,21,44,152,51,23,12,316,49*7C
$GPGSV,3,3,11,24,51,097,55,30,32,110,53,31,60,229,47*4F
-{"class":"SKY","tag":"GSV","vdop":1.00,"hdop":0.80,"pdop":1.30,"satellites":[{"PRN":1,"el":6,"az":230,"ss":36,"used":true},{"PRN":5,"el":16,"az":114,"ss":46,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":48,"used":true},{"PRN":10,"el":9,"az":57,"ss":42,"used":true},{"PRN":16,"el":35,"az":295,"ss":49,"used":true},{"PRN":21,"el":44,"az":152,"ss":51,"used":true},{"PRN":23,"el":12,"az":316,"ss":49,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":53,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.49,"ydop":0.70,"vdop":1.00,"tdop":0.63,"hdop":0.80,"gdop":1.46,"pdop":1.30,"satellites":[{"PRN":1,"el":6,"az":230,"ss":36,"used":true},{"PRN":5,"el":16,"az":114,"ss":46,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":48,"used":true},{"PRN":10,"el":9,"az":57,"ss":42,"used":true},{"PRN":16,"el":35,"az":295,"ss":49,"used":true},{"PRN":21,"el":44,"az":152,"ss":51,"used":true},{"PRN":23,"el":12,"az":316,"ss":49,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":53,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
$GPRMC,143829.79,A,4806.3724,N,00138.6386,W,4.39,266.7,121007,2.6,W,A*0D
$GPGGA,143829.79,4806.3724,N,00138.6386,W,1,10,1.1,41.4,M,48.5,M,,*45
{"class":"TPV","tag":"GGA","time":1192199909.790,"ept":0.005,"lat":48.106206667,"lon":-1.643976667,"alt":41.400,"epx":7.317,"epy":10.425,"epv":23.000,"track":266.7000,"speed":2.258,"eps":21.16,"mode":3}
@@ -380,7 +380,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,35,05,16,114,45,06,65,063,49,07,72,061,47*77
$GPGSV,3,2,11,10,09,057,40,16,35,295,48,21,44,152,52,23,12,316,50*74
$GPGSV,3,3,11,24,51,097,54,30,32,110,51,31,60,229,47*4C
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":35,"used":false},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":50,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":35,"used":false},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":49,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":50,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
$GPRMC,143830.79,A,4806.3723,N,00138.6405,W,4.66,266.3,121007,2.6,W,A*00
$GPGGA,143830.79,4806.3723,N,00138.6405,W,1,10,1.1,41.4,M,48.5,M,,*46
{"class":"TPV","tag":"GGA","time":1192199910.790,"ept":0.005,"lat":48.106205000,"lon":-1.644008333,"alt":41.400,"epx":7.830,"epy":10.734,"epv":27.600,"track":266.3000,"speed":2.397,"eps":21.16,"mode":3}
@@ -389,7 +389,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,37,05,16,114,45,06,65,063,48,07,72,061,48*7B
$GPGSV,3,2,11,10,09,057,41,16,35,295,47,21,44,152,53,23,12,316,46*7C
$GPGSV,3,3,11,24,51,097,55,30,32,110,51,31,60,229,47*4D
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":37,"used":false},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":48,"used":true},{"PRN":10,"el":9,"az":57,"ss":41,"used":true},{"PRN":16,"el":35,"az":295,"ss":47,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":46,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":37,"used":false},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":48,"used":true},{"PRN":10,"el":9,"az":57,"ss":41,"used":true},{"PRN":16,"el":35,"az":295,"ss":47,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":46,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
$GPRMC,143831.79,A,4806.3723,N,00138.6424,W,4.91,266.5,121007,2.6,W,A*0C
$GPGGA,143831.79,4806.3723,N,00138.6424,W,1,10,1.3,41.4,M,48.5,M,,*46
{"class":"TPV","tag":"GGA","time":1192199911.790,"ept":0.005,"lat":48.106205000,"lon":-1.644040000,"alt":41.400,"epx":7.830,"epy":10.734,"epv":27.600,"track":266.5000,"speed":2.526,"eps":21.47,"mode":3}
@@ -398,7 +398,7 @@ $GPGSA,A,3,01,05,06,07,16,21,23,24,30,31,,,1.9,1.3,1.4*3A
$GPGSV,3,1,11,01,06,230,38,05,16,114,45,06,65,063,48,07,72,061,47*7B
$GPGSV,3,2,11,10,09,057,38,16,35,295,46,21,44,152,53,23,12,316,43*76
$GPGSV,3,3,11,24,51,097,55,30,32,110,51,31,60,229,47*4D
-{"class":"SKY","tag":"GSV","vdop":1.40,"hdop":1.30,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":38,"used":true},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":false},{"PRN":16,"el":35,"az":295,"ss":46,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":43,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.40,"tdop":0.63,"hdop":1.30,"gdop":1.54,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":38,"used":true},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":false},{"PRN":16,"el":35,"az":295,"ss":46,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":43,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
$GPRMC,143832.79,A,4806.3723,N,00138.6444,W,5.05,266.3,121007,2.6,W,A*03
$GPGGA,143832.79,4806.3723,N,00138.6444,W,1,10,1.4,41.4,M,48.5,M,,*44
{"class":"TPV","tag":"GGA","time":1192199912.790,"ept":0.005,"lat":48.106205000,"lon":-1.644073333,"alt":41.400,"epx":7.830,"epy":10.734,"epv":32.200,"track":266.3000,"speed":2.598,"eps":21.47,"mode":3}
@@ -407,7 +407,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,2.0,1.4,1.4*37
$GPGSV,3,1,11,01,06,230,37,05,16,114,44,06,65,063,48,07,72,061,48*7A
$GPGSV,3,2,11,10,09,057,37,16,35,295,47,21,44,152,53,23,12,316,44*7F
$GPGSV,3,3,11,24,51,097,55,30,32,110,52,31,60,229,47*4E
-{"class":"SKY","tag":"GSV","vdop":1.40,"hdop":1.40,"pdop":2.00,"satellites":[{"PRN":1,"el":6,"az":230,"ss":37,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":48,"used":true},{"PRN":10,"el":9,"az":57,"ss":37,"used":true},{"PRN":16,"el":35,"az":295,"ss":47,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":44,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.40,"tdop":0.63,"hdop":1.40,"gdop":1.54,"pdop":2.00,"satellites":[{"PRN":1,"el":6,"az":230,"ss":37,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":48,"used":true},{"PRN":10,"el":9,"az":57,"ss":37,"used":true},{"PRN":16,"el":35,"az":295,"ss":47,"used":true},{"PRN":21,"el":44,"az":152,"ss":53,"used":true},{"PRN":23,"el":12,"az":316,"ss":44,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
$GPRMC,143833.79,A,4806.3721,N,00138.6464,W,5.13,265.8,121007,2.6,W,A*0D
$GPGGA,143833.79,4806.3721,N,00138.6464,W,1,09,1.3,41.4,M,48.5,M,,*4A
{"class":"TPV","tag":"GGA","time":1192199913.790,"ept":0.005,"lat":48.106201667,"lon":-1.644106667,"alt":41.400,"epx":7.830,"epy":10.734,"epv":32.200,"track":265.8000,"speed":2.639,"eps":21.47,"mode":3}
@@ -416,7 +416,7 @@ $GPGSA,A,3,05,06,07,16,21,23,24,30,31,,,,1.9,1.3,1.3*3C
$GPGSV,3,1,11,01,06,230,38,05,16,114,43,06,65,063,48,07,72,061,48*72
$GPGSV,3,2,11,10,09,057,38,16,35,295,48,21,44,152,52,23,12,316,46*7C
$GPGSV,3,3,11,24,51,097,55,30,32,110,52,31,60,229,47*4E
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.30,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":38,"used":false},{"PRN":5,"el":16,"az":114,"ss":43,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":48,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":46,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.73,"vdop":1.30,"tdop":0.64,"hdop":1.30,"gdop":1.56,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":38,"used":false},{"PRN":5,"el":16,"az":114,"ss":43,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":48,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":false},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":46,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
$GPRMC,143834.80,A,4806.3719,N,00138.6484,W,5.21,266.1,121007,2.6,W,A*02
$GPGGA,143834.80,4806.3719,N,00138.6484,W,1,09,1.5,41.3,M,48.5,M,,*4F
{"class":"TPV","tag":"GGA","time":1192199914.800,"ept":0.005,"lat":48.106198333,"lon":-1.644140000,"alt":41.300,"epx":8.203,"epy":10.876,"epv":29.900,"track":266.1000,"speed":2.680,"eps":21.40,"mode":3}
@@ -425,7 +425,7 @@ $GPGSA,A,3,05,06,07,16,21,23,24,30,31,,,,2.3,1.5,1.8*38
$GPGSV,3,1,11,01,06,230,36,05,16,114,44,06,65,063,48,07,72,061,48*7B
$GPGSV,3,2,11,10,09,057,38,16,35,295,47,21,44,152,52,23,12,316,43*76
$GPGSV,3,3,11,24,51,097,55,30,32,110,53,31,60,229,48*40
-{"class":"SKY","tag":"GSV","vdop":1.80,"hdop":1.50,"pdop":2.30,"satellites":[{"PRN":1,"el":6,"az":230,"ss":36,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":48,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":false},{"PRN":16,"el":35,"az":295,"ss":47,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":43,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":53,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.73,"vdop":1.80,"tdop":0.64,"hdop":1.50,"gdop":1.56,"pdop":2.30,"satellites":[{"PRN":1,"el":6,"az":230,"ss":36,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":48,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":false},{"PRN":16,"el":35,"az":295,"ss":47,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":43,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":53,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
$GPRMC,143835.80,A,4806.3719,N,00138.6509,W,5.31,265.1,121007,2.6,W,A*05
$GPGGA,143835.80,4806.3719,N,00138.6509,W,1,10,1.1,41.3,M,48.5,M,,*46
{"class":"TPV","tag":"GGA","time":1192199915.800,"ept":0.005,"lat":48.106198333,"lon":-1.644181667,"alt":41.300,"epx":8.203,"epy":10.876,"epv":41.400,"track":265.1000,"speed":2.732,"eps":21.75,"mode":3}
@@ -434,7 +434,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,36,05,16,114,42,06,65,063,48,07,72,061,48*7D
$GPGSV,3,2,11,10,09,057,39,16,35,295,47,21,44,152,52,23,12,316,48*7C
$GPGSV,3,3,11,24,51,097,55,30,32,110,53,31,60,229,47*4F
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":36,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":48,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":47,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":48,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":53,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":36,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":48,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":47,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":48,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":53,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
$GPRMC,143836.80,A,4806.3718,N,00138.6527,W,5.42,264.6,121007,2.6,W,A*09
$GPGGA,143836.80,4806.3718,N,00138.6527,W,1,10,1.2,41.4,M,48.5,M,,*4C
{"class":"TPV","tag":"GGA","time":1192199916.800,"ept":0.005,"lat":48.106196667,"lon":-1.644211667,"alt":41.400,"epx":7.830,"epy":10.734,"epv":27.600,"track":264.6000,"speed":2.788,"eps":21.61,"mode":3}
@@ -443,7 +443,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.9,1.2,1.5*3A
$GPGSV,3,1,11,01,06,230,34,05,16,114,42,06,65,063,48,07,72,061,48*7F
$GPGSV,3,2,11,10,09,057,38,16,35,295,47,21,44,152,52,23,12,316,45*70
$GPGSV,3,3,11,24,51,097,55,30,32,110,53,31,60,229,47*4F
-{"class":"SKY","tag":"GSV","vdop":1.50,"hdop":1.20,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":48,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":true},{"PRN":16,"el":35,"az":295,"ss":47,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":45,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":53,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.50,"tdop":0.63,"hdop":1.20,"gdop":1.54,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":42,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":48,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":true},{"PRN":16,"el":35,"az":295,"ss":47,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":45,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":53,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
$GPRMC,143837.80,A,4806.3716,N,00138.6546,W,5.53,264.3,121007,2.6,W,A*04
$GPGGA,143837.80,4806.3716,N,00138.6546,W,1,10,1.3,41.4,M,48.5,M,,*45
{"class":"TPV","tag":"GGA","time":1192199917.800,"ept":0.005,"lat":48.106193333,"lon":-1.644243333,"alt":41.400,"epx":7.830,"epy":10.734,"epv":34.500,"track":264.3000,"speed":2.845,"eps":21.47,"mode":3}
@@ -452,7 +452,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.9,1.3,1.3*3D
$GPGSV,3,1,11,01,06,230,34,05,16,114,46,06,65,063,47,07,72,061,47*7B
$GPGSV,3,2,11,10,09,057,37,16,35,295,48,21,44,152,52,23,12,316,44*71
$GPGSV,3,3,11,24,51,097,55,30,32,110,53,31,60,229,47*4F
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.30,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":46,"used":true},{"PRN":6,"el":65,"az":63,"ss":47,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":37,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":44,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":53,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.30,"tdop":0.63,"hdop":1.30,"gdop":1.54,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":46,"used":true},{"PRN":6,"el":65,"az":63,"ss":47,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":37,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":44,"used":true},{"PRN":24,"el":51,"az":97,"ss":55,"used":true},{"PRN":30,"el":32,"az":110,"ss":53,"used":true},{"PRN":31,"el":60,"az":229,"ss":47,"used":true}]}
$GPRMC,143838.80,A,4806.3716,N,00138.6569,W,5.64,264.4,121007,2.6,W,A*05
$GPGGA,143838.80,4806.3716,N,00138.6569,W,1,10,1.1,41.4,M,48.5,M,,*45
{"class":"TPV","tag":"GGA","time":1192199918.800,"ept":0.005,"lat":48.106193333,"lon":-1.644281667,"alt":41.400,"epx":7.830,"epy":10.734,"epv":29.900,"track":264.4000,"speed":2.901,"eps":21.47,"mode":3}
@@ -461,7 +461,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,00,05,16,114,47,06,65,063,47,07,72,061,47*7D
$GPGSV,3,2,11,10,09,057,38,16,35,295,48,21,44,152,52,23,12,316,47*7D
$GPGSV,3,3,11,24,51,097,54,30,32,110,52,31,60,229,48*40
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":0,"used":false},{"PRN":5,"el":16,"az":114,"ss":47,"used":true},{"PRN":6,"el":65,"az":63,"ss":47,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":47,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":0,"used":false},{"PRN":5,"el":16,"az":114,"ss":47,"used":true},{"PRN":6,"el":65,"az":63,"ss":47,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":47,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
$GPRMC,143839.80,A,4806.3715,N,00138.6593,W,5.74,264.1,121007,2.6,W,A*06
$GPGGA,143839.80,4806.3715,N,00138.6593,W,1,09,1.3,41.5,M,48.5,M,,*49
{"class":"TPV","tag":"GGA","time":1192199919.800,"ept":0.005,"lat":48.106191667,"lon":-1.644321667,"alt":41.500,"epx":7.830,"epy":10.734,"epv":27.600,"track":264.1000,"speed":2.953,"eps":21.47,"mode":3}
@@ -470,7 +470,7 @@ $GPGSA,A,3,05,06,07,16,21,23,24,30,31,,,,1.9,1.3,1.3*3C
$GPGSV,3,1,11,01,06,230,12,05,16,114,46,06,65,063,48,07,72,061,47*70
$GPGSV,3,2,11,10,09,057,35,16,35,295,47,21,44,152,52,23,12,316,48*70
$GPGSV,3,3,11,24,51,097,54,30,32,110,53,31,60,229,48*41
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.30,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":12,"used":false},{"PRN":5,"el":16,"az":114,"ss":46,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":35,"used":false},{"PRN":16,"el":35,"az":295,"ss":47,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":48,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":53,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.73,"vdop":1.30,"tdop":0.64,"hdop":1.30,"gdop":1.56,"pdop":1.90,"satellites":[{"PRN":1,"el":6,"az":230,"ss":12,"used":false},{"PRN":5,"el":16,"az":114,"ss":46,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":35,"used":false},{"PRN":16,"el":35,"az":295,"ss":47,"used":true},{"PRN":21,"el":44,"az":152,"ss":52,"used":true},{"PRN":23,"el":12,"az":316,"ss":48,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":53,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
$GPRMC,143840.80,A,4806.3715,N,00138.6618,W,5.91,263.8,121007,2.6,W,A*0D
$GPGGA,143840.80,4806.3715,N,00138.6618,W,1,10,1.4,41.4,M,48.5,M,,*49
{"class":"TPV","tag":"GGA","time":1192199920.800,"ept":0.005,"lat":48.106191667,"lon":-1.644363333,"alt":41.400,"epx":8.203,"epy":10.876,"epv":29.900,"track":263.8000,"speed":3.040,"eps":21.61,"mode":3}
@@ -479,7 +479,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,2.1,1.4,1.5*37
$GPGSV,3,1,11,01,06,230,31,05,16,114,46,06,65,063,47,07,72,061,47*7E
$GPGSV,3,2,11,10,09,057,38,16,35,295,48,21,44,152,51,23,12,316,48*71
$GPGSV,3,3,11,24,51,097,54,30,32,110,53,31,60,229,48*41
-{"class":"SKY","tag":"GSV","vdop":1.50,"hdop":1.40,"pdop":2.10,"satellites":[{"PRN":1,"el":6,"az":230,"ss":31,"used":false},{"PRN":5,"el":16,"az":114,"ss":46,"used":true},{"PRN":6,"el":65,"az":63,"ss":47,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":51,"used":true},{"PRN":23,"el":12,"az":316,"ss":48,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":53,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.50,"tdop":0.63,"hdop":1.40,"gdop":1.54,"pdop":2.10,"satellites":[{"PRN":1,"el":6,"az":230,"ss":31,"used":false},{"PRN":5,"el":16,"az":114,"ss":46,"used":true},{"PRN":6,"el":65,"az":63,"ss":47,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":51,"used":true},{"PRN":23,"el":12,"az":316,"ss":48,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":53,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
$GPRMC,143841.80,A,4806.3713,N,00138.6642,W,6.07,263.1,121007,2.6,W,A*00
$GPGGA,143841.80,4806.3713,N,00138.6642,W,1,10,1.6,41.5,M,48.5,M,,*42
{"class":"TPV","tag":"GGA","time":1192199921.800,"ept":0.005,"lat":48.106188333,"lon":-1.644403333,"alt":41.500,"epx":7.830,"epy":10.734,"epv":34.500,"track":263.1000,"speed":3.123,"eps":21.61,"mode":3}
@@ -488,7 +488,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,2.5,1.6,1.9*3D
$GPGSV,3,1,11,01,06,230,32,05,16,114,47,06,65,063,47,07,72,061,46*7D
$GPGSV,3,2,11,10,09,057,41,16,35,295,49,21,44,152,50,23,12,316,48*7F
$GPGSV,3,3,11,24,51,097,54,30,32,110,52,31,60,229,48*40
-{"class":"SKY","tag":"GSV","vdop":1.90,"hdop":1.60,"pdop":2.50,"satellites":[{"PRN":1,"el":6,"az":230,"ss":32,"used":false},{"PRN":5,"el":16,"az":114,"ss":47,"used":true},{"PRN":6,"el":65,"az":63,"ss":47,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":41,"used":true},{"PRN":16,"el":35,"az":295,"ss":49,"used":true},{"PRN":21,"el":44,"az":152,"ss":50,"used":true},{"PRN":23,"el":12,"az":316,"ss":48,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.90,"tdop":0.63,"hdop":1.60,"gdop":1.54,"pdop":2.50,"satellites":[{"PRN":1,"el":6,"az":230,"ss":32,"used":false},{"PRN":5,"el":16,"az":114,"ss":47,"used":true},{"PRN":6,"el":65,"az":63,"ss":47,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":41,"used":true},{"PRN":16,"el":35,"az":295,"ss":49,"used":true},{"PRN":21,"el":44,"az":152,"ss":50,"used":true},{"PRN":23,"el":12,"az":316,"ss":48,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
$GPRMC,143842.80,A,4806.3713,N,00138.6667,W,6.33,262.2,121007,2.6,W,A*01
$GPGGA,143842.80,4806.3713,N,00138.6667,W,1,10,1.1,41.5,M,48.5,M,,*41
{"class":"TPV","tag":"GGA","time":1192199922.800,"ept":0.005,"lat":48.106188333,"lon":-1.644445000,"alt":41.500,"epx":7.830,"epy":10.734,"epv":43.700,"track":262.2000,"speed":3.256,"eps":21.47,"mode":3}
@@ -497,7 +497,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,32,05,16,114,45,06,65,063,47,07,72,061,46*7F
$GPGSV,3,2,11,10,09,057,39,16,35,295,48,21,44,152,51,23,12,316,48*70
$GPGSV,3,3,11,24,51,097,54,30,32,110,52,31,60,229,48*40
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":32,"used":false},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":47,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":51,"used":true},{"PRN":23,"el":12,"az":316,"ss":48,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":32,"used":false},{"PRN":5,"el":16,"az":114,"ss":45,"used":true},{"PRN":6,"el":65,"az":63,"ss":47,"used":true},{"PRN":7,"el":72,"az":61,"ss":46,"used":true},{"PRN":10,"el":9,"az":57,"ss":39,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":51,"used":true},{"PRN":23,"el":12,"az":316,"ss":48,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":52,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
$GPRMC,143843.80,A,4806.3711,N,00138.6694,W,6.52,261.1,121007,2.6,W,A*09
$GPGGA,143843.80,4806.3711,N,00138.6694,W,1,10,1.1,41.5,M,48.5,M,,*4E
{"class":"TPV","tag":"GGA","time":1192199923.800,"ept":0.005,"lat":48.106185000,"lon":-1.644490000,"alt":41.500,"epx":7.830,"epy":10.734,"epv":27.600,"track":261.1000,"speed":3.354,"eps":21.47,"mode":3}
@@ -506,7 +506,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,34,05,16,114,44,06,65,063,47,07,72,061,47*79
$GPGSV,3,2,11,10,09,057,38,16,35,295,48,21,44,152,50,23,12,316,48*70
$GPGSV,3,3,11,24,51,097,54,30,32,110,51,31,60,229,49*42
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":47,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":50,"used":true},{"PRN":23,"el":12,"az":316,"ss":48,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":49,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":34,"used":false},{"PRN":5,"el":16,"az":114,"ss":44,"used":true},{"PRN":6,"el":65,"az":63,"ss":47,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":38,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":50,"used":true},{"PRN":23,"el":12,"az":316,"ss":48,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":49,"used":true}]}
$GPRMC,143844.80,A,4806.3707,N,00138.6723,W,6.72,261.3,121007,2.6,W,A*04
$GPGGA,143844.80,4806.3707,N,00138.6723,W,1,10,1.1,41.6,M,48.5,M,,*40
{"class":"TPV","tag":"GGA","time":1192199924.800,"ept":0.005,"lat":48.106178333,"lon":-1.644538333,"alt":41.600,"epx":7.830,"epy":10.734,"epv":27.600,"track":261.3000,"speed":3.457,"eps":21.47,"mode":3}
@@ -515,7 +515,7 @@ $GPGSA,A,3,05,06,07,10,16,21,23,24,30,31,,,1.7,1.1,1.2*30
$GPGSV,3,1,11,01,06,230,33,05,16,114,48,06,65,063,48,07,72,061,47*7D
$GPGSV,3,2,11,10,09,057,40,16,35,295,48,21,44,152,50,23,12,316,47*70
$GPGSV,3,3,11,24,51,097,54,30,32,110,51,31,60,229,48*43
-{"class":"SKY","tag":"GSV","vdop":1.20,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":33,"used":false},{"PRN":5,"el":16,"az":114,"ss":48,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":50,"used":true},{"PRN":23,"el":12,"az":316,"ss":47,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.52,"ydop":0.72,"vdop":1.20,"tdop":0.63,"hdop":1.10,"gdop":1.54,"pdop":1.70,"satellites":[{"PRN":1,"el":6,"az":230,"ss":33,"used":false},{"PRN":5,"el":16,"az":114,"ss":48,"used":true},{"PRN":6,"el":65,"az":63,"ss":48,"used":true},{"PRN":7,"el":72,"az":61,"ss":47,"used":true},{"PRN":10,"el":9,"az":57,"ss":40,"used":true},{"PRN":16,"el":35,"az":295,"ss":48,"used":true},{"PRN":21,"el":44,"az":152,"ss":50,"used":true},{"PRN":23,"el":12,"az":316,"ss":47,"used":true},{"PRN":24,"el":51,"az":97,"ss":54,"used":true},{"PRN":30,"el":32,"az":110,"ss":51,"used":true},{"PRN":31,"el":60,"az":229,"ss":48,"used":true}]}
$GPRMC,143845.80,A,4806.3705,N,00138.6753,W,6.92,261.2,121007,2.6,W,A*0F
$GPGGA,143845.80,4806.3705,N,00138.6753,W,1,10,1.1,41.7,M,48.5,M,,*45
{"class":"TPV","tag":"GGA","time":1192199925.800,"ept":0.005,"lat":48.106175000,"lon":-1.644588333,"alt":41.700,"epx":7.830,"epy":10.734,"epv":27.600,"track":261.2000,"speed":3.560,"eps":21.47,"mode":3}
diff --git a/test/daemon/eXplorist210.log.chk b/test/daemon/eXplorist210.log.chk
index 9faa02f4..9dfaa140 100644
--- a/test/daemon/eXplorist210.log.chk
+++ b/test/daemon/eXplorist210.log.chk
@@ -30,11 +30,11 @@ $GPGSA,A,3,26,05,22,09,18,,,,,,,,05.1,02.6,04.4*03
$GPGSV,3,1,10,09,78,288,39,17,38,071,,05,34,230,45,26,33,163,39*77
$GPGSV,3,2,10,29,26,162,,18,24,255,42,22,24,298,44,28,10,056,*75
$GPGSV,3,3,10,14,09,319,,11,03,016,,136,27,157,,124,28,162,*71
-{"class":"SKY","tag":"GSV","vdop":4.40,"hdop":2.60,"pdop":5.10,"satellites":[{"PRN":9,"el":78,"az":288,"ss":39,"used":true},{"PRN":17,"el":38,"az":71,"ss":0,"used":false},{"PRN":5,"el":34,"az":230,"ss":45,"used":true},{"PRN":26,"el":33,"az":163,"ss":39,"used":true},{"PRN":29,"el":26,"az":162,"ss":0,"used":false},{"PRN":18,"el":24,"az":255,"ss":42,"used":true},{"PRN":22,"el":24,"az":298,"ss":44,"used":true},{"PRN":28,"el":10,"az":56,"ss":0,"used":false},{"PRN":14,"el":9,"az":319,"ss":0,"used":false},{"PRN":11,"el":3,"az":16,"ss":0,"used":false},{"PRN":136,"el":27,"az":157,"ss":0,"used":false},{"PRN":124,"el":28,"az":162,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.19,"ydop":1.62,"vdop":4.40,"tdop":3.09,"hdop":2.60,"gdop":5.43,"pdop":5.10,"satellites":[{"PRN":9,"el":78,"az":288,"ss":39,"used":true},{"PRN":17,"el":38,"az":71,"ss":0,"used":false},{"PRN":5,"el":34,"az":230,"ss":45,"used":true},{"PRN":26,"el":33,"az":163,"ss":39,"used":true},{"PRN":29,"el":26,"az":162,"ss":0,"used":false},{"PRN":18,"el":24,"az":255,"ss":42,"used":true},{"PRN":22,"el":24,"az":298,"ss":44,"used":true},{"PRN":28,"el":10,"az":56,"ss":0,"used":false},{"PRN":14,"el":9,"az":319,"ss":0,"used":false},{"PRN":11,"el":3,"az":16,"ss":0,"used":false},{"PRN":136,"el":27,"az":157,"ss":0,"used":false},{"PRN":124,"el":28,"az":162,"ss":0,"used":false}]}
$GPGLL,5313.2228,N,00634.4228,E,200620.303,A*31
$GPGGA,200620.30,5313.2228,N,00634.4228,E,1,05,2.5,00000,M,,,,*25
$GPRMC,200620.30,A,5313.2228,N,00634.4228,E,00.0,000.0,200506,00,W*53
-{"class":"TPV","tag":"RMC","time":1148155580.300,"ept":0.005,"lat":53.220380000,"lon":6.573713333,"alt":0.000,"epx":17.848,"epy":24.244,"epv":101.200,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+{"class":"TPV","tag":"RMC","time":1148155580.300,"ept":0.005,"lat":53.220380000,"lon":6.573713333,"alt":0.000,"epx":17.848,"epy":24.244,"epv":101.200,"track":0.0000,"speed":0.000,"climb":0.000,"eps":48.34,"mode":3}
$GPGSA,A,3,26,05,22,09,18,,,,,,,,05.0,02.5,04.3*06
$PMGNST,01.75,3,T,816,11.1,-00496,00*43
$GPGLL,5313.2227,N,00634.4228,E,200621.297,A*33
@@ -45,9 +45,10 @@ $GPGSA,A,3,26,05,22,09,18,,,,,,,,05.2,02.6,04.5*01
$GPGSV,3,1,10,09,78,288,38,17,38,071,,05,34,230,45,26,33,163,39*76
$GPGSV,3,2,10,29,26,162,,18,24,255,42,22,24,298,44,28,10,056,*75
$GPGSV,3,3,10,14,09,319,,11,03,016,,136,27,157,,124,28,162,*71
-{"class":"SKY","tag":"GSV","vdop":4.50,"hdop":2.60,"pdop":5.20,"satellites":[{"PRN":9,"el":78,"az":288,"ss":38,"used":true},{"PRN":17,"el":38,"az":71,"ss":0,"used":false},{"PRN":5,"el":34,"az":230,"ss":45,"used":true},{"PRN":26,"el":33,"az":163,"ss":39,"used":true},{"PRN":29,"el":26,"az":162,"ss":0,"used":false},{"PRN":18,"el":24,"az":255,"ss":42,"used":true},{"PRN":22,"el":24,"az":298,"ss":44,"used":true},{"PRN":28,"el":10,"az":56,"ss":0,"used":false},{"PRN":14,"el":9,"az":319,"ss":0,"used":false},{"PRN":11,"el":3,"az":16,"ss":0,"used":false},{"PRN":136,"el":27,"az":157,"ss":0,"used":false},{"PRN":124,"el":28,"az":162,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.19,"ydop":1.62,"vdop":4.50,"tdop":3.09,"hdop":2.60,"gdop":5.43,"pdop":5.20,"satellites":[{"PRN":9,"el":78,"az":288,"ss":38,"used":true},{"PRN":17,"el":38,"az":71,"ss":0,"used":false},{"PRN":5,"el":34,"az":230,"ss":45,"used":true},{"PRN":26,"el":33,"az":163,"ss":39,"used":true},{"PRN":29,"el":26,"az":162,"ss":0,"used":false},{"PRN":18,"el":24,"az":255,"ss":42,"used":true},{"PRN":22,"el":24,"az":298,"ss":44,"used":true},{"PRN":28,"el":10,"az":56,"ss":0,"used":false},{"PRN":14,"el":9,"az":319,"ss":0,"used":false},{"PRN":11,"el":3,"az":16,"ss":0,"used":false},{"PRN":136,"el":27,"az":157,"ss":0,"used":false},{"PRN":124,"el":28,"az":162,"ss":0,"used":false}]}
$GPGLL,5313.2227,N,00634.4228,E,200622.305,A*3A
$GPGGA,200622.31,5313.2227,N,00634.4228,E,1,05,2.5,00000,M,,,,*29
$GPRMC,200622.31,A,5313.2227,N,00634.4228,E,00.0,000.0,200506,00,W*5F
-{"class":"TPV","tag":"RMC","time":1148155582.310,"ept":0.005,"lat":53.220378333,"lon":6.573713333,"alt":0.000,"epx":17.848,"epy":24.244,"epv":103.500,"track":0.0000,"speed":0.000,"climb":0.000,"eps":9697.86,"mode":3}
+{"class":"TPV","tag":"RMC","time":1148155582.310,"ept":0.005,"lat":53.220378333,"lon":6.573713333,"alt":0.000,"epx":17.848,"epy":24.244,"epv":103.500,"track":0.0000,"speed":0.000,"climb":0.000,"eps":48.25,"mode":3}
$GPGSA,A,3,26,05,22,09,18,,,,,,,,05.0,02.5,04.3*06
+$PMGNST,01.75,3,T,816,11.1,-00495,00*40
diff --git a/test/daemon/garmin-geko201.log.chk b/test/daemon/garmin-geko201.log.chk
index cdd70acb..b5f3e645 100644
--- a/test/daemon/garmin-geko201.log.chk
+++ b/test/daemon/garmin-geko201.log.chk
@@ -7,7 +7,7 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,19,319,41,02,17,093,40,04,09,049,37,05,60,046,49*77
$GPGSV,3,2,09,06,39,195,46,09,40,115,46,14,48,286,47,25,09,307,36*71
$GPGSV,3,3,09,30,67,294,50*48
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":36,"used":true},{"PRN":30,"el":67,"az":294,"ss":50,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.85,"vdop":3.00,"tdop":0.85,"hdop":2.00,"gdop":1.89,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":36,"used":true},{"PRN":30,"el":67,"az":294,"ss":50,"used":true}]}
$GPGLL,4023.8600,N,00339.1630,W,214350,V,S*57
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
@@ -20,9 +20,9 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,19,319,41,02,17,093,40,04,09,049,37,05,60,046,49*77
$GPGSV,3,2,09,06,39,195,45,09,40,115,46,14,48,286,47,25,09,307,37*73
$GPGSV,3,3,09,30,67,294,49*40
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":45,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":294,"ss":49,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.85,"vdop":3.00,"tdop":0.85,"hdop":2.00,"gdop":1.89,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":45,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":294,"ss":49,"used":true}]}
$GPGLL,4023.8660,N,00339.1630,W,214352,V,S*53
-{"class":"TPV","tag":"GLL","lat":40.397766667,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.397766667,"lon":-3.652716667,"alt":695.700,"epx":8.311,"epy":12.721,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
$PGRMZ,2282,f,3*21
@@ -34,9 +34,9 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,19,319,41,02,17,093,40,04,09,049,37,05,60,046,49*77
$GPGSV,3,2,09,06,39,195,45,09,40,115,46,14,48,286,47,25,09,307,37*73
$GPGSV,3,3,09,30,67,294,50*48
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":45,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":294,"ss":50,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.85,"vdop":3.00,"tdop":0.85,"hdop":2.00,"gdop":1.89,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":45,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":294,"ss":50,"used":true}]}
$GPGLL,4023.8720,N,00339.1630,W,214354,V,S*50
-{"class":"TPV","tag":"GLL","lat":40.397866667,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.397866667,"lon":-3.652716667,"alt":695.700,"epx":8.311,"epy":12.721,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
$PGRMZ,2282,f,3*21
@@ -48,9 +48,9 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,19,319,41,02,17,093,40,04,09,049,37,05,60,046,49*77
$GPGSV,3,2,09,06,39,195,46,09,40,115,46,14,48,286,47,25,09,307,37*70
$GPGSV,3,3,09,30,67,294,50*48
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":294,"ss":50,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.85,"vdop":3.00,"tdop":0.85,"hdop":2.00,"gdop":1.89,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":294,"ss":50,"used":true}]}
$GPGLL,4023.8780,N,00339.1630,W,214356,V,S*58
-{"class":"TPV","tag":"GLL","lat":40.397966667,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.397966667,"lon":-3.652716667,"alt":695.700,"epx":8.311,"epy":12.721,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
$PGRMZ,2282,f,3*21
@@ -62,9 +62,9 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,19,319,41,02,17,093,40,04,09,049,37,05,60,046,48*76
$GPGSV,3,2,09,06,39,195,46,09,40,115,46,14,48,286,47,25,09,307,37*70
$GPGSV,3,3,09,30,67,294,50*48
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":48,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":294,"ss":50,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.85,"vdop":3.00,"tdop":0.85,"hdop":2.00,"gdop":1.89,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":48,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":294,"ss":50,"used":true}]}
$GPGLL,4023.8840,N,00339.1630,W,214358,V,S*55
-{"class":"TPV","tag":"GLL","lat":40.398066667,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.398066667,"lon":-3.652716667,"alt":695.700,"epx":8.311,"epy":12.721,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
$PGRMZ,2282,f,3*21
@@ -76,9 +76,9 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,19,319,40,02,17,093,40,04,09,049,37,05,60,046,48*77
$GPGSV,3,2,09,06,39,195,46,09,40,115,46,14,48,286,47,25,09,307,37*70
$GPGSV,3,3,09,30,67,294,50*48
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":40,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":48,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":294,"ss":50,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.85,"vdop":3.00,"tdop":0.85,"hdop":2.00,"gdop":1.89,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":40,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":48,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":294,"ss":50,"used":true}]}
$GPGLL,4023.8900,N,00339.1630,W,214400,V,S*5A
-{"class":"TPV","tag":"GLL","lat":40.398166667,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.398166667,"lon":-3.652716667,"alt":695.700,"epx":8.311,"epy":12.721,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
$PGRMZ,2282,f,3*21
@@ -90,9 +90,9 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,19,319,41,02,17,093,40,04,09,049,37,05,60,046,49*77
$GPGSV,3,2,09,06,39,195,46,09,40,115,46,14,48,286,47,25,09,307,37*70
$GPGSV,3,3,09,30,67,294,50*48
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":294,"ss":50,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.85,"vdop":3.00,"tdop":0.85,"hdop":2.00,"gdop":1.89,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":294,"ss":50,"used":true}]}
$GPGLL,4023.8960,N,00339.1630,W,214402,V,S*5E
-{"class":"TPV","tag":"GLL","lat":40.398266667,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.398266667,"lon":-3.652716667,"alt":695.700,"epx":8.311,"epy":12.721,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
$PGRMZ,2282,f,3*21
@@ -104,9 +104,9 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,19,319,40,02,17,093,40,04,09,049,37,05,60,046,49*76
$GPGSV,3,2,09,06,39,195,46,09,40,115,46,14,48,286,47,25,09,307,37*70
$GPGSV,3,3,09,30,67,294,50*48
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":40,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":294,"ss":50,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.85,"vdop":3.00,"tdop":0.85,"hdop":2.00,"gdop":1.89,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":40,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":294,"ss":50,"used":true}]}
$GPGLL,4023.9021,N,00339.1630,W,214404,V,S*55
-{"class":"TPV","tag":"GLL","lat":40.398368333,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.398368333,"lon":-3.652716667,"alt":695.700,"epx":8.311,"epy":12.721,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
$PGRMZ,2282,f,3*21
@@ -118,9 +118,9 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,19,319,41,02,17,093,40,04,09,049,37,05,60,046,48*76
$GPGSV,3,2,09,06,39,195,46,09,40,115,46,14,48,286,47,25,09,307,37*70
$GPGSV,3,3,09,30,67,295,50*49
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":48,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.85,"vdop":3.00,"tdop":0.85,"hdop":2.00,"gdop":1.89,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":48,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
$GPGLL,4023.9081,N,00339.1630,W,214406,V,S*5D
-{"class":"TPV","tag":"GLL","lat":40.398468333,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.398468333,"lon":-3.652716667,"alt":695.700,"epx":8.311,"epy":12.721,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
$PGRMZ,2282,f,3*21
@@ -132,9 +132,9 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,19,319,41,02,17,093,40,04,09,049,37,05,60,046,49*77
$GPGSV,3,2,09,06,39,195,46,09,40,115,46,14,48,286,47,25,09,307,37*70
$GPGSV,3,3,09,30,67,295,50*49
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.85,"vdop":3.00,"tdop":0.85,"hdop":2.00,"gdop":1.89,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
$GPGLL,4023.9141,N,00339.1630,W,214408,V,S*5E
-{"class":"TPV","tag":"GLL","lat":40.398568333,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.398568333,"lon":-3.652716667,"alt":695.700,"epx":8.313,"epy":12.708,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
$PGRMZ,2282,f,3*21
@@ -146,9 +146,9 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,19,319,41,02,17,093,40,04,09,049,37,05,60,046,49*77
$GPGSV,3,2,09,06,39,195,46,09,40,115,46,14,48,286,47,25,09,307,37*70
$GPGSV,3,3,09,30,67,295,49*41
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":295,"ss":49,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.85,"vdop":3.00,"tdop":0.85,"hdop":2.00,"gdop":1.89,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":295,"ss":49,"used":true}]}
$GPGLL,4023.9201,N,00339.1630,W,214410,V,S*50
-{"class":"TPV","tag":"GLL","lat":40.398668333,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.398668333,"lon":-3.652716667,"alt":695.700,"epx":8.313,"epy":12.708,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
$PGRMZ,2282,f,3*21
@@ -160,9 +160,9 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,19,319,41,02,17,093,40,04,09,049,37,05,60,046,48*76
$GPGSV,3,2,09,06,39,195,46,09,40,115,46,14,48,286,47,25,09,307,36*71
$GPGSV,3,3,09,30,67,295,50*49
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":48,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":36,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.85,"vdop":3.00,"tdop":0.85,"hdop":2.00,"gdop":1.89,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":48,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":36,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
$GPGLL,4023.9261,N,00339.1630,W,214412,V,S*54
-{"class":"TPV","tag":"GLL","lat":40.398768333,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.398768333,"lon":-3.652716667,"alt":695.700,"epx":8.313,"epy":12.708,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
$PGRMZ,2282,f,3*21
@@ -174,9 +174,9 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,19,319,41,02,17,093,40,04,09,049,37,05,60,046,49*77
$GPGSV,3,2,09,06,39,195,46,09,40,115,46,14,48,286,47,25,09,307,36*71
$GPGSV,3,3,09,30,67,295,50*49
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":36,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.85,"vdop":3.00,"tdop":0.85,"hdop":2.00,"gdop":1.89,"pdop":3.60,"satellites":[{"PRN":1,"el":19,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":37,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":36,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
$GPGLL,4023.9321,N,00339.1630,W,214414,V,S*57
-{"class":"TPV","tag":"GLL","lat":40.398868333,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.398868333,"lon":-3.652716667,"alt":695.700,"epx":8.313,"epy":12.708,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
$PGRMZ,2282,f,3*21
@@ -188,9 +188,9 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,20,319,41,02,17,093,40,04,09,049,36,05,60,046,48*7D
$GPGSV,3,2,09,06,39,195,46,09,40,115,46,14,48,286,47,25,09,307,37*70
$GPGSV,3,3,09,30,67,295,50*49
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":20,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":36,"used":true},{"PRN":5,"el":60,"az":46,"ss":48,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.56,"ydop":0.85,"vdop":3.00,"tdop":0.86,"hdop":2.00,"gdop":1.89,"pdop":3.60,"satellites":[{"PRN":1,"el":20,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":36,"used":true},{"PRN":5,"el":60,"az":46,"ss":48,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
$GPGLL,4023.9381,N,00339.1630,W,214416,V,S*5F
-{"class":"TPV","tag":"GLL","lat":40.398968333,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.398968333,"lon":-3.652716667,"alt":695.700,"epx":8.313,"epy":12.708,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
$PGRMZ,2282,f,3*21
@@ -202,9 +202,9 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,20,319,41,02,17,093,40,04,09,049,36,05,60,046,49*7C
$GPGSV,3,2,09,06,39,195,46,09,40,115,46,14,48,286,47,25,09,307,37*70
$GPGSV,3,3,09,30,67,295,50*49
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":20,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":36,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.56,"ydop":0.85,"vdop":3.00,"tdop":0.86,"hdop":2.00,"gdop":1.89,"pdop":3.60,"satellites":[{"PRN":1,"el":20,"az":319,"ss":41,"used":true},{"PRN":2,"el":17,"az":93,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":36,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
$GPGLL,4023.9441,N,00339.1630,W,214418,V,S*5A
-{"class":"TPV","tag":"GLL","lat":40.399068333,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.399068333,"lon":-3.652716667,"alt":695.700,"epx":8.328,"epy":12.688,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
$PGRMZ,2282,f,3*21
@@ -216,9 +216,9 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,20,319,41,02,18,092,40,04,09,049,35,05,60,046,48*70
$GPGSV,3,2,09,06,39,195,46,09,40,115,46,14,48,286,47,25,09,307,37*70
$GPGSV,3,3,09,30,67,295,50*49
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":20,"az":319,"ss":41,"used":true},{"PRN":2,"el":18,"az":92,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":35,"used":true},{"PRN":5,"el":60,"az":46,"ss":48,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.85,"vdop":3.00,"tdop":0.87,"hdop":2.00,"gdop":1.90,"pdop":3.60,"satellites":[{"PRN":1,"el":20,"az":319,"ss":41,"used":true},{"PRN":2,"el":18,"az":92,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":35,"used":true},{"PRN":5,"el":60,"az":46,"ss":48,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
$GPGLL,4023.9501,N,00339.1630,W,214420,V,S*54
-{"class":"TPV","tag":"GLL","lat":40.399168333,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.399168333,"lon":-3.652716667,"alt":695.700,"epx":8.328,"epy":12.688,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
$PGRMZ,2282,f,3*21
@@ -230,9 +230,9 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,20,319,41,02,18,092,40,04,09,049,36,05,60,046,49*72
$GPGSV,3,2,09,06,39,195,46,09,40,115,46,14,48,286,47,25,09,307,37*70
$GPGSV,3,3,09,30,67,295,50*49
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":20,"az":319,"ss":41,"used":true},{"PRN":2,"el":18,"az":92,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":36,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.85,"vdop":3.00,"tdop":0.87,"hdop":2.00,"gdop":1.90,"pdop":3.60,"satellites":[{"PRN":1,"el":20,"az":319,"ss":41,"used":true},{"PRN":2,"el":18,"az":92,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":36,"used":true},{"PRN":5,"el":60,"az":46,"ss":49,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":37,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
$GPGLL,4023.9561,N,00339.1630,W,214422,V,S*50
-{"class":"TPV","tag":"GLL","lat":40.399268333,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.399268333,"lon":-3.652716667,"alt":695.700,"epx":8.304,"epy":12.736,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*47
$PGRME,15.0,M,22.5,M,27.0,M*1A
$PGRMZ,2282,f,3*21
@@ -244,7 +244,7 @@ $GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,3.6,2.0,3.0*3A
$GPGSV,3,1,09,01,20,319,41,02,18,092,40,04,09,049,36,05,60,046,48*73
$GPGSV,3,2,09,06,39,195,46,09,40,115,46,14,48,286,47,25,09,307,36*71
$GPGSV,3,3,09,30,67,295,50*49
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":1,"el":20,"az":319,"ss":41,"used":true},{"PRN":2,"el":18,"az":92,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":36,"used":true},{"PRN":5,"el":60,"az":46,"ss":48,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":36,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.55,"ydop":0.85,"vdop":3.00,"tdop":0.87,"hdop":2.00,"gdop":1.90,"pdop":3.60,"satellites":[{"PRN":1,"el":20,"az":319,"ss":41,"used":true},{"PRN":2,"el":18,"az":92,"ss":40,"used":true},{"PRN":4,"el":9,"az":49,"ss":36,"used":true},{"PRN":5,"el":60,"az":46,"ss":48,"used":true},{"PRN":6,"el":39,"az":195,"ss":46,"used":true},{"PRN":9,"el":40,"az":115,"ss":46,"used":true},{"PRN":14,"el":48,"az":286,"ss":47,"used":true},{"PRN":25,"el":9,"az":307,"ss":36,"used":true},{"PRN":30,"el":67,"az":295,"ss":50,"used":true}]}
$GPGLL,4023.9621,N,00339.1630,W,214424,V,S*51
-{"class":"TPV","tag":"GLL","lat":40.399368333,"lon":-3.652716667,"alt":695.700,"epv":69.000,"mode":3}
+{"class":"TPV","tag":"GLL","lat":40.399368333,"lon":-3.652716667,"alt":695.700,"epx":8.304,"epy":12.736,"epv":69.000,"mode":3}
$GPBOD,,T,,M,,*
diff --git a/test/daemon/garmin17n.log.chk b/test/daemon/garmin17n.log.chk
index 4672f2b9..9c759a16 100644
--- a/test/daemon/garmin17n.log.chk
+++ b/test/daemon/garmin17n.log.chk
@@ -17,7 +17,7 @@ $GPRMC,093803,A,5213.1439,N,02100.6511,E,000.0,226.0,160305,004.2,E,D*14
$GPGGA,093803,5213.1439,N,02100.6511,E,2,10,0.9,137.2,M,36.2,M,,*42
$GPGSA,A,3,03,06,15,16,18,19,21,22,,27,29,,1.6,0.9,1.3*34
$GPGSV,3,3,12,26,14,065,48,27,08,336,38,29,14,048,44,44,18,130,41*78
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":18,"el":50,"az":135,"ss":50,"used":true},{"PRN":19,"el":15,"az":291,"ss":46,"used":true},{"PRN":21,"el":59,"az":69,"ss":51,"used":true},{"PRN":22,"el":30,"az":169,"ss":49,"used":true},{"PRN":26,"el":14,"az":65,"ss":48,"used":false},{"PRN":27,"el":8,"az":336,"ss":38,"used":true},{"PRN":29,"el":14,"az":48,"ss":44,"used":true},{"PRN":44,"el":18,"az":130,"ss":41,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.64,"ydop":0.66,"vdop":1.30,"tdop":0.71,"hdop":0.90,"gdop":1.92,"pdop":1.60,"satellites":[{"PRN":18,"el":50,"az":135,"ss":50,"used":true},{"PRN":19,"el":15,"az":291,"ss":46,"used":true},{"PRN":21,"el":59,"az":69,"ss":51,"used":true},{"PRN":22,"el":30,"az":169,"ss":49,"used":true},{"PRN":26,"el":14,"az":65,"ss":48,"used":false},{"PRN":27,"el":8,"az":336,"ss":38,"used":true},{"PRN":29,"el":14,"az":48,"ss":44,"used":true},{"PRN":44,"el":18,"az":130,"ss":41,"used":false}]}
$PGRME,1.7,M,2.4,M,3.0,M*2D
$GPGLL,5213.1439,N,02100.6511,E,093803,A,D*49
{"class":"TPV","tag":"GLL","time":1110965883.000,"ept":0.005,"lat":52.219065000,"lon":21.010851667,"alt":137.200,"epx":2.496,"epy":2.496,"epv":4.983,"track":226.0000,"speed":0.000,"climb":0.000,"mode":3}
diff --git a/test/daemon/garmin38.log.chk b/test/daemon/garmin38.log.chk
index 52f06c8a..be067777 100644
--- a/test/daemon/garmin38.log.chk
+++ b/test/daemon/garmin38.log.chk
@@ -11,7 +11,7 @@ $GPGGA,142216,3348.452,N,11821.143,W,1,05,1.8,38.4,M,-32.4,M,,*4B
$GPGSA,A,3,03,,11,14,,,25,31,,,,,3.3,1.8,2.8*32
$GPGSV,2,1,08,03,23,224,38,09,06,037,00,11,17,314,41,14,75,015,44*72
$GPGSV,2,2,08,15,18,138,00,18,20,079,00,25,27,172,46,31,27,263,38*7C
-{"class":"SKY","tag":"GSV","vdop":2.80,"hdop":1.80,"pdop":3.30,"satellites":[{"PRN":3,"el":23,"az":224,"ss":38,"used":true},{"PRN":9,"el":6,"az":37,"ss":0,"used":false},{"PRN":11,"el":17,"az":314,"ss":41,"used":true},{"PRN":14,"el":75,"az":15,"ss":44,"used":true},{"PRN":15,"el":18,"az":138,"ss":0,"used":false},{"PRN":18,"el":20,"az":79,"ss":0,"used":false},{"PRN":25,"el":27,"az":172,"ss":46,"used":true},{"PRN":31,"el":27,"az":263,"ss":38,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.79,"ydop":0.70,"vdop":2.80,"tdop":0.79,"hdop":1.80,"gdop":2.04,"pdop":3.30,"satellites":[{"PRN":3,"el":23,"az":224,"ss":38,"used":true},{"PRN":9,"el":6,"az":37,"ss":0,"used":false},{"PRN":11,"el":17,"az":314,"ss":41,"used":true},{"PRN":14,"el":75,"az":15,"ss":44,"used":true},{"PRN":15,"el":18,"az":138,"ss":0,"used":false},{"PRN":18,"el":20,"az":79,"ss":0,"used":false},{"PRN":25,"el":27,"az":172,"ss":46,"used":true},{"PRN":31,"el":27,"az":263,"ss":38,"used":true}]}
$PGRME,19.2,M,28.7,M,34.6,M*18
$GPGLL,3348.452,N,11821.143,W,142216,A*38
{"class":"TPV","tag":"GLL","time":1034086936.000,"ept":0.005,"lat":33.807533333,"lon":-118.352383333,"alt":38.400,"epx":28.188,"epy":28.188,"epv":59.589,"track":353.6000,"speed":0.000,"climb":0.000,"mode":3}
@@ -25,10 +25,10 @@ $GPGGA,142218,3348.451,N,11821.144,W,1,05,1.8,38.4,M,-32.4,M,,*41
$GPGSA,A,3,03,,11,14,,,25,31,,,,,3.3,1.8,2.8*32
$GPGSV,2,1,08,03,23,224,43,09,06,037,00,11,17,314,38,14,75,015,44*70
$GPGSV,2,2,08,15,18,138,00,18,20,079,00,25,27,172,39,31,27,263,42*79
-{"class":"SKY","tag":"GSV","vdop":2.80,"hdop":1.80,"pdop":3.30,"satellites":[{"PRN":3,"el":23,"az":224,"ss":43,"used":true},{"PRN":9,"el":6,"az":37,"ss":0,"used":false},{"PRN":11,"el":17,"az":314,"ss":38,"used":true},{"PRN":14,"el":75,"az":15,"ss":44,"used":true},{"PRN":15,"el":18,"az":138,"ss":0,"used":false},{"PRN":18,"el":20,"az":79,"ss":0,"used":false},{"PRN":25,"el":27,"az":172,"ss":39,"used":true},{"PRN":31,"el":27,"az":263,"ss":42,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.79,"ydop":0.70,"vdop":2.80,"tdop":0.79,"hdop":1.80,"gdop":2.04,"pdop":3.30,"satellites":[{"PRN":3,"el":23,"az":224,"ss":43,"used":true},{"PRN":9,"el":6,"az":37,"ss":0,"used":false},{"PRN":11,"el":17,"az":314,"ss":38,"used":true},{"PRN":14,"el":75,"az":15,"ss":44,"used":true},{"PRN":15,"el":18,"az":138,"ss":0,"used":false},{"PRN":18,"el":20,"az":79,"ss":0,"used":false},{"PRN":25,"el":27,"az":172,"ss":39,"used":true},{"PRN":31,"el":27,"az":263,"ss":42,"used":true}]}
$PGRME,19.2,M,28.7,M,34.6,M*18
$GPGLL,3348.451,N,11821.144,W,142218,A*32
-{"class":"TPV","tag":"GLL","time":1034086938.000,"ept":0.005,"lat":33.807516667,"lon":-118.352400000,"alt":38.400,"epx":28.188,"epy":28.188,"epv":59.589,"track":353.6000,"speed":0.000,"climb":0.000,"mode":3}
+{"class":"TPV","tag":"GLL","time":1034086938.000,"ept":0.005,"lat":33.807516667,"lon":-118.352400000,"alt":38.400,"epx":28.188,"epy":28.188,"epv":59.589,"track":353.6000,"speed":0.000,"climb":0.000,"eps":19.99,"mode":3}
$PGRMZ,126,f,3*1E
$PGRMM,NAD83*29
$GPBOD,,T,,M,,*47
@@ -39,10 +39,10 @@ $GPGGA,142220,3348.451,N,11821.142,W,1,05,1.8,37.6,M,-32.4,M,,*41
$GPGSA,A,3,03,,11,14,,,25,31,,,,,3.3,1.8,2.8*32
$GPGSV,2,1,08,03,23,224,43,09,06,037,00,11,17,314,38,14,75,015,43*77
$GPGSV,2,2,08,15,18,138,00,18,20,079,00,25,27,172,39,31,27,263,41*7A
-{"class":"SKY","tag":"GSV","vdop":2.80,"hdop":1.80,"pdop":3.30,"satellites":[{"PRN":3,"el":23,"az":224,"ss":43,"used":true},{"PRN":9,"el":6,"az":37,"ss":0,"used":false},{"PRN":11,"el":17,"az":314,"ss":38,"used":true},{"PRN":14,"el":75,"az":15,"ss":43,"used":true},{"PRN":15,"el":18,"az":138,"ss":0,"used":false},{"PRN":18,"el":20,"az":79,"ss":0,"used":false},{"PRN":25,"el":27,"az":172,"ss":39,"used":true},{"PRN":31,"el":27,"az":263,"ss":41,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.79,"ydop":0.70,"vdop":2.80,"tdop":0.79,"hdop":1.80,"gdop":2.04,"pdop":3.30,"satellites":[{"PRN":3,"el":23,"az":224,"ss":43,"used":true},{"PRN":9,"el":6,"az":37,"ss":0,"used":false},{"PRN":11,"el":17,"az":314,"ss":38,"used":true},{"PRN":14,"el":75,"az":15,"ss":43,"used":true},{"PRN":15,"el":18,"az":138,"ss":0,"used":false},{"PRN":18,"el":20,"az":79,"ss":0,"used":false},{"PRN":25,"el":27,"az":172,"ss":39,"used":true},{"PRN":31,"el":27,"az":263,"ss":41,"used":true}]}
$PGRME,19.2,M,28.7,M,34.6,M*18
$GPGLL,3348.451,N,11821.142,W,142220,A*3F
-{"class":"TPV","tag":"GLL","time":1034086940.000,"ept":0.005,"lat":33.807516667,"lon":-118.352366667,"alt":37.600,"epx":28.188,"epy":28.188,"epv":59.589,"track":353.6000,"speed":0.000,"climb":0.000,"mode":3}
+{"class":"TPV","tag":"GLL","time":1034086940.000,"ept":0.005,"lat":33.807516667,"lon":-118.352366667,"alt":37.600,"epx":28.188,"epy":28.188,"epv":59.589,"track":353.6000,"speed":0.000,"climb":0.000,"eps":19.99,"mode":3}
$PGRMZ,123,f,3*1B
$PGRMM,NAD83*29
$GPBOD,,T,,M,,*47
@@ -53,10 +53,10 @@ $GPGGA,142222,3348.451,N,11821.143,W,1,05,1.8,38.0,M,-32.4,M,,*4B
$GPGSA,A,3,03,,11,14,,,25,31,,,,,3.3,1.8,2.8*32
$GPGSV,2,1,08,03,23,224,42,09,06,037,00,11,17,314,38,14,75,015,43*76
$GPGSV,2,2,08,15,18,138,00,18,20,079,00,25,27,172,40,31,27,263,41*74
-{"class":"SKY","tag":"GSV","vdop":2.80,"hdop":1.80,"pdop":3.30,"satellites":[{"PRN":3,"el":23,"az":224,"ss":42,"used":true},{"PRN":9,"el":6,"az":37,"ss":0,"used":false},{"PRN":11,"el":17,"az":314,"ss":38,"used":true},{"PRN":14,"el":75,"az":15,"ss":43,"used":true},{"PRN":15,"el":18,"az":138,"ss":0,"used":false},{"PRN":18,"el":20,"az":79,"ss":0,"used":false},{"PRN":25,"el":27,"az":172,"ss":40,"used":true},{"PRN":31,"el":27,"az":263,"ss":41,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.79,"ydop":0.70,"vdop":2.80,"tdop":0.79,"hdop":1.80,"gdop":2.04,"pdop":3.30,"satellites":[{"PRN":3,"el":23,"az":224,"ss":42,"used":true},{"PRN":9,"el":6,"az":37,"ss":0,"used":false},{"PRN":11,"el":17,"az":314,"ss":38,"used":true},{"PRN":14,"el":75,"az":15,"ss":43,"used":true},{"PRN":15,"el":18,"az":138,"ss":0,"used":false},{"PRN":18,"el":20,"az":79,"ss":0,"used":false},{"PRN":25,"el":27,"az":172,"ss":40,"used":true},{"PRN":31,"el":27,"az":263,"ss":41,"used":true}]}
$PGRME,19.2,M,28.9,M,34.7,M*17
$GPGLL,3348.451,N,11821.143,W,142222,A*3C
-{"class":"TPV","tag":"GLL","time":1034086942.000,"ept":0.005,"lat":33.807516667,"lon":-118.352383333,"alt":38.000,"epx":28.188,"epy":28.188,"epv":60.004,"track":353.6000,"speed":0.000,"climb":0.000,"mode":3}
+{"class":"TPV","tag":"GLL","time":1034086942.000,"ept":0.005,"lat":33.807516667,"lon":-118.352383333,"alt":38.000,"epx":28.188,"epy":28.188,"epv":60.004,"track":353.6000,"speed":0.000,"climb":0.000,"eps":19.99,"mode":3}
$PGRMZ,125,f,3*1D
$PGRMM,NAD83*29
$GPBOD,,T,,M,,*47
@@ -67,8 +67,8 @@ $GPGGA,142224,3348.451,N,11821.143,W,1,05,1.8,38.0,M,-32.4,M,,*4D
$GPGSA,A,3,03,,11,14,,,25,31,,,,,3.3,1.8,2.8*32
$GPGSV,2,1,08,03,23,224,43,09,06,037,00,11,17,314,39,14,75,015,44*71
$GPGSV,2,2,08,15,18,138,00,18,20,079,00,25,27,172,39,31,27,263,40*7B
-{"class":"SKY","tag":"GSV","vdop":2.80,"hdop":1.80,"pdop":3.30,"satellites":[{"PRN":3,"el":23,"az":224,"ss":43,"used":true},{"PRN":9,"el":6,"az":37,"ss":0,"used":false},{"PRN":11,"el":17,"az":314,"ss":39,"used":true},{"PRN":14,"el":75,"az":15,"ss":44,"used":true},{"PRN":15,"el":18,"az":138,"ss":0,"used":false},{"PRN":18,"el":20,"az":79,"ss":0,"used":false},{"PRN":25,"el":27,"az":172,"ss":39,"used":true},{"PRN":31,"el":27,"az":263,"ss":40,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.79,"ydop":0.70,"vdop":2.80,"tdop":0.79,"hdop":1.80,"gdop":2.04,"pdop":3.30,"satellites":[{"PRN":3,"el":23,"az":224,"ss":43,"used":true},{"PRN":9,"el":6,"az":37,"ss":0,"used":false},{"PRN":11,"el":17,"az":314,"ss":39,"used":true},{"PRN":14,"el":75,"az":15,"ss":44,"used":true},{"PRN":15,"el":18,"az":138,"ss":0,"used":false},{"PRN":18,"el":20,"az":79,"ss":0,"used":false},{"PRN":25,"el":27,"az":172,"ss":39,"used":true},{"PRN":31,"el":27,"az":263,"ss":40,"used":true}]}
$PGRME,19.2,M,28.9,M,34.7,M*17
$GPGLL,3348.451,N,11821.143,W,142224,A*3A
-{"class":"TPV","tag":"GLL","time":1034086944.000,"ept":0.005,"lat":33.807516667,"lon":-118.352383333,"alt":38.000,"epx":28.188,"epy":28.188,"epv":60.004,"track":353.6000,"speed":0.000,"climb":0.000,"mode":3}
+{"class":"TPV","tag":"GLL","time":1034086944.000,"ept":0.005,"lat":33.807516667,"lon":-118.352383333,"alt":38.000,"epx":28.188,"epy":28.188,"epv":60.004,"track":353.6000,"speed":0.000,"climb":0.000,"eps":19.99,"mode":3}
$PGRMZ,125,f,3*1D
diff --git a/test/daemon/garmin48.log.chk b/test/daemon/garmin48.log.chk
index 2a8307ca..6291b6e0 100644
--- a/test/daemon/garmin48.log.chk
+++ b/test/daemon/garmin48.log.chk
@@ -8,7 +8,7 @@ $GPGSA,A,3,01,,,,13,20,22,,,,28,,3.1,2.1,2.0*3A
$GPGSV,3,1,11,01,78,221,47,03,09,042,00,04,05,242,00,06,04,149,00*70
$GPGSV,3,2,11,13,37,235,48,20,41,333,46,22,65,081,46,24,02,205,00*7B
$GPGSV,3,3,11,25,20,108,00,27,08,281,00,28,17,339,39,,,,*4C
-{"class":"SKY","tag":"GSV","vdop":2.00,"hdop":2.10,"pdop":3.10,"satellites":[{"PRN":1,"el":78,"az":221,"ss":47,"used":true},{"PRN":3,"el":9,"az":42,"ss":0,"used":false},{"PRN":4,"el":5,"az":242,"ss":0,"used":false},{"PRN":6,"el":4,"az":149,"ss":0,"used":false},{"PRN":13,"el":37,"az":235,"ss":48,"used":true},{"PRN":20,"el":41,"az":333,"ss":46,"used":true},{"PRN":22,"el":65,"az":81,"ss":46,"used":true},{"PRN":24,"el":2,"az":205,"ss":0,"used":false},{"PRN":25,"el":20,"az":108,"ss":0,"used":false},{"PRN":27,"el":8,"az":281,"ss":0,"used":false},{"PRN":28,"el":17,"az":339,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.84,"ydop":0.92,"vdop":2.00,"tdop":0.71,"hdop":2.10,"gdop":1.94,"pdop":3.10,"satellites":[{"PRN":1,"el":78,"az":221,"ss":47,"used":true},{"PRN":3,"el":9,"az":42,"ss":0,"used":false},{"PRN":4,"el":5,"az":242,"ss":0,"used":false},{"PRN":6,"el":4,"az":149,"ss":0,"used":false},{"PRN":13,"el":37,"az":235,"ss":48,"used":true},{"PRN":20,"el":41,"az":333,"ss":46,"used":true},{"PRN":22,"el":65,"az":81,"ss":46,"used":true},{"PRN":24,"el":2,"az":205,"ss":0,"used":false},{"PRN":25,"el":20,"az":108,"ss":0,"used":false},{"PRN":27,"el":8,"az":281,"ss":0,"used":false},{"PRN":28,"el":17,"az":339,"ss":39,"used":true}]}
$PGRME,9.1,M,15.0,M,12.0,M*21
$GPGLL,4527.458,S,16709.165,E,225309,A*3E
$PGRMZ,48,f,3*27
@@ -18,15 +18,15 @@ $GPRTE,1,1,c,0*07
$GPRMC,225310,A,4527.458,S,16709.165,E,000.0,094.5,060601,024.1,E*64
$GPRMB,A,,,,,,,,,,,,V*71
$GPGGA,225310,4527.458,S,16709.165,E,1,05,2.1,14.6,M,1.1,M,,*5B
-{"class":"TPV","tag":"GGA","time":991867990.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.600,"epv":46.000,"track":94.5000,"speed":0.000,"mode":3}
+{"class":"TPV","tag":"GGA","time":991867990.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.600,"epx":12.536,"epy":13.872,"epv":46.000,"track":94.5000,"speed":0.000,"eps":27.74,"mode":3}
$GPGSA,A,3,01,,,,13,20,22,,,,28,,3.1,2.1,2.0*3A
$GPGSV,3,1,11,01,78,221,47,03,09,042,00,04,05,242,00,06,04,149,00*70
$GPGSV,3,2,11,13,37,235,48,20,41,333,46,22,65,081,46,24,02,205,00*7B
$GPGSV,3,3,11,25,20,108,00,27,08,281,00,28,17,339,39,,,,*4C
-{"class":"SKY","tag":"GSV","vdop":2.00,"hdop":2.10,"pdop":3.10,"satellites":[{"PRN":1,"el":78,"az":221,"ss":47,"used":true},{"PRN":3,"el":9,"az":42,"ss":0,"used":false},{"PRN":4,"el":5,"az":242,"ss":0,"used":false},{"PRN":6,"el":4,"az":149,"ss":0,"used":false},{"PRN":13,"el":37,"az":235,"ss":48,"used":true},{"PRN":20,"el":41,"az":333,"ss":46,"used":true},{"PRN":22,"el":65,"az":81,"ss":46,"used":true},{"PRN":24,"el":2,"az":205,"ss":0,"used":false},{"PRN":25,"el":20,"az":108,"ss":0,"used":false},{"PRN":27,"el":8,"az":281,"ss":0,"used":false},{"PRN":28,"el":17,"az":339,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.84,"ydop":0.92,"vdop":2.00,"tdop":0.71,"hdop":2.10,"gdop":1.94,"pdop":3.10,"satellites":[{"PRN":1,"el":78,"az":221,"ss":47,"used":true},{"PRN":3,"el":9,"az":42,"ss":0,"used":false},{"PRN":4,"el":5,"az":242,"ss":0,"used":false},{"PRN":6,"el":4,"az":149,"ss":0,"used":false},{"PRN":13,"el":37,"az":235,"ss":48,"used":true},{"PRN":20,"el":41,"az":333,"ss":46,"used":true},{"PRN":22,"el":65,"az":81,"ss":46,"used":true},{"PRN":24,"el":2,"az":205,"ss":0,"used":false},{"PRN":25,"el":20,"az":108,"ss":0,"used":false},{"PRN":27,"el":8,"az":281,"ss":0,"used":false},{"PRN":28,"el":17,"az":339,"ss":39,"used":true}]}
$PGRME,9.1,M,15.0,M,12.0,M*21
$GPGLL,4527.458,S,16709.165,E,225311,A*37
-{"class":"TPV","tag":"GLL","time":991867991.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"mode":2}
+{"class":"TPV","tag":"GLL","time":991867991.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"epx":12.536,"epy":13.872,"eps":27.23,"mode":2}
$PGRMZ,48,f,3*27
$PGRMM,WGS 84*06
$GPBOD,,T,,M,,*47
@@ -34,15 +34,15 @@ $GPRTE,1,1,c,0*07
$GPRMC,225312,A,4527.458,S,16709.165,E,000.0,094.5,060601,024.1,E*66
$GPRMB,A,,,,,,,,,,,,V*71
$GPGGA,225312,4527.458,S,16709.165,E,1,05,2.2,14.7,M,1.1,M,,*5B
-{"class":"TPV","tag":"GGA","time":991867992.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.700,"epv":46.000,"track":94.5000,"speed":0.000,"mode":3}
+{"class":"TPV","tag":"GGA","time":991867992.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.700,"epx":12.536,"epy":13.872,"epv":46.000,"track":94.5000,"speed":0.000,"eps":27.74,"mode":3}
$GPGSA,A,3,01,,,,13,20,22,,,,28,,3.2,2.2,2.1*3B
$GPGSV,3,1,11,01,78,221,47,03,09,042,00,04,05,242,00,06,04,149,00*70
$GPGSV,3,2,11,13,37,235,49,20,41,333,46,22,65,081,46,24,02,205,00*7A
$GPGSV,3,3,11,25,20,108,00,27,08,281,00,28,17,339,39,,,,*4C
-{"class":"SKY","tag":"GSV","vdop":2.10,"hdop":2.20,"pdop":3.20,"satellites":[{"PRN":1,"el":78,"az":221,"ss":47,"used":true},{"PRN":3,"el":9,"az":42,"ss":0,"used":false},{"PRN":4,"el":5,"az":242,"ss":0,"used":false},{"PRN":6,"el":4,"az":149,"ss":0,"used":false},{"PRN":13,"el":37,"az":235,"ss":49,"used":true},{"PRN":20,"el":41,"az":333,"ss":46,"used":true},{"PRN":22,"el":65,"az":81,"ss":46,"used":true},{"PRN":24,"el":2,"az":205,"ss":0,"used":false},{"PRN":25,"el":20,"az":108,"ss":0,"used":false},{"PRN":27,"el":8,"az":281,"ss":0,"used":false},{"PRN":28,"el":17,"az":339,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.84,"ydop":0.92,"vdop":2.10,"tdop":0.71,"hdop":2.20,"gdop":1.94,"pdop":3.20,"satellites":[{"PRN":1,"el":78,"az":221,"ss":47,"used":true},{"PRN":3,"el":9,"az":42,"ss":0,"used":false},{"PRN":4,"el":5,"az":242,"ss":0,"used":false},{"PRN":6,"el":4,"az":149,"ss":0,"used":false},{"PRN":13,"el":37,"az":235,"ss":49,"used":true},{"PRN":20,"el":41,"az":333,"ss":46,"used":true},{"PRN":22,"el":65,"az":81,"ss":46,"used":true},{"PRN":24,"el":2,"az":205,"ss":0,"used":false},{"PRN":25,"el":20,"az":108,"ss":0,"used":false},{"PRN":27,"el":8,"az":281,"ss":0,"used":false},{"PRN":28,"el":17,"az":339,"ss":39,"used":true}]}
$PGRME,9.2,M,15.0,M,12.6,M*24
$GPGLL,4527.458,S,16709.165,E,225313,A*35
-{"class":"TPV","tag":"GLL","time":991867993.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"mode":2}
+{"class":"TPV","tag":"GLL","time":991867993.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"epx":12.536,"epy":13.872,"eps":27.38,"mode":2}
$PGRMZ,48,f,3*27
$PGRMM,WGS 84*06
$GPBOD,,T,,M,,*47
@@ -50,15 +50,15 @@ $GPRTE,1,1,c,0*07
$GPRMC,225314,A,4527.458,S,16709.165,E,000.0,094.5,060601,024.1,E*60
$GPRMB,A,,,,,,,,,,,,V*71
$GPGGA,225314,4527.458,S,16709.165,E,1,05,2.2,14.6,M,1.1,M,,*5C
-{"class":"TPV","tag":"GGA","time":991867994.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.600,"epv":48.300,"track":94.5000,"speed":0.000,"mode":3}
+{"class":"TPV","tag":"GGA","time":991867994.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.600,"epx":12.536,"epy":13.872,"epv":48.300,"track":94.5000,"speed":0.000,"eps":27.74,"mode":3}
$GPGSA,A,3,01,,,,13,20,22,,,,28,,3.2,2.2,2.1*3B
$GPGSV,3,1,11,01,78,221,47,03,09,042,00,04,05,242,00,06,04,149,00*70
$GPGSV,3,2,11,13,37,235,49,20,41,333,46,22,65,081,46,24,02,205,00*7A
$GPGSV,3,3,11,25,20,108,00,27,08,281,00,28,17,339,39,,,,*4C
-{"class":"SKY","tag":"GSV","vdop":2.10,"hdop":2.20,"pdop":3.20,"satellites":[{"PRN":1,"el":78,"az":221,"ss":47,"used":true},{"PRN":3,"el":9,"az":42,"ss":0,"used":false},{"PRN":4,"el":5,"az":242,"ss":0,"used":false},{"PRN":6,"el":4,"az":149,"ss":0,"used":false},{"PRN":13,"el":37,"az":235,"ss":49,"used":true},{"PRN":20,"el":41,"az":333,"ss":46,"used":true},{"PRN":22,"el":65,"az":81,"ss":46,"used":true},{"PRN":24,"el":2,"az":205,"ss":0,"used":false},{"PRN":25,"el":20,"az":108,"ss":0,"used":false},{"PRN":27,"el":8,"az":281,"ss":0,"used":false},{"PRN":28,"el":17,"az":339,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.84,"ydop":0.92,"vdop":2.10,"tdop":0.71,"hdop":2.20,"gdop":1.94,"pdop":3.20,"satellites":[{"PRN":1,"el":78,"az":221,"ss":47,"used":true},{"PRN":3,"el":9,"az":42,"ss":0,"used":false},{"PRN":4,"el":5,"az":242,"ss":0,"used":false},{"PRN":6,"el":4,"az":149,"ss":0,"used":false},{"PRN":13,"el":37,"az":235,"ss":49,"used":true},{"PRN":20,"el":41,"az":333,"ss":46,"used":true},{"PRN":22,"el":65,"az":81,"ss":46,"used":true},{"PRN":24,"el":2,"az":205,"ss":0,"used":false},{"PRN":25,"el":20,"az":108,"ss":0,"used":false},{"PRN":27,"el":8,"az":281,"ss":0,"used":false},{"PRN":28,"el":17,"az":339,"ss":39,"used":true}]}
$PGRME,9.2,M,15.0,M,12.6,M*24
$GPGLL,4527.458,S,16709.165,E,225315,A*33
-{"class":"TPV","tag":"GLL","time":991867995.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"mode":2}
+{"class":"TPV","tag":"GLL","time":991867995.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"epx":12.536,"epy":13.872,"eps":27.38,"mode":2}
$PGRMZ,48,f,3*27
$PGRMM,WGS 84*06
$GPBOD,,T,,M,,*47
@@ -66,15 +66,15 @@ $GPRTE,1,1,c,0*07
$GPRMC,225316,A,4527.458,S,16709.165,E,000.0,094.5,060601,024.1,E*62
$GPRMB,A,,,,,,,,,,,,V*71
$GPGGA,225316,4527.458,S,16709.165,E,1,05,2.2,14.4,M,1.1,M,,*5C
-{"class":"TPV","tag":"GGA","time":991867996.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.400,"epv":48.300,"track":94.5000,"speed":0.000,"mode":3}
+{"class":"TPV","tag":"GGA","time":991867996.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.400,"epx":12.536,"epy":13.872,"epv":48.300,"track":94.5000,"speed":0.000,"eps":27.74,"mode":3}
$GPGSA,A,3,01,,,,13,20,22,,,,28,,3.2,2.2,2.1*3B
$GPGSV,3,1,11,01,78,221,47,03,09,042,00,04,05,242,00,06,04,149,00*70
$GPGSV,3,2,11,13,37,235,49,20,40,333,46,22,65,081,46,24,02,205,00*7B
$GPGSV,3,3,11,25,20,108,00,27,08,281,00,28,17,339,39,,,,*4C
-{"class":"SKY","tag":"GSV","vdop":2.10,"hdop":2.20,"pdop":3.20,"satellites":[{"PRN":1,"el":78,"az":221,"ss":47,"used":true},{"PRN":3,"el":9,"az":42,"ss":0,"used":false},{"PRN":4,"el":5,"az":242,"ss":0,"used":false},{"PRN":6,"el":4,"az":149,"ss":0,"used":false},{"PRN":13,"el":37,"az":235,"ss":49,"used":true},{"PRN":20,"el":40,"az":333,"ss":46,"used":true},{"PRN":22,"el":65,"az":81,"ss":46,"used":true},{"PRN":24,"el":2,"az":205,"ss":0,"used":false},{"PRN":25,"el":20,"az":108,"ss":0,"used":false},{"PRN":27,"el":8,"az":281,"ss":0,"used":false},{"PRN":28,"el":17,"az":339,"ss":39,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.84,"ydop":0.92,"vdop":2.10,"tdop":0.71,"hdop":2.20,"gdop":1.94,"pdop":3.20,"satellites":[{"PRN":1,"el":78,"az":221,"ss":47,"used":true},{"PRN":3,"el":9,"az":42,"ss":0,"used":false},{"PRN":4,"el":5,"az":242,"ss":0,"used":false},{"PRN":6,"el":4,"az":149,"ss":0,"used":false},{"PRN":13,"el":37,"az":235,"ss":49,"used":true},{"PRN":20,"el":40,"az":333,"ss":46,"used":true},{"PRN":22,"el":65,"az":81,"ss":46,"used":true},{"PRN":24,"el":2,"az":205,"ss":0,"used":false},{"PRN":25,"el":20,"az":108,"ss":0,"used":false},{"PRN":27,"el":8,"az":281,"ss":0,"used":false},{"PRN":28,"el":17,"az":339,"ss":39,"used":true}]}
$PGRME,9.2,M,15.0,M,12.6,M*24
$GPGLL,4527.458,S,16709.165,E,225317,A*31
-{"class":"TPV","tag":"GLL","time":991867997.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"mode":2}
+{"class":"TPV","tag":"GLL","time":991867997.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"epx":12.536,"epy":13.872,"eps":27.38,"mode":2}
$PGRMZ,46,f,3*29
$PGRMM,WGS 84*06
$GPBOD,,T,,M,,*47
@@ -82,16 +82,16 @@ $GPRTE,1,1,c,0*07
$GPRMC,225318,A,4527.458,S,16709.165,E,000.0,094.5,060601,024.1,E*6C
$GPRMB,A,,,,,,,,,,,,V*71
$GPGGA,225318,4527.458,S,16709.165,E,1,05,2.2,14.0,M,1.1,M,,*56
-{"class":"TPV","tag":"GGA","time":991867998.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.000,"epv":48.300,"track":94.5000,"speed":0.000,"mode":3}
+{"class":"TPV","tag":"GGA","time":991867998.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":14.000,"epx":12.536,"epy":13.872,"epv":48.300,"track":94.5000,"speed":0.000,"eps":27.74,"mode":3}
$GPGSA,A,3,01,,,,13,20,22,,,,28,,3.2,2.2,2.1*3B
$GPGSV,3,1,11,01,78,221,47,03,09,042,00,04,05,242,00,06,04,149,00*7
$GPGSV,3,1,11,01,78,221,47,03,09,042,00,04,05,242,00,06,04,149,00*70
$GPGSV,3,2,11,13,37,235,49,20,40,333,46,22,65,083,46,24,02,205,00*79
$GPGSV,3,3,11,25,20,108,00,27,08,281,00,28,17,339,40,,,,*42
-{"class":"SKY","tag":"GSV","vdop":2.10,"hdop":2.20,"pdop":3.20,"satellites":[{"PRN":1,"el":78,"az":221,"ss":47,"used":true},{"PRN":3,"el":9,"az":42,"ss":0,"used":false},{"PRN":4,"el":5,"az":242,"ss":0,"used":false},{"PRN":6,"el":4,"az":149,"ss":0,"used":false},{"PRN":13,"el":37,"az":235,"ss":49,"used":true},{"PRN":20,"el":40,"az":333,"ss":46,"used":true},{"PRN":22,"el":65,"az":83,"ss":46,"used":true},{"PRN":24,"el":2,"az":205,"ss":0,"used":false},{"PRN":25,"el":20,"az":108,"ss":0,"used":false},{"PRN":27,"el":8,"az":281,"ss":0,"used":false},{"PRN":28,"el":17,"az":339,"ss":40,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.84,"ydop":0.92,"vdop":2.10,"tdop":0.71,"hdop":2.20,"gdop":1.94,"pdop":3.20,"satellites":[{"PRN":1,"el":78,"az":221,"ss":47,"used":true},{"PRN":3,"el":9,"az":42,"ss":0,"used":false},{"PRN":4,"el":5,"az":242,"ss":0,"used":false},{"PRN":6,"el":4,"az":149,"ss":0,"used":false},{"PRN":13,"el":37,"az":235,"ss":49,"used":true},{"PRN":20,"el":40,"az":333,"ss":46,"used":true},{"PRN":22,"el":65,"az":83,"ss":46,"used":true},{"PRN":24,"el":2,"az":205,"ss":0,"used":false},{"PRN":25,"el":20,"az":108,"ss":0,"used":false},{"PRN":27,"el":8,"az":281,"ss":0,"used":false},{"PRN":28,"el":17,"az":339,"ss":40,"used":true}]}
$PGRME,10.3,M,15.2,M,16.7,M*1A
$GPGLL,4527.458,S,16709.165,E,225333,A*37
-{"class":"TPV","tag":"GLL","time":991868013.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"mode":2}
+{"class":"TPV","tag":"GLL","time":991868013.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"epx":12.536,"epy":13.872,"eps":1.93,"mode":2}
$PGRMZ,41,f,3*2E
$PGRMM,WGS 84*06
$GPBOD,,T,,M,,*47
@@ -99,15 +99,15 @@ $GPRTE,1,1,c,0*07
$GPRMC,225334,A,4527.458,S,16709.165,E,000.0,094.5,060601,024.1,E*62
$GPRMB,A,,,,,,,,,,,,V*71
$GPGGA,225334,4527.458,S,16709.165,E,1,05,2.4,12.5,M,1.1,M,,*5D
-{"class":"TPV","tag":"GGA","time":991868014.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":12.500,"epv":48.300,"track":94.5000,"speed":0.000,"mode":3}
+{"class":"TPV","tag":"GGA","time":991868014.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"alt":12.500,"epx":12.536,"epy":13.872,"epv":48.300,"track":94.5000,"speed":0.000,"eps":27.74,"mode":3}
$GPGSA,A,3,01,,,,13,20,22,,,,28,,4.1,2.4,3.0*39
$GPGSV,3,1,11,01,78,221,47,03,09,042,00,04,05,242,00,06,04,149,00*70
$GPGSV,3,2,11,13,37,235,49,20,40,333,46,22,65,083,46,24,02,205,00*79
$GPGSV,3,3,11,25,20,108,00,27,08,281,00,28,17,339,41,,,,*43
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.40,"pdop":4.10,"satellites":[{"PRN":1,"el":78,"az":221,"ss":47,"used":true},{"PRN":3,"el":9,"az":42,"ss":0,"used":false},{"PRN":4,"el":5,"az":242,"ss":0,"used":false},{"PRN":6,"el":4,"az":149,"ss":0,"used":false},{"PRN":13,"el":37,"az":235,"ss":49,"used":true},{"PRN":20,"el":40,"az":333,"ss":46,"used":true},{"PRN":22,"el":65,"az":83,"ss":46,"used":true},{"PRN":24,"el":2,"az":205,"ss":0,"used":false},{"PRN":25,"el":20,"az":108,"ss":0,"used":false},{"PRN":27,"el":8,"az":281,"ss":0,"used":false},{"PRN":28,"el":17,"az":339,"ss":41,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.84,"ydop":0.92,"vdop":3.00,"tdop":0.71,"hdop":2.40,"gdop":1.94,"pdop":4.10,"satellites":[{"PRN":1,"el":78,"az":221,"ss":47,"used":true},{"PRN":3,"el":9,"az":42,"ss":0,"used":false},{"PRN":4,"el":5,"az":242,"ss":0,"used":false},{"PRN":6,"el":4,"az":149,"ss":0,"used":false},{"PRN":13,"el":37,"az":235,"ss":49,"used":true},{"PRN":20,"el":40,"az":333,"ss":46,"used":true},{"PRN":22,"el":65,"az":83,"ss":46,"used":true},{"PRN":24,"el":2,"az":205,"ss":0,"used":false},{"PRN":25,"el":20,"az":108,"ss":0,"used":false},{"PRN":27,"el":8,"az":281,"ss":0,"used":false},{"PRN":28,"el":17,"az":339,"ss":41,"used":true}]}
$PGRME,10.3,M,15.2,M,16.7,M*1A
$GPGLL,4527.458,S,16709.165,E,225335,A*31
-{"class":"TPV","tag":"GLL","time":991868015.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"mode":2}
+{"class":"TPV","tag":"GLL","time":991868015.000,"ept":0.005,"lat":-45.457633333,"lon":167.152750000,"epx":12.536,"epy":13.872,"eps":28.99,"mode":2}
$PGRMZ,41,f,3*2E
$PGRMM,WGS 84*06
$GPBOD,,T,,M,,*47
diff --git a/test/daemon/gps-360.log.chk b/test/daemon/gps-360.log.chk
index d3328ad5..990e9da6 100644
--- a/test/daemon/gps-360.log.chk
+++ b/test/daemon/gps-360.log.chk
@@ -13,7 +13,7 @@ $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39
$GPGSV,3,1,9,8,49,156,27,17,49,212,0,28,82,35,36,11,38,84,37*4A
$GPGSV,3,2,9,26,32,278,39,29,31,270,38,19,6,48,0,27,22,152,26*71
$GPGSV,3,3,9,123,0,0,0*40
-{"class":"SKY","tag":"GSV","vdop":3.10,"hdop":12.50,"pdop":12.90,"satellites":[{"PRN":8,"el":49,"az":156,"ss":27,"used":false},{"PRN":17,"el":49,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":35,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":37,"used":true},{"PRN":26,"el":32,"az":278,"ss":39,"used":true},{"PRN":29,"el":31,"az":270,"ss":38,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":26,"used":false},{"PRN":123,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":2.18,"ydop":2.31,"vdop":3.10,"tdop":5.16,"hdop":12.50,"gdop":8.30,"pdop":12.90,"satellites":[{"PRN":8,"el":49,"az":156,"ss":27,"used":false},{"PRN":17,"el":49,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":35,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":37,"used":true},{"PRN":26,"el":32,"az":278,"ss":39,"used":true},{"PRN":29,"el":31,"az":270,"ss":38,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":26,"used":false},{"PRN":123,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021614.949,A,5029.3800,N,10441.0388,W,0.016538,341.48,280706,,*1B
{"class":"TPV","tag":"RMC","time":1154052974.949,"ept":0.005,"lat":50.489666667,"lon":-104.683980000,"alt":572.300,"epx":32.645,"epy":34.721,"epv":71.300,"track":341.4800,"speed":0.009,"climb":-0.100,"mode":3}
$GPGGA,021615.949,5029.3799,N,10441.0387,W,1,04,12.5,572.1,M,-20.3,M,0.0,0000*7C
@@ -42,7 +42,7 @@ $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39
$GPGSV,3,1,9,8,48,156,25,17,50,212,0,28,82,37,36,11,38,84,36*42
$GPGSV,3,2,9,26,32,277,39,29,31,270,38,19,6,48,0,27,22,152,20*78
$GPGSV,3,3,9,123,0,0,0*40
-{"class":"SKY","tag":"GSV","vdop":3.10,"hdop":12.50,"pdop":12.90,"satellites":[{"PRN":8,"el":48,"az":156,"ss":25,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":36,"used":true},{"PRN":26,"el":32,"az":277,"ss":39,"used":true},{"PRN":29,"el":31,"az":270,"ss":38,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":20,"used":false},{"PRN":123,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":2.28,"ydop":2.35,"vdop":3.10,"tdop":5.42,"hdop":12.50,"gdop":8.68,"pdop":12.90,"satellites":[{"PRN":8,"el":48,"az":156,"ss":25,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":36,"used":true},{"PRN":26,"el":32,"az":277,"ss":39,"used":true},{"PRN":29,"el":31,"az":270,"ss":38,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":20,"used":false},{"PRN":123,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021619.949,A,5029.3802,N,10441.0387,W,0.152675,359.28,280706,,*1F
{"class":"TPV","tag":"RMC","time":1154052979.949,"ept":0.005,"lat":50.489670000,"lon":-104.683978333,"alt":571.600,"epx":34.137,"epy":35.324,"epv":71.300,"track":359.2800,"speed":0.079,"climb":-0.200,"mode":3}
$GPGGA,021620.949,5029.3803,N,10441.0387,W,1,04,12.5,571.7,M,-20.3,M,0.0,0000*73
@@ -71,7 +71,7 @@ $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39
$GPGSV,3,1,9,8,48,156,25,17,50,212,0,28,82,37,37,11,38,84,37*42
$GPGSV,3,2,9,26,32,277,39,29,31,270,38,19,6,48,0,27,22,152,21*79
$GPGSV,3,3,9,123,0,0,0*40
-{"class":"SKY","tag":"GSV","vdop":3.10,"hdop":12.50,"pdop":12.90,"satellites":[{"PRN":8,"el":48,"az":156,"ss":25,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":37,"used":true},{"PRN":11,"el":38,"az":84,"ss":37,"used":true},{"PRN":26,"el":32,"az":277,"ss":39,"used":true},{"PRN":29,"el":31,"az":270,"ss":38,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":21,"used":false},{"PRN":123,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":2.28,"ydop":2.35,"vdop":3.10,"tdop":5.42,"hdop":12.50,"gdop":8.68,"pdop":12.90,"satellites":[{"PRN":8,"el":48,"az":156,"ss":25,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":37,"used":true},{"PRN":11,"el":38,"az":84,"ss":37,"used":true},{"PRN":26,"el":32,"az":277,"ss":39,"used":true},{"PRN":29,"el":31,"az":270,"ss":38,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":21,"used":false},{"PRN":123,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021624.949,A,5029.3810,N,10441.0386,W,0.200234,356.84,280706,,*1F
{"class":"TPV","tag":"RMC","time":1154052984.949,"ept":0.005,"lat":50.489683333,"lon":-104.683976667,"alt":570.700,"epx":34.137,"epy":35.324,"epv":71.300,"track":356.8400,"speed":0.103,"climb":-0.500,"mode":3}
$GPGGA,021625.949,5029.3812,N,10441.0386,W,1,04,12.5,570.1,M,-20.3,M,0.0,0000*70
@@ -100,7 +100,7 @@ $GPGSA,A,3,28,11,26,29,27,,,,,,,,3.6,2.0,3.0*36
$GPGSV,3,1,9,8,48,156,0,17,50,212,0,28,82,37,37,11,38,84,36*74
$GPGSV,3,2,9,26,32,277,39,29,31,270,37,19,6,48,0,27,22,152,28*7F
$GPGSV,3,3,9,124,0,0,0*47
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":37,"used":true},{"PRN":11,"el":38,"az":84,"ss":36,"used":true},{"PRN":26,"el":32,"az":277,"ss":39,"used":true},{"PRN":29,"el":31,"az":270,"ss":37,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":28,"used":true},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.83,"ydop":1.35,"vdop":3.00,"tdop":2.18,"hdop":2.00,"gdop":4.00,"pdop":3.60,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":37,"used":true},{"PRN":11,"el":38,"az":84,"ss":36,"used":true},{"PRN":26,"el":32,"az":277,"ss":39,"used":true},{"PRN":29,"el":31,"az":270,"ss":37,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":28,"used":true},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021629.948,A,5029.3826,N,10441.0381,W,0.066422,8.45,280706,,*17
{"class":"TPV","tag":"RMC","time":1154052989.948,"ept":0.005,"lat":50.489710000,"lon":-104.683968333,"alt":567.000,"epx":12.458,"epy":20.312,"epv":69.000,"track":8.4500,"speed":0.034,"climb":-0.600,"mode":3}
$GPGGA,021630.948,5029.3826,N,10441.0380,W,1,04,12.5,567.0,M,-20.3,M,0.0,0000*73
@@ -129,7 +129,7 @@ $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39
$GPGSV,3,1,9,8,48,156,0,17,50,212,0,28,82,37,37,11,38,84,36*74
$GPGSV,3,2,9,26,32,277,38,29,31,270,37,19,6,48,0,27,22,152,27*71
$GPGSV,3,3,9,124,0,0,0*47
-{"class":"SKY","tag":"GSV","vdop":3.10,"hdop":12.50,"pdop":12.90,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":37,"used":true},{"PRN":11,"el":38,"az":84,"ss":36,"used":true},{"PRN":26,"el":32,"az":277,"ss":38,"used":true},{"PRN":29,"el":31,"az":270,"ss":37,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":27,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":2.28,"ydop":2.35,"vdop":3.10,"tdop":5.42,"hdop":12.50,"gdop":8.68,"pdop":12.90,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":37,"used":true},{"PRN":11,"el":38,"az":84,"ss":36,"used":true},{"PRN":26,"el":32,"az":277,"ss":38,"used":true},{"PRN":29,"el":31,"az":270,"ss":37,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":27,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021634.948,A,5029.3825,N,10441.0370,W,0.003955,192.84,280706,,*17
{"class":"TPV","tag":"RMC","time":1154052994.948,"ept":0.005,"lat":50.489708333,"lon":-104.683950000,"alt":566.700,"epx":34.137,"epy":35.324,"epv":71.300,"track":192.8400,"speed":0.002,"climb":-0.200,"mode":3}
$GPGGA,021635.948,5029.3825,N,10441.0370,W,1,04,12.5,566.4,M,-20.3,M,0.0,0000*7F
@@ -158,7 +158,7 @@ $GPGSA,A,3,28,11,26,29,27,,,,,,,,3.6,2.0,3.0*36
$GPGSV,3,1,9,8,48,156,0,17,50,212,0,28,82,37,37,11,38,84,36*74
$GPGSV,3,2,9,26,32,277,38,29,31,270,36,19,6,48,0,27,22,152,28*7F
$GPGSV,3,3,9,124,0,0,0*47
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":37,"used":true},{"PRN":11,"el":38,"az":84,"ss":36,"used":true},{"PRN":26,"el":32,"az":277,"ss":38,"used":true},{"PRN":29,"el":31,"az":270,"ss":36,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":28,"used":true},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.83,"ydop":1.35,"vdop":3.00,"tdop":2.18,"hdop":2.00,"gdop":4.00,"pdop":3.60,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":37,"used":true},{"PRN":11,"el":38,"az":84,"ss":36,"used":true},{"PRN":26,"el":32,"az":277,"ss":38,"used":true},{"PRN":29,"el":31,"az":270,"ss":36,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":28,"used":true},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021639.948,A,5029.3825,N,10441.0375,W,0.024297,20.59,280706,,*27
{"class":"TPV","tag":"RMC","time":1154052999.948,"ept":0.005,"lat":50.489708333,"lon":-104.683958333,"alt":565.600,"epx":12.458,"epy":20.312,"epv":69.000,"track":20.5900,"speed":0.012,"climb":-0.600,"mode":3}
$GPGGA,021640.948,5029.3825,N,10441.0376,W,1,04,12.5,565.3,M,-20.3,M,0.0,0000*7F
@@ -187,7 +187,7 @@ $GPGSA,A,3,17,28,11,26,29,,,,,,,,3.5,2.0,2.8*3F
$GPGSV,3,1,9,8,48,156,0,17,50,212,33,28,82,37,36,11,38,84,35*46
$GPGSV,3,2,9,26,32,277,37,29,31,270,36,19,6,48,0,27,22,152,25*7D
$GPGSV,3,3,9,124,0,0,0*47
-{"class":"SKY","tag":"GSV","vdop":2.80,"hdop":2.00,"pdop":3.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":33,"used":true},{"PRN":28,"el":82,"az":37,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":35,"used":true},{"PRN":26,"el":32,"az":277,"ss":37,"used":true},{"PRN":29,"el":31,"az":270,"ss":36,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":25,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.83,"ydop":1.35,"vdop":2.80,"tdop":2.18,"hdop":2.00,"gdop":4.00,"pdop":3.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":33,"used":true},{"PRN":28,"el":82,"az":37,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":35,"used":true},{"PRN":26,"el":32,"az":277,"ss":37,"used":true},{"PRN":29,"el":31,"az":270,"ss":36,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":25,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021644.947,A,5029.3844,N,10441.0383,W,0.225686,357.97,280706,,*1A
{"class":"TPV","tag":"RMC","time":1154053004.947,"ept":0.005,"lat":50.489740000,"lon":-104.683971667,"alt":562.500,"epx":12.458,"epy":20.312,"epv":64.400,"track":357.9700,"speed":0.116,"climb":-1.100,"mode":3}
$GPGGA,021645.947,5029.3848,N,10441.0383,W,1,06,1.4,561.4,M,-20.3,M,0.0,0000*46
@@ -216,7 +216,7 @@ $GPGSA,A,3,17,28,11,26,29,,,,,,,,3.5,2.0,2.8*3F
$GPGSV,3,1,9,8,48,156,0,17,50,212,34,28,82,39,35,11,38,84,33*4A
$GPGSV,3,2,9,26,32,277,37,29,31,269,34,19,6,48,0,27,22,152,28*7A
$GPGSV,3,3,9,124,0,0,0*47
-{"class":"SKY","tag":"GSV","vdop":2.80,"hdop":2.00,"pdop":3.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":34,"used":true},{"PRN":28,"el":82,"az":39,"ss":35,"used":true},{"PRN":11,"el":38,"az":84,"ss":33,"used":true},{"PRN":26,"el":32,"az":277,"ss":37,"used":true},{"PRN":29,"el":31,"az":269,"ss":34,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":28,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.83,"ydop":1.36,"vdop":2.80,"tdop":2.18,"hdop":2.00,"gdop":4.00,"pdop":3.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":34,"used":true},{"PRN":28,"el":82,"az":39,"ss":35,"used":true},{"PRN":11,"el":38,"az":84,"ss":33,"used":true},{"PRN":26,"el":32,"az":277,"ss":37,"used":true},{"PRN":29,"el":31,"az":269,"ss":34,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":28,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021649.947,A,5029.3856,N,10441.0379,W,0.118754,16.61,280706,,*2D
{"class":"TPV","tag":"RMC","time":1154053009.947,"ept":0.005,"lat":50.489760000,"lon":-104.683965000,"alt":559.300,"epx":12.462,"epy":20.352,"epv":64.400,"track":16.6100,"speed":0.061,"climb":-0.700,"mode":3}
$GPGGA,021650.947,5029.3857,N,10441.0380,W,1,05,2.0,559.1,M,-20.3,M,0.0,0000*45
@@ -245,7 +245,7 @@ $GPGSA,A,3,17,28,11,26,29,,,,,,,,3.5,2.0,2.8*3F
$GPGSV,3,1,9,8,48,156,0,17,50,212,34,28,82,39,36,11,38,84,33*49
$GPGSV,3,2,9,26,32,277,37,29,31,269,34,19,6,48,0,27,22,152,0*40
$GPGSV,3,3,9,124,0,0,0*47
-{"class":"SKY","tag":"GSV","vdop":2.80,"hdop":2.00,"pdop":3.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":34,"used":true},{"PRN":28,"el":82,"az":39,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":33,"used":true},{"PRN":26,"el":32,"az":277,"ss":37,"used":true},{"PRN":29,"el":31,"az":269,"ss":34,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":0,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.83,"ydop":1.36,"vdop":2.80,"tdop":2.18,"hdop":2.00,"gdop":4.00,"pdop":3.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":34,"used":true},{"PRN":28,"el":82,"az":39,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":33,"used":true},{"PRN":26,"el":32,"az":277,"ss":37,"used":true},{"PRN":29,"el":31,"az":269,"ss":34,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":0,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021654.947,A,5029.3855,N,10441.0381,W,0.142516,3.80,280706,,*15
{"class":"TPV","tag":"RMC","time":1154053014.947,"ept":0.005,"lat":50.489758333,"lon":-104.683968333,"alt":559.500,"epx":12.462,"epy":20.352,"epv":64.400,"track":3.8000,"speed":0.073,"climb":0.100,"mode":3}
$GPGGA,021655.947,5029.3855,N,10441.0381,W,1,05,2.0,559.8,M,-20.3,M,0.0,0000*4A
@@ -274,7 +274,7 @@ $GPGSA,A,3,17,28,11,26,29,,,,,,,,3.5,2.0,2.8*3F
$GPGSV,3,1,9,8,48,156,0,17,50,212,33,28,82,39,36,11,38,84,32*4F
$GPGSV,3,2,9,26,32,277,36,29,31,269,34,19,6,48,0,27,22,152,27*74
$GPGSV,3,3,9,124,0,0,0*47
-{"class":"SKY","tag":"GSV","vdop":2.80,"hdop":2.00,"pdop":3.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":33,"used":true},{"PRN":28,"el":82,"az":39,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":32,"used":true},{"PRN":26,"el":32,"az":277,"ss":36,"used":true},{"PRN":29,"el":31,"az":269,"ss":34,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":27,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.83,"ydop":1.36,"vdop":2.80,"tdop":2.18,"hdop":2.00,"gdop":4.00,"pdop":3.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":33,"used":true},{"PRN":28,"el":82,"az":39,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":32,"used":true},{"PRN":26,"el":32,"az":277,"ss":36,"used":true},{"PRN":29,"el":31,"az":269,"ss":34,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":27,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021659.946,A,5029.3855,N,10441.0376,W,0.144243,359.38,280706,,*1F
{"class":"TPV","tag":"RMC","time":1154053019.946,"ept":0.005,"lat":50.489758333,"lon":-104.683960000,"alt":559.800,"epx":12.462,"epy":20.352,"epv":64.400,"track":359.3800,"speed":0.074,"climb":-0.200,"mode":3}
$GPGGA,021700.946,5029.3856,N,10441.0373,W,1,05,2.0,559.4,M,-20.3,M,0.0,0000*48
@@ -303,7 +303,7 @@ $GPGSA,A,3,08,17,28,11,26,29,27,,,,,,2.5,1.3,2.1*3A
$GPGSV,3,1,9,8,48,156,31,17,50,212,32,28,82,39,39,11,38,84,33*72
$GPGSV,3,2,9,26,32,277,37,29,31,269,34,19,6,48,0,27,22,152,30*73
$GPGSV,3,3,9,124,0,0,0*47
-{"class":"SKY","tag":"GSV","vdop":2.10,"hdop":1.30,"pdop":2.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":31,"used":true},{"PRN":17,"el":50,"az":212,"ss":32,"used":true},{"PRN":28,"el":82,"az":39,"ss":39,"used":true},{"PRN":11,"el":38,"az":84,"ss":33,"used":true},{"PRN":26,"el":32,"az":277,"ss":37,"used":true},{"PRN":29,"el":31,"az":269,"ss":34,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":30,"used":true},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.62,"ydop":1.27,"vdop":2.10,"tdop":1.22,"hdop":1.30,"gdop":2.69,"pdop":2.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":31,"used":true},{"PRN":17,"el":50,"az":212,"ss":32,"used":true},{"PRN":28,"el":82,"az":39,"ss":39,"used":true},{"PRN":11,"el":38,"az":84,"ss":33,"used":true},{"PRN":26,"el":32,"az":277,"ss":37,"used":true},{"PRN":29,"el":31,"az":269,"ss":34,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":30,"used":true},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021704.946,A,5029.3858,N,10441.0363,W,0.096613,335.19,280706,,*19
{"class":"TPV","tag":"RMC","time":1154053024.946,"ept":0.005,"lat":50.489763333,"lon":-104.683938333,"alt":556.000,"epx":9.353,"epy":18.976,"epv":64.400,"track":335.1900,"speed":0.050,"climb":-0.800,"mode":3}
$GPGGA,021705.946,5029.3859,N,10441.0363,W,1,07,1.3,555.4,M,-20.3,M,0.0,0000*4D
@@ -313,3 +313,4 @@ $GPRMC,021705.946,A,5029.3859,N,10441.0363,W,0.061763,22.98,280706,,*2B
{"class":"TPV","tag":"RMC","time":1154053025.946,"ept":0.005,"lat":50.489765000,"lon":-104.683938333,"alt":555.400,"epx":9.353,"epy":18.976,"epv":48.300,"track":22.9800,"speed":0.032,"climb":-0.600,"eps":37.95,"mode":3}
$GPGGA,021706.946,5029.3860,N,10441.0364,W,1,07,1.3,554.9,M,-20.3,M,0.0,0000*4F
$GPGLL,5029.3860,N,10441.0364,W,021706.946,A*2D
+$GPGSA,A,3,08,17,28,11,26,29,27,,,,,,2.5,1.3,2.1*3A
diff --git a/test/daemon/gpslim236.log.chk b/test/daemon/gpslim236.log.chk
index d85555d8..6fca381e 100644
--- a/test/daemon/gpslim236.log.chk
+++ b/test/daemon/gpslim236.log.chk
@@ -5,7 +5,7 @@ $GPGSA,A,3,14,01,30,06,09,,,,,,,,2.8,1.7,2.2*36
$GPGSV,3,1,11,30,79,308,20,05,54,079,16,06,43,204,29,14,39,247,41*75
$GPGSV,3,2,11,01,31,303,31,02,28,077,20,25,17,309,,09,17,138,25*7A
$GPGSV,3,3,11,04,14,040,,24,02,020,,20,00,342,*4D
-{"class":"SKY","tag":"GSV","vdop":2.20,"hdop":1.70,"pdop":2.80,"satellites":[{"PRN":30,"el":79,"az":308,"ss":20,"used":true},{"PRN":5,"el":54,"az":79,"ss":16,"used":false},{"PRN":6,"el":43,"az":204,"ss":29,"used":true},{"PRN":14,"el":39,"az":247,"ss":41,"used":true},{"PRN":1,"el":31,"az":303,"ss":31,"used":true},{"PRN":2,"el":28,"az":77,"ss":20,"used":false},{"PRN":25,"el":17,"az":309,"ss":0,"used":false},{"PRN":9,"el":17,"az":138,"ss":25,"used":true},{"PRN":4,"el":14,"az":40,"ss":0,"used":false},{"PRN":24,"el":2,"az":20,"ss":0,"used":false},{"PRN":20,"el":0,"az":342,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.21,"ydop":1.14,"vdop":2.20,"tdop":2.85,"hdop":1.70,"gdop":4.89,"pdop":2.80,"satellites":[{"PRN":30,"el":79,"az":308,"ss":20,"used":true},{"PRN":5,"el":54,"az":79,"ss":16,"used":false},{"PRN":6,"el":43,"az":204,"ss":29,"used":true},{"PRN":14,"el":39,"az":247,"ss":41,"used":true},{"PRN":1,"el":31,"az":303,"ss":31,"used":true},{"PRN":2,"el":28,"az":77,"ss":20,"used":false},{"PRN":25,"el":17,"az":309,"ss":0,"used":false},{"PRN":9,"el":17,"az":138,"ss":25,"used":true},{"PRN":4,"el":14,"az":40,"ss":0,"used":false},{"PRN":24,"el":2,"az":20,"ss":0,"used":false},{"PRN":20,"el":0,"az":342,"ss":0,"used":false}]}
$GPRMC,185244.000,A,4854.2575,N,00219.9816,E,0.00,296.61,210706,,,A*6C
{"class":"TPV","tag":"RMC","time":1153507964.000,"ept":0.005,"lat":48.904291667,"lon":2.333026667,"alt":124.400,"epx":18.222,"epy":17.174,"epv":50.600,"track":296.6100,"speed":0.000,"mode":3}
$GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07
@@ -30,7 +30,7 @@ $GPGSA,A,3,14,01,30,06,09,,,,,,,,2.8,1.7,2.2*36
$GPGSV,3,1,11,30,79,308,22,05,54,079,16,06,43,204,28,14,39,247,41*76
$GPGSV,3,2,11,01,31,303,31,02,28,077,21,25,17,309,07,09,17,138,25*7C
$GPGSV,3,3,11,04,14,040,15,24,02,020,17,20,00,342,13*4D
-{"class":"SKY","tag":"GSV","vdop":2.20,"hdop":1.70,"pdop":2.80,"satellites":[{"PRN":30,"el":79,"az":308,"ss":22,"used":true},{"PRN":5,"el":54,"az":79,"ss":16,"used":false},{"PRN":6,"el":43,"az":204,"ss":28,"used":true},{"PRN":14,"el":39,"az":247,"ss":41,"used":true},{"PRN":1,"el":31,"az":303,"ss":31,"used":true},{"PRN":2,"el":28,"az":77,"ss":21,"used":false},{"PRN":25,"el":17,"az":309,"ss":7,"used":false},{"PRN":9,"el":17,"az":138,"ss":25,"used":true},{"PRN":4,"el":14,"az":40,"ss":15,"used":false},{"PRN":24,"el":2,"az":20,"ss":17,"used":false},{"PRN":20,"el":0,"az":342,"ss":13,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.21,"ydop":1.14,"vdop":2.20,"tdop":2.85,"hdop":1.70,"gdop":4.89,"pdop":2.80,"satellites":[{"PRN":30,"el":79,"az":308,"ss":22,"used":true},{"PRN":5,"el":54,"az":79,"ss":16,"used":false},{"PRN":6,"el":43,"az":204,"ss":28,"used":true},{"PRN":14,"el":39,"az":247,"ss":41,"used":true},{"PRN":1,"el":31,"az":303,"ss":31,"used":true},{"PRN":2,"el":28,"az":77,"ss":21,"used":false},{"PRN":25,"el":17,"az":309,"ss":7,"used":false},{"PRN":9,"el":17,"az":138,"ss":25,"used":true},{"PRN":4,"el":14,"az":40,"ss":15,"used":false},{"PRN":24,"el":2,"az":20,"ss":17,"used":false},{"PRN":20,"el":0,"az":342,"ss":13,"used":false}]}
$GPRMC,185249.000,A,4854.2572,N,00219.9810,E,0.00,296.61,210706,,,A*60
{"class":"TPV","tag":"RMC","time":1153507969.000,"ept":0.005,"lat":48.904286667,"lon":2.333016667,"alt":123.000,"epx":18.222,"epy":17.174,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-0.600,"eps":36.44,"mode":3}
$GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07
@@ -55,7 +55,7 @@ $GPGSA,A,3,14,01,30,06,09,,,,,,,,2.8,1.7,2.2*36
$GPGSV,3,1,11,30,79,308,23,05,54,079,17,06,43,204,28,14,39,247,40*77
$GPGSV,3,2,11,01,31,303,31,02,28,077,20,25,17,309,11,09,17,138,25*7A
$GPGSV,3,3,11,04,14,040,08,24,02,020,11,20,00,342,*45
-{"class":"SKY","tag":"GSV","vdop":2.20,"hdop":1.70,"pdop":2.80,"satellites":[{"PRN":30,"el":79,"az":308,"ss":23,"used":true},{"PRN":5,"el":54,"az":79,"ss":17,"used":false},{"PRN":6,"el":43,"az":204,"ss":28,"used":true},{"PRN":14,"el":39,"az":247,"ss":40,"used":true},{"PRN":1,"el":31,"az":303,"ss":31,"used":true},{"PRN":2,"el":28,"az":77,"ss":20,"used":false},{"PRN":25,"el":17,"az":309,"ss":11,"used":false},{"PRN":9,"el":17,"az":138,"ss":25,"used":true},{"PRN":4,"el":14,"az":40,"ss":8,"used":false},{"PRN":24,"el":2,"az":20,"ss":11,"used":false},{"PRN":20,"el":0,"az":342,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.21,"ydop":1.14,"vdop":2.20,"tdop":2.85,"hdop":1.70,"gdop":4.89,"pdop":2.80,"satellites":[{"PRN":30,"el":79,"az":308,"ss":23,"used":true},{"PRN":5,"el":54,"az":79,"ss":17,"used":false},{"PRN":6,"el":43,"az":204,"ss":28,"used":true},{"PRN":14,"el":39,"az":247,"ss":40,"used":true},{"PRN":1,"el":31,"az":303,"ss":31,"used":true},{"PRN":2,"el":28,"az":77,"ss":20,"used":false},{"PRN":25,"el":17,"az":309,"ss":11,"used":false},{"PRN":9,"el":17,"az":138,"ss":25,"used":true},{"PRN":4,"el":14,"az":40,"ss":8,"used":false},{"PRN":24,"el":2,"az":20,"ss":11,"used":false},{"PRN":20,"el":0,"az":342,"ss":0,"used":false}]}
$GPRMC,185254.000,A,4854.2565,N,00219.9796,E,0.00,296.61,210706,,,A*6B
{"class":"TPV","tag":"RMC","time":1153507974.000,"ept":0.005,"lat":48.904275000,"lon":2.332993333,"alt":118.100,"epx":18.222,"epy":17.174,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-3.000,"eps":36.44,"mode":3}
$GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07
@@ -80,7 +80,7 @@ $GPGSA,A,3,14,01,30,06,09,,,,,,,,2.8,1.7,2.2*36
$GPGSV,3,1,11,30,79,308,24,05,54,079,17,06,43,204,29,14,39,247,40*71
$GPGSV,3,2,11,01,31,303,31,02,28,077,13,25,17,309,10,09,17,138,25*7B
$GPGSV,3,3,11,04,14,040,10,24,02,020,18,20,00,342,09*4C
-{"class":"SKY","tag":"GSV","vdop":2.20,"hdop":1.70,"pdop":2.80,"satellites":[{"PRN":30,"el":79,"az":308,"ss":24,"used":true},{"PRN":5,"el":54,"az":79,"ss":17,"used":false},{"PRN":6,"el":43,"az":204,"ss":29,"used":true},{"PRN":14,"el":39,"az":247,"ss":40,"used":true},{"PRN":1,"el":31,"az":303,"ss":31,"used":true},{"PRN":2,"el":28,"az":77,"ss":13,"used":false},{"PRN":25,"el":17,"az":309,"ss":10,"used":false},{"PRN":9,"el":17,"az":138,"ss":25,"used":true},{"PRN":4,"el":14,"az":40,"ss":10,"used":false},{"PRN":24,"el":2,"az":20,"ss":18,"used":false},{"PRN":20,"el":0,"az":342,"ss":9,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.21,"ydop":1.14,"vdop":2.20,"tdop":2.85,"hdop":1.70,"gdop":4.89,"pdop":2.80,"satellites":[{"PRN":30,"el":79,"az":308,"ss":24,"used":true},{"PRN":5,"el":54,"az":79,"ss":17,"used":false},{"PRN":6,"el":43,"az":204,"ss":29,"used":true},{"PRN":14,"el":39,"az":247,"ss":40,"used":true},{"PRN":1,"el":31,"az":303,"ss":31,"used":true},{"PRN":2,"el":28,"az":77,"ss":13,"used":false},{"PRN":25,"el":17,"az":309,"ss":10,"used":false},{"PRN":9,"el":17,"az":138,"ss":25,"used":true},{"PRN":4,"el":14,"az":40,"ss":10,"used":false},{"PRN":24,"el":2,"az":20,"ss":18,"used":false},{"PRN":20,"el":0,"az":342,"ss":9,"used":false}]}
$GPRMC,185259.000,A,4854.2550,N,00219.9764,E,0.00,296.61,210706,,,A*6D
{"class":"TPV","tag":"RMC","time":1153507979.000,"ept":0.005,"lat":48.904250000,"lon":2.332940000,"alt":105.300,"epx":18.222,"epy":17.174,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-3.100,"eps":36.44,"mode":3}
$GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07
@@ -105,7 +105,7 @@ $GPGSA,A,3,14,01,30,06,09,,,,,,,,2.8,1.7,2.2*36
$GPGSV,3,1,11,30,79,308,24,05,54,079,18,06,43,204,31,14,39,247,40*77
$GPGSV,3,2,11,01,31,303,31,02,28,077,11,25,17,309,13,09,17,138,24*7B
$GPGSV,3,3,11,04,14,040,10,24,02,020,07,20,00,342,12*48
-{"class":"SKY","tag":"GSV","vdop":2.20,"hdop":1.70,"pdop":2.80,"satellites":[{"PRN":30,"el":79,"az":308,"ss":24,"used":true},{"PRN":5,"el":54,"az":79,"ss":18,"used":false},{"PRN":6,"el":43,"az":204,"ss":31,"used":true},{"PRN":14,"el":39,"az":247,"ss":40,"used":true},{"PRN":1,"el":31,"az":303,"ss":31,"used":true},{"PRN":2,"el":28,"az":77,"ss":11,"used":false},{"PRN":25,"el":17,"az":309,"ss":13,"used":false},{"PRN":9,"el":17,"az":138,"ss":24,"used":true},{"PRN":4,"el":14,"az":40,"ss":10,"used":false},{"PRN":24,"el":2,"az":20,"ss":7,"used":false},{"PRN":20,"el":0,"az":342,"ss":12,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.21,"ydop":1.14,"vdop":2.20,"tdop":2.85,"hdop":1.70,"gdop":4.89,"pdop":2.80,"satellites":[{"PRN":30,"el":79,"az":308,"ss":24,"used":true},{"PRN":5,"el":54,"az":79,"ss":18,"used":false},{"PRN":6,"el":43,"az":204,"ss":31,"used":true},{"PRN":14,"el":39,"az":247,"ss":40,"used":true},{"PRN":1,"el":31,"az":303,"ss":31,"used":true},{"PRN":2,"el":28,"az":77,"ss":11,"used":false},{"PRN":25,"el":17,"az":309,"ss":13,"used":false},{"PRN":9,"el":17,"az":138,"ss":24,"used":true},{"PRN":4,"el":14,"az":40,"ss":10,"used":false},{"PRN":24,"el":2,"az":20,"ss":7,"used":false},{"PRN":20,"el":0,"az":342,"ss":12,"used":false}]}
$GPRMC,185304.000,A,4854.2543,N,00219.9749,E,0.00,296.61,210706,,,A*69
{"class":"TPV","tag":"RMC","time":1153507984.000,"ept":0.005,"lat":48.904238333,"lon":2.332915000,"alt":99.300,"epx":18.222,"epy":17.174,"epv":50.600,"track":296.6100,"speed":0.000,"climb":-0.200,"eps":36.44,"mode":3}
$GPVTG,296.61,T,,M,0.00,N,0.0,K,A*07
@@ -130,7 +130,7 @@ $GPGSA,A,3,14,01,30,06,09,,,,,,,,2.8,1.7,2.2*36
$GPGSV,3,1,11,30,79,308,23,05,54,079,18,06,43,204,32,14,39,247,40*73
$GPGSV,3,2,11,01,31,303,31,02,28,077,15,25,17,309,11,09,17,138,24*7D
$GPGSV,3,3,11,04,14,040,,24,02,020,,20,00,342,11*4D
-{"class":"SKY","tag":"GSV","vdop":2.20,"hdop":1.70,"pdop":2.80,"satellites":[{"PRN":30,"el":79,"az":308,"ss":23,"used":true},{"PRN":5,"el":54,"az":79,"ss":18,"used":false},{"PRN":6,"el":43,"az":204,"ss":32,"used":true},{"PRN":14,"el":39,"az":247,"ss":40,"used":true},{"PRN":1,"el":31,"az":303,"ss":31,"used":true},{"PRN":2,"el":28,"az":77,"ss":15,"used":false},{"PRN":25,"el":17,"az":309,"ss":11,"used":false},{"PRN":9,"el":17,"az":138,"ss":24,"used":true},{"PRN":4,"el":14,"az":40,"ss":0,"used":false},{"PRN":24,"el":2,"az":20,"ss":0,"used":false},{"PRN":20,"el":0,"az":342,"ss":11,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.21,"ydop":1.14,"vdop":2.20,"tdop":2.85,"hdop":1.70,"gdop":4.89,"pdop":2.80,"satellites":[{"PRN":30,"el":79,"az":308,"ss":23,"used":true},{"PRN":5,"el":54,"az":79,"ss":18,"used":false},{"PRN":6,"el":43,"az":204,"ss":32,"used":true},{"PRN":14,"el":39,"az":247,"ss":40,"used":true},{"PRN":1,"el":31,"az":303,"ss":31,"used":true},{"PRN":2,"el":28,"az":77,"ss":15,"used":false},{"PRN":25,"el":17,"az":309,"ss":11,"used":false},{"PRN":9,"el":17,"az":138,"ss":24,"used":true},{"PRN":4,"el":14,"az":40,"ss":0,"used":false},{"PRN":24,"el":2,"az":20,"ss":0,"used":false},{"PRN":20,"el":0,"az":342,"ss":11,"used":false}]}
$GPRMC,185309.000,A,4854.2542,N,00219.9744,E,0.00,277.83,210706,,,A*6B
{"class":"TPV","tag":"RMC","time":1153507989.000,"ept":0.005,"lat":48.904236667,"lon":2.332906667,"alt":98.400,"epx":18.222,"epy":17.174,"epv":50.600,"track":277.8300,"speed":0.000,"climb":-0.400,"eps":36.44,"mode":3}
$GPVTG,277.83,T,,M,0.00,N,0.0,K,A*04
@@ -155,7 +155,7 @@ $GPGSA,A,3,14,01,30,06,09,,,,,,,,2.8,1.7,2.2*36
$GPGSV,3,1,11,30,79,308,22,05,54,079,19,06,43,204,33,14,39,247,40*72
$GPGSV,3,2,11,01,31,303,30,02,28,077,,25,17,309,08,09,17,138,23*77
$GPGSV,3,3,11,04,14,040,14,24,02,020,09,20,00,342,08*49
-{"class":"SKY","tag":"GSV","vdop":2.20,"hdop":1.70,"pdop":2.80,"satellites":[{"PRN":30,"el":79,"az":308,"ss":22,"used":true},{"PRN":5,"el":54,"az":79,"ss":19,"used":false},{"PRN":6,"el":43,"az":204,"ss":33,"used":true},{"PRN":14,"el":39,"az":247,"ss":40,"used":true},{"PRN":1,"el":31,"az":303,"ss":30,"used":true},{"PRN":2,"el":28,"az":77,"ss":0,"used":false},{"PRN":25,"el":17,"az":309,"ss":8,"used":false},{"PRN":9,"el":17,"az":138,"ss":23,"used":true},{"PRN":4,"el":14,"az":40,"ss":14,"used":false},{"PRN":24,"el":2,"az":20,"ss":9,"used":false},{"PRN":20,"el":0,"az":342,"ss":8,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.21,"ydop":1.14,"vdop":2.20,"tdop":2.85,"hdop":1.70,"gdop":4.89,"pdop":2.80,"satellites":[{"PRN":30,"el":79,"az":308,"ss":22,"used":true},{"PRN":5,"el":54,"az":79,"ss":19,"used":false},{"PRN":6,"el":43,"az":204,"ss":33,"used":true},{"PRN":14,"el":39,"az":247,"ss":40,"used":true},{"PRN":1,"el":31,"az":303,"ss":30,"used":true},{"PRN":2,"el":28,"az":77,"ss":0,"used":false},{"PRN":25,"el":17,"az":309,"ss":8,"used":false},{"PRN":9,"el":17,"az":138,"ss":23,"used":true},{"PRN":4,"el":14,"az":40,"ss":14,"used":false},{"PRN":24,"el":2,"az":20,"ss":9,"used":false},{"PRN":20,"el":0,"az":342,"ss":8,"used":false}]}
$GPRMC,185314.000,A,4854.2542,N,00219.9750,E,1.06,270.56,210706,,,A*6A
{"class":"TPV","tag":"RMC","time":1153507994.000,"ept":0.005,"lat":48.904236667,"lon":2.332916667,"alt":98.500,"epx":18.222,"epy":17.174,"epv":50.600,"track":270.5600,"speed":0.545,"climb":0.100,"eps":36.44,"mode":3}
$GPVTG,270.56,T,,M,1.06,N,2.0,K,A*0E
@@ -180,7 +180,7 @@ $GPGSA,A,3,14,01,30,06,09,,,,,,,,2.7,1.7,2.2*39
$GPGSV,3,1,11,30,79,308,21,05,54,079,19,06,43,204,34,14,39,247,40*76
$GPGSV,3,2,11,01,31,303,30,02,28,077,,25,17,309,14,09,17,138,23*7A
$GPGSV,3,3,11,04,14,040,10,24,02,020,09,20,00,342,12*46
-{"class":"SKY","tag":"GSV","vdop":2.20,"hdop":1.70,"pdop":2.70,"satellites":[{"PRN":30,"el":79,"az":308,"ss":21,"used":true},{"PRN":5,"el":54,"az":79,"ss":19,"used":false},{"PRN":6,"el":43,"az":204,"ss":34,"used":true},{"PRN":14,"el":39,"az":247,"ss":40,"used":true},{"PRN":1,"el":31,"az":303,"ss":30,"used":true},{"PRN":2,"el":28,"az":77,"ss":0,"used":false},{"PRN":25,"el":17,"az":309,"ss":14,"used":false},{"PRN":9,"el":17,"az":138,"ss":23,"used":true},{"PRN":4,"el":14,"az":40,"ss":10,"used":false},{"PRN":24,"el":2,"az":20,"ss":9,"used":false},{"PRN":20,"el":0,"az":342,"ss":12,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.21,"ydop":1.14,"vdop":2.20,"tdop":2.85,"hdop":1.70,"gdop":4.89,"pdop":2.70,"satellites":[{"PRN":30,"el":79,"az":308,"ss":21,"used":true},{"PRN":5,"el":54,"az":79,"ss":19,"used":false},{"PRN":6,"el":43,"az":204,"ss":34,"used":true},{"PRN":14,"el":39,"az":247,"ss":40,"used":true},{"PRN":1,"el":31,"az":303,"ss":30,"used":true},{"PRN":2,"el":28,"az":77,"ss":0,"used":false},{"PRN":25,"el":17,"az":309,"ss":14,"used":false},{"PRN":9,"el":17,"az":138,"ss":23,"used":true},{"PRN":4,"el":14,"az":40,"ss":10,"used":false},{"PRN":24,"el":2,"az":20,"ss":9,"used":false},{"PRN":20,"el":0,"az":342,"ss":12,"used":false}]}
$GPRMC,185319.000,A,4854.2546,N,00219.9758,E,0.00,270.56,210706,,,A*6C
{"class":"TPV","tag":"RMC","time":1153507999.000,"ept":0.005,"lat":48.904243333,"lon":2.332930000,"alt":100.300,"epx":18.222,"epy":17.174,"epv":50.600,"track":270.5600,"speed":0.000,"climb":-0.800,"eps":36.44,"mode":3}
$GPVTG,270.56,T,,M,0.00,N,0.0,K,A*0B
@@ -205,7 +205,7 @@ $GPGSA,A,3,14,01,30,06,09,,,,,,,,2.7,1.7,2.2*39
$GPGSV,3,1,11,30,79,308,20,05,54,079,18,06,43,204,35,14,39,247,40*77
$GPGSV,3,2,11,01,31,303,30,02,28,077,,25,17,309,11,09,17,138,22*7E
$GPGSV,3,3,11,04,14,040,,24,02,020,08,20,00,342,08*4D
-{"class":"SKY","tag":"GSV","vdop":2.20,"hdop":1.70,"pdop":2.70,"satellites":[{"PRN":30,"el":79,"az":308,"ss":20,"used":true},{"PRN":5,"el":54,"az":79,"ss":18,"used":false},{"PRN":6,"el":43,"az":204,"ss":35,"used":true},{"PRN":14,"el":39,"az":247,"ss":40,"used":true},{"PRN":1,"el":31,"az":303,"ss":30,"used":true},{"PRN":2,"el":28,"az":77,"ss":0,"used":false},{"PRN":25,"el":17,"az":309,"ss":11,"used":false},{"PRN":9,"el":17,"az":138,"ss":22,"used":true},{"PRN":4,"el":14,"az":40,"ss":0,"used":false},{"PRN":24,"el":2,"az":20,"ss":8,"used":false},{"PRN":20,"el":0,"az":342,"ss":8,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.21,"ydop":1.14,"vdop":2.20,"tdop":2.85,"hdop":1.70,"gdop":4.89,"pdop":2.70,"satellites":[{"PRN":30,"el":79,"az":308,"ss":20,"used":true},{"PRN":5,"el":54,"az":79,"ss":18,"used":false},{"PRN":6,"el":43,"az":204,"ss":35,"used":true},{"PRN":14,"el":39,"az":247,"ss":40,"used":true},{"PRN":1,"el":31,"az":303,"ss":30,"used":true},{"PRN":2,"el":28,"az":77,"ss":0,"used":false},{"PRN":25,"el":17,"az":309,"ss":11,"used":false},{"PRN":9,"el":17,"az":138,"ss":22,"used":true},{"PRN":4,"el":14,"az":40,"ss":0,"used":false},{"PRN":24,"el":2,"az":20,"ss":8,"used":false},{"PRN":20,"el":0,"az":342,"ss":8,"used":false}]}
$GPRMC,185324.000,A,4854.2545,N,00219.9754,E,0.00,261.85,210706,,,A*63
{"class":"TPV","tag":"RMC","time":1153508004.000,"ept":0.005,"lat":48.904241667,"lon":2.332923333,"alt":99.500,"epx":18.222,"epy":17.174,"epv":50.600,"track":261.8500,"speed":0.000,"climb":0.000,"eps":36.44,"mode":3}
$GPVTG,261.85,T,,M,0.00,N,0.0,K,A*05
diff --git a/test/daemon/haicom-305N.log.chk b/test/daemon/haicom-305N.log.chk
index 588f75fa..82c10dab 100644
--- a/test/daemon/haicom-305N.log.chk
+++ b/test/daemon/haicom-305N.log.chk
@@ -52,7 +52,7 @@ $GPGSA,A,2,05,07,12,30,,,,,,,,,34.7,21.1,27.6*00
$GPGSV,3,1,12,2,15,123,,5,45,347,45,6,58,198,,7,45,212,28*7D
$GPGSV,3,2,12,10,44,132,28,12,39,002,42,18,13,332,34,21,33,266,*72
$GPGSV,3,3,12,24,58,220,,26,17,054,,29,20,063,,30,60,311,44*78
-{"class":"SKY","tag":"GSV","vdop":27.60,"hdop":21.10,"pdop":34.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":45,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":28,"used":true},{"PRN":10,"el":44,"az":132,"ss":28,"used":false},{"PRN":12,"el":39,"az":2,"ss":42,"used":true},{"PRN":18,"el":13,"az":332,"ss":34,"used":false},{"PRN":21,"el":33,"az":266,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":0,"used":false},{"PRN":26,"el":17,"az":54,"ss":0,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":44,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":2.86,"ydop":0.96,"vdop":27.60,"tdop":3.84,"hdop":21.10,"gdop":7.67,"pdop":34.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":45,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":28,"used":true},{"PRN":10,"el":44,"az":132,"ss":28,"used":false},{"PRN":12,"el":39,"az":2,"ss":42,"used":true},{"PRN":18,"el":13,"az":332,"ss":34,"used":false},{"PRN":21,"el":33,"az":266,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":0,"used":false},{"PRN":26,"el":17,"az":54,"ss":0,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":44,"used":true}]}
$GPRMC,095307.801,A,2712.6486,S,15303.1293,E,1.73,279.46,080407,,,A*75
{"class":"TPV","tag":"RMC","time":1176025987.801,"ept":0.005,"lat":-27.210810000,"lon":153.052155000,"alt":3.000,"epx":42.926,"epy":14.332,"epv":0.000,"track":279.4600,"speed":0.890,"climb":0.000,"mode":3}
$GPVTG,279.46,T,,,1.73,N,3.20,K,A*7A
@@ -69,7 +69,7 @@ $GPGSA,A,3,05,07,12,24,30,,,,,,,,11.7,7.5,9.0*0A
$GPGSV,3,1,12,2,15,123,,5,45,347,45,6,58,198,,7,45,212,30*74
$GPGSV,3,2,12,10,44,132,28,12,39,002,43,18,13,332,33,21,33,266,*74
$GPGSV,3,3,12,24,58,220,35,26,17,054,37,29,20,063,,30,60,311,45*7B
-{"class":"SKY","tag":"GSV","vdop":9.00,"hdop":7.50,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":45,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":30,"used":true},{"PRN":10,"el":44,"az":132,"ss":28,"used":false},{"PRN":12,"el":39,"az":2,"ss":43,"used":true},{"PRN":18,"el":13,"az":332,"ss":33,"used":false},{"PRN":21,"el":33,"az":266,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":35,"used":true},{"PRN":26,"el":17,"az":54,"ss":37,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":45,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":1.56,"ydop":0.95,"vdop":9.00,"tdop":2.43,"hdop":7.50,"gdop":4.62,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":45,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":30,"used":true},{"PRN":10,"el":44,"az":132,"ss":28,"used":false},{"PRN":12,"el":39,"az":2,"ss":43,"used":true},{"PRN":18,"el":13,"az":332,"ss":33,"used":false},{"PRN":21,"el":33,"az":266,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":35,"used":true},{"PRN":26,"el":17,"az":54,"ss":37,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":45,"used":true}]}
$GPRMC,095310.801,A,2712.6428,S,15303.1203,E,0.00,307.41,080407,,,A*74
{"class":"TPV","tag":"RMC","time":1176025990.801,"ept":0.005,"lat":-27.210713333,"lon":153.052005000,"alt":3.000,"epx":42.926,"epy":14.332,"epv":634.800,"track":307.4100,"speed":0.000,"climb":0.000,"eps":85.85,"mode":3}
$GPVTG,307.41,T,,,0.00,N,0.00,K,A*71
@@ -86,7 +86,7 @@ $GPGSA,A,3,05,07,12,24,30,,,,,,,,11.7,7.5,9.0*0A
$GPGSV,3,1,12,2,15,123,,5,45,347,45,6,58,198,,7,45,212,32*76
$GPGSV,3,2,12,10,44,132,26,12,39,002,44,18,13,332,31,21,33,266,*7F
$GPGSV,3,3,12,24,58,220,37,26,17,054,37,29,20,063,,30,60,311,45*79
-{"class":"SKY","tag":"GSV","vdop":9.00,"hdop":7.50,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":45,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":32,"used":true},{"PRN":10,"el":44,"az":132,"ss":26,"used":false},{"PRN":12,"el":39,"az":2,"ss":44,"used":true},{"PRN":18,"el":13,"az":332,"ss":31,"used":false},{"PRN":21,"el":33,"az":266,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":37,"used":true},{"PRN":26,"el":17,"az":54,"ss":37,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":45,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":1.56,"ydop":0.95,"vdop":9.00,"tdop":2.43,"hdop":7.50,"gdop":4.62,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":45,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":32,"used":true},{"PRN":10,"el":44,"az":132,"ss":26,"used":false},{"PRN":12,"el":39,"az":2,"ss":44,"used":true},{"PRN":18,"el":13,"az":332,"ss":31,"used":false},{"PRN":21,"el":33,"az":266,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":37,"used":true},{"PRN":26,"el":17,"az":54,"ss":37,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":45,"used":true}]}
$GPRMC,095313.800,A,2712.6402,S,15303.1209,E,3.47,312.27,080407,,,A*70
{"class":"TPV","tag":"RMC","time":1176025993.800,"ept":0.005,"lat":-27.210670000,"lon":153.052015000,"alt":8.600,"epx":23.367,"epy":14.300,"epv":207.000,"track":312.2700,"speed":1.785,"climb":4.100,"eps":46.73,"mode":3}
$GPVTG,312.27,T,,,3.47,N,6.42,K,A*75
@@ -103,7 +103,7 @@ $GPGSA,A,3,05,07,12,24,30,,,,,,,,11.7,7.5,9.0*0A
$GPGSV,3,1,12,2,15,123,,5,45,347,45,6,58,198,,7,45,212,33*77
$GPGSV,3,2,12,10,44,132,23,12,39,002,44,18,13,332,31,21,33,266,*7A
$GPGSV,3,3,12,24,58,220,37,26,17,054,38,29,20,063,,30,60,311,45*76
-{"class":"SKY","tag":"GSV","vdop":9.00,"hdop":7.50,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":45,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":33,"used":true},{"PRN":10,"el":44,"az":132,"ss":23,"used":false},{"PRN":12,"el":39,"az":2,"ss":44,"used":true},{"PRN":18,"el":13,"az":332,"ss":31,"used":false},{"PRN":21,"el":33,"az":266,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":37,"used":true},{"PRN":26,"el":17,"az":54,"ss":38,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":45,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":1.56,"ydop":0.95,"vdop":9.00,"tdop":2.43,"hdop":7.50,"gdop":4.62,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":45,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":33,"used":true},{"PRN":10,"el":44,"az":132,"ss":23,"used":false},{"PRN":12,"el":39,"az":2,"ss":44,"used":true},{"PRN":18,"el":13,"az":332,"ss":31,"used":false},{"PRN":21,"el":33,"az":266,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":37,"used":true},{"PRN":26,"el":17,"az":54,"ss":38,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":45,"used":true}]}
$GPRMC,095316.799,A,2712.6400,S,15303.1217,E,1.83,92.94,080407,,,A*4E
{"class":"TPV","tag":"RMC","time":1176025996.799,"ept":0.005,"lat":-27.210666667,"lon":153.052028333,"alt":13.800,"epx":23.367,"epy":14.300,"epv":207.000,"track":92.9400,"speed":0.941,"climb":0.100,"eps":46.78,"mode":3}
$GPVTG,92.94,T,,,1.83,N,3.39,K,A*45
@@ -120,7 +120,7 @@ $GPGSA,A,3,05,07,12,24,30,,,,,,,,11.7,7.5,9.0*0A
$GPGSV,3,1,12,2,15,123,,5,45,347,45,6,58,198,,7,45,212,34*70
$GPGSV,3,2,12,10,44,132,27,12,39,002,44,18,13,332,32,21,33,266,*7D
$GPGSV,3,3,12,24,58,220,37,26,17,054,39,29,20,063,,30,60,311,46*74
-{"class":"SKY","tag":"GSV","vdop":9.00,"hdop":7.50,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":45,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":34,"used":true},{"PRN":10,"el":44,"az":132,"ss":27,"used":false},{"PRN":12,"el":39,"az":2,"ss":44,"used":true},{"PRN":18,"el":13,"az":332,"ss":32,"used":false},{"PRN":21,"el":33,"az":266,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":37,"used":true},{"PRN":26,"el":17,"az":54,"ss":39,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":46,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":1.56,"ydop":0.95,"vdop":9.00,"tdop":2.43,"hdop":7.50,"gdop":4.62,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":45,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":34,"used":true},{"PRN":10,"el":44,"az":132,"ss":27,"used":false},{"PRN":12,"el":39,"az":2,"ss":44,"used":true},{"PRN":18,"el":13,"az":332,"ss":32,"used":false},{"PRN":21,"el":33,"az":266,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":37,"used":true},{"PRN":26,"el":17,"az":54,"ss":39,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":46,"used":true}]}
$GPRMC,095319.799,A,2712.6420,S,15303.1303,E,5.09,100.78,080407,,,A*79
{"class":"TPV","tag":"RMC","time":1176025999.799,"ept":0.005,"lat":-27.210700000,"lon":153.052171667,"alt":22.800,"epx":23.367,"epy":14.300,"epv":207.000,"track":100.7800,"speed":2.619,"climb":4.700,"eps":46.73,"mode":3}
$GPVTG,100.78,T,,,5.09,N,9.43,K,A*7C
@@ -137,7 +137,7 @@ $GPGSA,A,3,05,07,12,24,30,,,,,,,,11.7,7.5,9.0*0A
$GPGSV,3,1,12,2,15,123,,5,45,347,44,6,58,198,,7,45,212,32*77
$GPGSV,3,2,12,10,44,132,31,12,39,002,44,18,13,332,33,21,33,266,*7B
$GPGSV,3,3,12,24,58,220,37,26,17,054,39,29,20,063,,30,60,311,45*77
-{"class":"SKY","tag":"GSV","vdop":9.00,"hdop":7.50,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":44,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":32,"used":true},{"PRN":10,"el":44,"az":132,"ss":31,"used":false},{"PRN":12,"el":39,"az":2,"ss":44,"used":true},{"PRN":18,"el":13,"az":332,"ss":33,"used":false},{"PRN":21,"el":33,"az":266,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":37,"used":true},{"PRN":26,"el":17,"az":54,"ss":39,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":45,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":1.56,"ydop":0.95,"vdop":9.00,"tdop":2.43,"hdop":7.50,"gdop":4.62,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":44,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":32,"used":true},{"PRN":10,"el":44,"az":132,"ss":31,"used":false},{"PRN":12,"el":39,"az":2,"ss":44,"used":true},{"PRN":18,"el":13,"az":332,"ss":33,"used":false},{"PRN":21,"el":33,"az":266,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":37,"used":true},{"PRN":26,"el":17,"az":54,"ss":39,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":45,"used":true}]}
$GPRMC,095322.798,A,2712.6419,S,15303.1281,E,0.99,100.78,080407,,,A*7D
{"class":"TPV","tag":"RMC","time":1176026002.798,"ept":0.005,"lat":-27.210698333,"lon":153.052135000,"alt":17.300,"epx":23.367,"epy":14.300,"epv":207.000,"track":100.7800,"speed":0.509,"climb":-0.900,"eps":46.73,"mode":3}
$GPVTG,100.78,T,,,0.99,N,1.84,K,A*73
@@ -154,7 +154,7 @@ $GPGSA,A,3,05,07,12,24,30,,,,,,,,11.7,7.5,9.0*0A
$GPGSV,3,1,12,2,15,123,,5,45,347,42,6,58,198,,7,45,212,31*72
$GPGSV,3,2,12,10,44,132,34,12,39,002,43,18,13,332,30,21,33,266,*7A
$GPGSV,3,3,12,24,58,220,37,26,17,054,40,29,20,063,,30,60,311,44*78
-{"class":"SKY","tag":"GSV","vdop":9.00,"hdop":7.50,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":42,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":31,"used":true},{"PRN":10,"el":44,"az":132,"ss":34,"used":false},{"PRN":12,"el":39,"az":2,"ss":43,"used":true},{"PRN":18,"el":13,"az":332,"ss":30,"used":false},{"PRN":21,"el":33,"az":266,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":37,"used":true},{"PRN":26,"el":17,"az":54,"ss":40,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":44,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":1.56,"ydop":0.95,"vdop":9.00,"tdop":2.43,"hdop":7.50,"gdop":4.62,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":42,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":31,"used":true},{"PRN":10,"el":44,"az":132,"ss":34,"used":false},{"PRN":12,"el":39,"az":2,"ss":43,"used":true},{"PRN":18,"el":13,"az":332,"ss":30,"used":false},{"PRN":21,"el":33,"az":266,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":37,"used":true},{"PRN":26,"el":17,"az":54,"ss":40,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":44,"used":true}]}
$GPRMC,095325.797,A,2712.6416,S,15303.1269,E,0.00,100.78,080407,,,A*7C
{"class":"TPV","tag":"RMC","time":1176026005.797,"ept":0.005,"lat":-27.210693333,"lon":153.052115000,"alt":17.700,"epx":23.367,"epy":14.300,"epv":207.000,"track":100.7800,"speed":0.000,"climb":-0.300,"eps":46.78,"mode":3}
$GPVTG,100.78,T,,,0.00,N,0.00,K,A*7E
@@ -171,7 +171,7 @@ $GPGSA,A,3,05,07,12,24,30,,,,,,,,11.7,7.5,9.0*0A
$GPGSV,3,1,12,2,15,123,,5,45,347,42,6,58,198,,7,45,212,37*74
$GPGSV,3,2,12,10,44,132,37,12,39,002,43,18,13,332,27,21,33,266,*7F
$GPGSV,3,3,12,24,58,220,40,26,17,054,39,29,20,063,,30,60,311,44*76
-{"class":"SKY","tag":"GSV","vdop":9.00,"hdop":7.50,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":42,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":37,"used":true},{"PRN":10,"el":44,"az":132,"ss":37,"used":false},{"PRN":12,"el":39,"az":2,"ss":43,"used":true},{"PRN":18,"el":13,"az":332,"ss":27,"used":false},{"PRN":21,"el":33,"az":266,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":40,"used":true},{"PRN":26,"el":17,"az":54,"ss":39,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":44,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":1.56,"ydop":0.95,"vdop":9.00,"tdop":2.43,"hdop":7.50,"gdop":4.62,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":42,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":37,"used":true},{"PRN":10,"el":44,"az":132,"ss":37,"used":false},{"PRN":12,"el":39,"az":2,"ss":43,"used":true},{"PRN":18,"el":13,"az":332,"ss":27,"used":false},{"PRN":21,"el":33,"az":266,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":40,"used":true},{"PRN":26,"el":17,"az":54,"ss":39,"used":false},{"PRN":29,"el":20,"az":63,"ss":0,"used":false},{"PRN":30,"el":60,"az":311,"ss":44,"used":true}]}
$GPRMC,095328.797,A,2712.6413,S,15303.1235,E,1.55,276.34,080407,,,A*76
{"class":"TPV","tag":"RMC","time":1176026008.797,"ept":0.005,"lat":-27.210688333,"lon":153.052058333,"alt":13.400,"epx":23.367,"epy":14.300,"epv":207.000,"track":276.3400,"speed":0.797,"climb":-0.800,"eps":46.73,"mode":3}
$GPVTG,276.34,T,,,1.55,N,2.86,K,A*79
@@ -188,7 +188,7 @@ $GPGSA,A,3,05,07,12,24,30,,,,,,,,11.7,7.5,9.0*0A
$GPGSV,3,1,12,2,15,123,,5,45,347,43,6,58,198,,7,45,212,42*77
$GPGSV,3,2,12,10,44,132,41,12,39,002,44,18,13,332,28,21,33,265,*75
$GPGSV,3,3,12,24,58,220,42,26,17,054,35,29,20,063,38,30,59,311,44*79
-{"class":"SKY","tag":"GSV","vdop":9.00,"hdop":7.50,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":43,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":42,"used":true},{"PRN":10,"el":44,"az":132,"ss":41,"used":false},{"PRN":12,"el":39,"az":2,"ss":44,"used":true},{"PRN":18,"el":13,"az":332,"ss":28,"used":false},{"PRN":21,"el":33,"az":265,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":42,"used":true},{"PRN":26,"el":17,"az":54,"ss":35,"used":false},{"PRN":29,"el":20,"az":63,"ss":38,"used":false},{"PRN":30,"el":59,"az":311,"ss":44,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":1.56,"ydop":0.95,"vdop":9.00,"tdop":2.43,"hdop":7.50,"gdop":4.62,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":43,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":42,"used":true},{"PRN":10,"el":44,"az":132,"ss":41,"used":false},{"PRN":12,"el":39,"az":2,"ss":44,"used":true},{"PRN":18,"el":13,"az":332,"ss":28,"used":false},{"PRN":21,"el":33,"az":265,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":42,"used":true},{"PRN":26,"el":17,"az":54,"ss":35,"used":false},{"PRN":29,"el":20,"az":63,"ss":38,"used":false},{"PRN":30,"el":59,"az":311,"ss":44,"used":true}]}
$GPRMC,095331.796,A,2712.6414,S,15303.1212,E,1.79,276.34,080407,,,A*73
{"class":"TPV","tag":"RMC","time":1176026011.796,"ept":0.005,"lat":-27.210690000,"lon":153.052020000,"alt":12.300,"epx":23.367,"epy":14.300,"epv":207.000,"track":276.3400,"speed":0.921,"climb":-0.100,"eps":46.73,"mode":3}
$GPVTG,276.34,T,,,1.79,N,3.32,K,A*79
@@ -201,7 +201,7 @@ $GPGSA,A,3,05,07,12,24,30,,,,,,,,11.7,7.5,9.0*0A
$GPGSV,3,1,12,2,15,123,,5,45,347,41,6,58,198,,7,45,212,44*73
$GPGSV,3,2,12,10,44,132,42,12,39,002,40,18,13,332,29,21,33,265,*73
$GPGSV,3,3,12,24,58,220,43,26,17,054,38,29,20,063,39,30,59,311,44*74
-{"class":"SKY","tag":"GSV","vdop":9.00,"hdop":7.50,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":41,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":44,"used":true},{"PRN":10,"el":44,"az":132,"ss":42,"used":false},{"PRN":12,"el":39,"az":2,"ss":40,"used":true},{"PRN":18,"el":13,"az":332,"ss":29,"used":false},{"PRN":21,"el":33,"az":265,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":43,"used":true},{"PRN":26,"el":17,"az":54,"ss":38,"used":false},{"PRN":29,"el":20,"az":63,"ss":39,"used":false},{"PRN":30,"el":59,"az":311,"ss":44,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":1.56,"ydop":0.95,"vdop":9.00,"tdop":2.43,"hdop":7.50,"gdop":4.62,"pdop":11.70,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":41,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":44,"used":true},{"PRN":10,"el":44,"az":132,"ss":42,"used":false},{"PRN":12,"el":39,"az":2,"ss":40,"used":true},{"PRN":18,"el":13,"az":332,"ss":29,"used":false},{"PRN":21,"el":33,"az":265,"ss":0,"used":false},{"PRN":24,"el":58,"az":220,"ss":43,"used":true},{"PRN":26,"el":17,"az":54,"ss":38,"used":false},{"PRN":29,"el":20,"az":63,"ss":39,"used":false},{"PRN":30,"el":59,"az":311,"ss":44,"used":true}]}
$GPRMC,095334.796,A,2712.6427,S,15303.1202,E,2.01,276.34,080407,,,A*7B
{"class":"TPV","tag":"RMC","time":1176026014.796,"ept":0.005,"lat":-27.210711667,"lon":153.052003333,"alt":11.600,"epx":23.367,"epy":14.300,"epv":207.000,"track":276.3400,"speed":1.034,"climb":-0.300,"eps":46.73,"mode":3}
$GPVTG,276.34,T,,,2.01,N,3.72,K,A*71
@@ -214,7 +214,7 @@ $GPGSA,A,3,05,07,12,21,24,30,,,,,,,4.8,2.3,4.2*3E
$GPGSV,3,1,12,2,15,123,,5,45,347,39,6,58,198,,7,45,212,44*7C
$GPGSV,3,2,12,10,44,132,42,12,39,002,38,18,13,332,27,21,33,265,36*77
$GPGSV,3,3,12,24,58,220,44,26,17,054,39,29,20,063,40,30,59,311,45*7D
-{"class":"SKY","tag":"GSV","vdop":4.20,"hdop":2.30,"pdop":4.80,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":39,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":44,"used":true},{"PRN":10,"el":44,"az":132,"ss":42,"used":false},{"PRN":12,"el":39,"az":2,"ss":38,"used":true},{"PRN":18,"el":13,"az":332,"ss":27,"used":false},{"PRN":21,"el":33,"az":265,"ss":36,"used":true},{"PRN":24,"el":58,"az":220,"ss":44,"used":true},{"PRN":26,"el":17,"az":54,"ss":39,"used":false},{"PRN":29,"el":20,"az":63,"ss":40,"used":false},{"PRN":30,"el":59,"az":311,"ss":45,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":1.56,"ydop":0.72,"vdop":4.20,"tdop":2.39,"hdop":2.30,"gdop":4.55,"pdop":4.80,"satellites":[{"PRN":2,"el":15,"az":123,"ss":0,"used":false},{"PRN":5,"el":45,"az":347,"ss":39,"used":true},{"PRN":6,"el":58,"az":198,"ss":0,"used":false},{"PRN":7,"el":45,"az":212,"ss":44,"used":true},{"PRN":10,"el":44,"az":132,"ss":42,"used":false},{"PRN":12,"el":39,"az":2,"ss":38,"used":true},{"PRN":18,"el":13,"az":332,"ss":27,"used":false},{"PRN":21,"el":33,"az":265,"ss":36,"used":true},{"PRN":24,"el":58,"az":220,"ss":44,"used":true},{"PRN":26,"el":17,"az":54,"ss":39,"used":false},{"PRN":29,"el":20,"az":63,"ss":40,"used":false},{"PRN":30,"el":59,"az":311,"ss":45,"used":true}]}
$GPRMC,095337.795,A,2712.6444,S,15303.1189,E,2.31,209.45,080407,,,A*73
{"class":"TPV","tag":"RMC","time":1176026017.795,"ept":0.005,"lat":-27.210740000,"lon":153.051981667,"alt":11.300,"epx":23.367,"epy":14.300,"epv":207.000,"track":209.4500,"speed":1.188,"climb":-0.300,"eps":46.73,"mode":3}
$GPVTG,209.45,T,,,2.31,N,4.28,K,A*74
@@ -231,7 +231,7 @@ $GPGSA,A,3,02,05,07,12,21,24,30,,,,,,3.0,1.3,2.7*33
$GPGSV,3,1,12,2,15,123,39,5,45,347,39,6,58,198,43,7,45,212,43*76
$GPGSV,3,2,12,10,44,132,43,12,39,002,37,18,13,332,25,21,33,265,35*78
$GPGSV,3,3,12,24,58,220,44,26,17,054,41,29,20,063,41,30,59,311,44*72
-{"class":"SKY","tag":"GSV","vdop":2.70,"hdop":1.30,"pdop":3.00,"satellites":[{"PRN":2,"el":15,"az":123,"ss":39,"used":true},{"PRN":5,"el":45,"az":347,"ss":39,"used":true},{"PRN":6,"el":58,"az":198,"ss":43,"used":false},{"PRN":7,"el":45,"az":212,"ss":43,"used":true},{"PRN":10,"el":44,"az":132,"ss":43,"used":false},{"PRN":12,"el":39,"az":2,"ss":37,"used":true},{"PRN":18,"el":13,"az":332,"ss":25,"used":false},{"PRN":21,"el":33,"az":265,"ss":35,"used":true},{"PRN":24,"el":58,"az":220,"ss":44,"used":true},{"PRN":26,"el":17,"az":54,"ss":41,"used":false},{"PRN":29,"el":20,"az":63,"ss":41,"used":false},{"PRN":30,"el":59,"az":311,"ss":44,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":1.04,"ydop":0.71,"vdop":2.70,"tdop":1.19,"hdop":1.30,"gdop":2.58,"pdop":3.00,"satellites":[{"PRN":2,"el":15,"az":123,"ss":39,"used":true},{"PRN":5,"el":45,"az":347,"ss":39,"used":true},{"PRN":6,"el":58,"az":198,"ss":43,"used":false},{"PRN":7,"el":45,"az":212,"ss":43,"used":true},{"PRN":10,"el":44,"az":132,"ss":43,"used":false},{"PRN":12,"el":39,"az":2,"ss":37,"used":true},{"PRN":18,"el":13,"az":332,"ss":25,"used":false},{"PRN":21,"el":33,"az":265,"ss":35,"used":true},{"PRN":24,"el":58,"az":220,"ss":44,"used":true},{"PRN":26,"el":17,"az":54,"ss":41,"used":false},{"PRN":29,"el":20,"az":63,"ss":41,"used":false},{"PRN":30,"el":59,"az":311,"ss":44,"used":true}]}
$GPRMC,095340.794,A,2712.6461,S,15303.1180,E,2.23,189.90,080407,,,A*7C
{"class":"TPV","tag":"RMC","time":1176026020.794,"ept":0.005,"lat":-27.210768333,"lon":153.051966667,"alt":10.000,"epx":23.360,"epy":10.770,"epv":96.600,"track":189.9000,"speed":1.147,"climb":-1.600,"eps":46.72,"mode":3}
$GPVTG,189.90,T,,,2.23,N,4.12,K,A*7D
@@ -248,7 +248,7 @@ $GPGSA,A,3,02,05,07,12,21,24,30,,,,,,3.0,1.3,2.7*33
$GPGSV,3,1,12,2,15,123,36,5,45,347,38,6,58,198,45,7,45,212,42*7F
$GPGSV,3,2,12,10,44,132,43,12,39,002,36,18,14,332,23,21,34,265,37*7D
$GPGSV,3,3,12,24,58,220,43,26,17,054,41,29,20,063,41,30,59,312,44*76
-{"class":"SKY","tag":"GSV","vdop":2.70,"hdop":1.30,"pdop":3.00,"satellites":[{"PRN":2,"el":15,"az":123,"ss":36,"used":true},{"PRN":5,"el":45,"az":347,"ss":38,"used":true},{"PRN":6,"el":58,"az":198,"ss":45,"used":false},{"PRN":7,"el":45,"az":212,"ss":42,"used":true},{"PRN":10,"el":44,"az":132,"ss":43,"used":false},{"PRN":12,"el":39,"az":2,"ss":36,"used":true},{"PRN":18,"el":14,"az":332,"ss":23,"used":false},{"PRN":21,"el":34,"az":265,"ss":37,"used":true},{"PRN":24,"el":58,"az":220,"ss":43,"used":true},{"PRN":26,"el":17,"az":54,"ss":41,"used":false},{"PRN":29,"el":20,"az":63,"ss":41,"used":false},{"PRN":30,"el":59,"az":312,"ss":44,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":1.05,"ydop":0.71,"vdop":2.70,"tdop":1.22,"hdop":1.30,"gdop":2.63,"pdop":3.00,"satellites":[{"PRN":2,"el":15,"az":123,"ss":36,"used":true},{"PRN":5,"el":45,"az":347,"ss":38,"used":true},{"PRN":6,"el":58,"az":198,"ss":45,"used":false},{"PRN":7,"el":45,"az":212,"ss":42,"used":true},{"PRN":10,"el":44,"az":132,"ss":43,"used":false},{"PRN":12,"el":39,"az":2,"ss":36,"used":true},{"PRN":18,"el":14,"az":332,"ss":23,"used":false},{"PRN":21,"el":34,"az":265,"ss":37,"used":true},{"PRN":24,"el":58,"az":220,"ss":43,"used":true},{"PRN":26,"el":17,"az":54,"ss":41,"used":false},{"PRN":29,"el":20,"az":63,"ss":41,"used":false},{"PRN":30,"el":59,"az":312,"ss":44,"used":true}]}
$GPRMC,095343.794,A,2712.6478,S,15303.1166,E,2.18,187.10,080407,,,A*71
{"class":"TPV","tag":"RMC","time":1176026023.794,"ept":0.005,"lat":-27.210796667,"lon":153.051943333,"alt":8.100,"epx":15.636,"epy":10.722,"epv":62.100,"track":187.1000,"speed":1.121,"climb":-1.000,"eps":31.27,"mode":3}
$GPVTG,187.10,T,,,2.18,N,4.03,K,A*73
@@ -265,7 +265,7 @@ $GPGSA,A,3,02,05,07,12,21,24,30,,,,,,3.0,1.3,2.7*33
$GPGSV,3,1,12,2,15,123,37,5,45,347,39,6,58,198,44,7,45,212,42*7E
$GPGSV,3,2,12,10,44,132,44,12,39,002,37,18,14,332,23,21,34,265,39*75
$GPGSV,3,3,12,24,58,220,41,26,17,054,42,29,20,063,41,30,59,312,43*70
-{"class":"SKY","tag":"GSV","vdop":2.70,"hdop":1.30,"pdop":3.00,"satellites":[{"PRN":2,"el":15,"az":123,"ss":37,"used":true},{"PRN":5,"el":45,"az":347,"ss":39,"used":true},{"PRN":6,"el":58,"az":198,"ss":44,"used":false},{"PRN":7,"el":45,"az":212,"ss":42,"used":true},{"PRN":10,"el":44,"az":132,"ss":44,"used":false},{"PRN":12,"el":39,"az":2,"ss":37,"used":true},{"PRN":18,"el":14,"az":332,"ss":23,"used":false},{"PRN":21,"el":34,"az":265,"ss":39,"used":true},{"PRN":24,"el":58,"az":220,"ss":41,"used":true},{"PRN":26,"el":17,"az":54,"ss":42,"used":false},{"PRN":29,"el":20,"az":63,"ss":41,"used":false},{"PRN":30,"el":59,"az":312,"ss":43,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":1.05,"ydop":0.71,"vdop":2.70,"tdop":1.22,"hdop":1.30,"gdop":2.63,"pdop":3.00,"satellites":[{"PRN":2,"el":15,"az":123,"ss":37,"used":true},{"PRN":5,"el":45,"az":347,"ss":39,"used":true},{"PRN":6,"el":58,"az":198,"ss":44,"used":false},{"PRN":7,"el":45,"az":212,"ss":42,"used":true},{"PRN":10,"el":44,"az":132,"ss":44,"used":false},{"PRN":12,"el":39,"az":2,"ss":37,"used":true},{"PRN":18,"el":14,"az":332,"ss":23,"used":false},{"PRN":21,"el":34,"az":265,"ss":39,"used":true},{"PRN":24,"el":58,"az":220,"ss":41,"used":true},{"PRN":26,"el":17,"az":54,"ss":42,"used":false},{"PRN":29,"el":20,"az":63,"ss":41,"used":false},{"PRN":30,"el":59,"az":312,"ss":43,"used":true}]}
$GPRMC,095346.793,A,2712.6494,S,15303.1153,E,2.22,194.09,080407,,,A*74
{"class":"TPV","tag":"RMC","time":1176026026.793,"ept":0.005,"lat":-27.210823333,"lon":153.051921667,"alt":7.500,"epx":15.734,"epy":10.717,"epv":62.100,"track":194.0900,"speed":1.142,"climb":0.000,"eps":31.47,"mode":3}
$GPVTG,194.09,T,,,2.22,N,4.11,K,A*73
@@ -282,7 +282,7 @@ $GPGSA,A,3,02,05,07,12,21,24,30,,,,,,3.0,1.3,2.7*33
$GPGSV,3,1,12,2,15,123,35,5,45,347,38,6,58,198,44,7,45,212,41*7E
$GPGSV,3,2,12,10,44,132,43,12,39,002,39,18,14,332,23,21,34,265,40*72
$GPGSV,3,3,12,24,58,220,40,26,17,054,41,29,20,063,42,30,59,312,44*76
-{"class":"SKY","tag":"GSV","vdop":2.70,"hdop":1.30,"pdop":3.00,"satellites":[{"PRN":2,"el":15,"az":123,"ss":35,"used":true},{"PRN":5,"el":45,"az":347,"ss":38,"used":true},{"PRN":6,"el":58,"az":198,"ss":44,"used":false},{"PRN":7,"el":45,"az":212,"ss":41,"used":true},{"PRN":10,"el":44,"az":132,"ss":43,"used":false},{"PRN":12,"el":39,"az":2,"ss":39,"used":true},{"PRN":18,"el":14,"az":332,"ss":23,"used":false},{"PRN":21,"el":34,"az":265,"ss":40,"used":true},{"PRN":24,"el":58,"az":220,"ss":40,"used":true},{"PRN":26,"el":17,"az":54,"ss":41,"used":false},{"PRN":29,"el":20,"az":63,"ss":42,"used":false},{"PRN":30,"el":59,"az":312,"ss":44,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":1.05,"ydop":0.71,"vdop":2.70,"tdop":1.22,"hdop":1.30,"gdop":2.63,"pdop":3.00,"satellites":[{"PRN":2,"el":15,"az":123,"ss":35,"used":true},{"PRN":5,"el":45,"az":347,"ss":38,"used":true},{"PRN":6,"el":58,"az":198,"ss":44,"used":false},{"PRN":7,"el":45,"az":212,"ss":41,"used":true},{"PRN":10,"el":44,"az":132,"ss":43,"used":false},{"PRN":12,"el":39,"az":2,"ss":39,"used":true},{"PRN":18,"el":14,"az":332,"ss":23,"used":false},{"PRN":21,"el":34,"az":265,"ss":40,"used":true},{"PRN":24,"el":58,"az":220,"ss":40,"used":true},{"PRN":26,"el":17,"az":54,"ss":41,"used":false},{"PRN":29,"el":20,"az":63,"ss":42,"used":false},{"PRN":30,"el":59,"az":312,"ss":44,"used":true}]}
$GPRMC,095349.792,A,2712.6511,S,15303.1147,E,2.04,188.22,080407,,,A*73
{"class":"TPV","tag":"RMC","time":1176026029.792,"ept":0.005,"lat":-27.210851667,"lon":153.051911667,"alt":7.300,"epx":15.734,"epy":10.717,"epv":62.100,"track":188.2200,"speed":1.049,"climb":-0.100,"eps":31.47,"mode":3}
$GPVTG,188.22,T,,,2.04,N,3.78,K,A*7B
@@ -299,7 +299,7 @@ $GPGSA,A,3,05,07,12,21,24,30,,,,,,,4.8,2.3,4.2*3E
$GPGSV,3,1,12,2,15,123,33,5,45,347,41,6,58,198,42,7,45,212,41*70
$GPGSV,3,2,12,10,44,132,42,12,39,002,40,18,14,332,25,21,34,265,39*75
$GPGSV,3,3,12,24,58,220,41,26,17,054,39,29,20,063,40,30,59,312,43*7D
-{"class":"SKY","tag":"GSV","vdop":4.20,"hdop":2.30,"pdop":4.80,"satellites":[{"PRN":2,"el":15,"az":123,"ss":33,"used":false},{"PRN":5,"el":45,"az":347,"ss":41,"used":true},{"PRN":6,"el":58,"az":198,"ss":42,"used":false},{"PRN":7,"el":45,"az":212,"ss":41,"used":true},{"PRN":10,"el":44,"az":132,"ss":42,"used":false},{"PRN":12,"el":39,"az":2,"ss":40,"used":true},{"PRN":18,"el":14,"az":332,"ss":25,"used":false},{"PRN":21,"el":34,"az":265,"ss":39,"used":true},{"PRN":24,"el":58,"az":220,"ss":41,"used":true},{"PRN":26,"el":17,"az":54,"ss":39,"used":false},{"PRN":29,"el":20,"az":63,"ss":40,"used":false},{"PRN":30,"el":59,"az":312,"ss":43,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":1.56,"ydop":0.72,"vdop":4.20,"tdop":2.39,"hdop":2.30,"gdop":4.55,"pdop":4.80,"satellites":[{"PRN":2,"el":15,"az":123,"ss":33,"used":false},{"PRN":5,"el":45,"az":347,"ss":41,"used":true},{"PRN":6,"el":58,"az":198,"ss":42,"used":false},{"PRN":7,"el":45,"az":212,"ss":41,"used":true},{"PRN":10,"el":44,"az":132,"ss":42,"used":false},{"PRN":12,"el":39,"az":2,"ss":40,"used":true},{"PRN":18,"el":14,"az":332,"ss":25,"used":false},{"PRN":21,"el":34,"az":265,"ss":39,"used":true},{"PRN":24,"el":58,"az":220,"ss":41,"used":true},{"PRN":26,"el":17,"az":54,"ss":39,"used":false},{"PRN":29,"el":20,"az":63,"ss":40,"used":false},{"PRN":30,"el":59,"az":312,"ss":43,"used":true}]}
$GPRMC,095352.792,A,2712.6511,S,15303.1137,E,1.39,350.04,080407,,,A*70
{"class":"TPV","tag":"RMC","time":1176026032.792,"ept":0.005,"lat":-27.210851667,"lon":153.051895000,"alt":5.800,"epx":15.734,"epy":10.717,"epv":62.100,"track":350.0400,"speed":0.715,"climb":-0.400,"eps":31.47,"mode":3}
$GPVTG,350.04,T,,,1.39,N,2.57,K,A*79
@@ -316,7 +316,7 @@ $GPGSA,A,3,02,05,07,12,21,24,30,,,,,,3.0,1.3,2.7*33
$GPGSV,3,1,12,2,15,123,34,5,45,347,42,6,58,198,42,7,45,212,41*74
$GPGSV,3,2,12,10,44,132,42,12,39,002,41,18,14,332,26,21,34,265,41*78
$GPGSV,3,3,12,24,58,220,43,26,17,054,40,29,20,063,38,30,59,312,44*79
-{"class":"SKY","tag":"GSV","vdop":2.70,"hdop":1.30,"pdop":3.00,"satellites":[{"PRN":2,"el":15,"az":123,"ss":34,"used":true},{"PRN":5,"el":45,"az":347,"ss":42,"used":true},{"PRN":6,"el":58,"az":198,"ss":42,"used":false},{"PRN":7,"el":45,"az":212,"ss":41,"used":true},{"PRN":10,"el":44,"az":132,"ss":42,"used":false},{"PRN":12,"el":39,"az":2,"ss":41,"used":true},{"PRN":18,"el":14,"az":332,"ss":26,"used":false},{"PRN":21,"el":34,"az":265,"ss":41,"used":true},{"PRN":24,"el":58,"az":220,"ss":43,"used":true},{"PRN":26,"el":17,"az":54,"ss":40,"used":false},{"PRN":29,"el":20,"az":63,"ss":38,"used":false},{"PRN":30,"el":59,"az":312,"ss":44,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":1.05,"ydop":0.71,"vdop":2.70,"tdop":1.22,"hdop":1.30,"gdop":2.63,"pdop":3.00,"satellites":[{"PRN":2,"el":15,"az":123,"ss":34,"used":true},{"PRN":5,"el":45,"az":347,"ss":42,"used":true},{"PRN":6,"el":58,"az":198,"ss":42,"used":false},{"PRN":7,"el":45,"az":212,"ss":41,"used":true},{"PRN":10,"el":44,"az":132,"ss":42,"used":false},{"PRN":12,"el":39,"az":2,"ss":41,"used":true},{"PRN":18,"el":14,"az":332,"ss":26,"used":false},{"PRN":21,"el":34,"az":265,"ss":41,"used":true},{"PRN":24,"el":58,"az":220,"ss":43,"used":true},{"PRN":26,"el":17,"az":54,"ss":40,"used":false},{"PRN":29,"el":20,"az":63,"ss":38,"used":false},{"PRN":30,"el":59,"az":312,"ss":44,"used":true}]}
$GPRMC,095355.791,A,2712.6493,S,15303.1137,E,2.13,16.78,080407,,,A*4E
{"class":"TPV","tag":"RMC","time":1176026035.791,"ept":0.005,"lat":-27.210821667,"lon":153.051895000,"alt":4.700,"epx":23.360,"epy":10.770,"epv":96.600,"track":16.7800,"speed":1.096,"climb":-0.500,"eps":46.72,"mode":3}
$GPVTG,16.78,T,,,2.13,N,3.95,K,A*47
@@ -333,7 +333,7 @@ $GPGSA,A,3,02,05,07,10,12,21,24,30,,,,,2.6,1.1,2.4*34
$GPGSV,3,1,12,2,15,123,36,5,45,347,43,6,58,198,42,7,45,212,41*77
$GPGSV,3,2,12,10,43,132,41,12,39,002,41,18,14,332,26,21,34,265,42*7F
$GPGSV,3,3,12,24,58,219,43,26,17,054,38,29,20,063,37,30,59,312,44*73
-{"class":"SKY","tag":"GSV","vdop":2.40,"hdop":1.10,"pdop":2.60,"satellites":[{"PRN":2,"el":15,"az":123,"ss":36,"used":true},{"PRN":5,"el":45,"az":347,"ss":43,"used":true},{"PRN":6,"el":58,"az":198,"ss":42,"used":false},{"PRN":7,"el":45,"az":212,"ss":41,"used":true},{"PRN":10,"el":43,"az":132,"ss":41,"used":true},{"PRN":12,"el":39,"az":2,"ss":41,"used":true},{"PRN":18,"el":14,"az":332,"ss":26,"used":false},{"PRN":21,"el":34,"az":265,"ss":42,"used":true},{"PRN":24,"el":58,"az":219,"ss":43,"used":true},{"PRN":26,"el":17,"az":54,"ss":38,"used":false},{"PRN":29,"el":20,"az":63,"ss":37,"used":false},{"PRN":30,"el":59,"az":312,"ss":44,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.78,"ydop":0.66,"vdop":2.40,"tdop":1.13,"hdop":1.10,"gdop":2.41,"pdop":2.60,"satellites":[{"PRN":2,"el":15,"az":123,"ss":36,"used":true},{"PRN":5,"el":45,"az":347,"ss":43,"used":true},{"PRN":6,"el":58,"az":198,"ss":42,"used":false},{"PRN":7,"el":45,"az":212,"ss":41,"used":true},{"PRN":10,"el":43,"az":132,"ss":41,"used":true},{"PRN":12,"el":39,"az":2,"ss":41,"used":true},{"PRN":18,"el":14,"az":332,"ss":26,"used":false},{"PRN":21,"el":34,"az":265,"ss":42,"used":true},{"PRN":24,"el":58,"az":219,"ss":43,"used":true},{"PRN":26,"el":17,"az":54,"ss":38,"used":false},{"PRN":29,"el":20,"az":63,"ss":37,"used":false},{"PRN":30,"el":59,"az":312,"ss":44,"used":true}]}
$GPRMC,095358.790,A,2712.6473,S,15303.1133,E,2.34,6.73,080407,,,A*77
{"class":"TPV","tag":"RMC","time":1176026038.790,"ept":0.005,"lat":-27.210788333,"lon":153.051888333,"alt":3.900,"epx":15.734,"epy":10.717,"epv":62.100,"track":6.7300,"speed":1.204,"climb":-0.200,"eps":31.50,"mode":3}
$GPVTG,6.73,T,,,2.34,N,4.32,K,A*72
@@ -346,7 +346,7 @@ $GPGSA,A,3,02,05,07,10,12,21,24,30,,,,,2.6,1.1,2.4*34
$GPGSV,3,1,12,2,15,123,35,5,45,347,43,6,58,198,42,7,45,212,39*7B
$GPGSV,3,2,12,10,43,132,40,12,39,002,40,18,14,332,25,21,34,265,40*7E
$GPGSV,3,3,12,24,58,219,44,26,17,054,38,29,20,063,37,30,59,312,43*73
-{"class":"SKY","tag":"GSV","vdop":2.40,"hdop":1.10,"pdop":2.60,"satellites":[{"PRN":2,"el":15,"az":123,"ss":35,"used":true},{"PRN":5,"el":45,"az":347,"ss":43,"used":true},{"PRN":6,"el":58,"az":198,"ss":42,"used":false},{"PRN":7,"el":45,"az":212,"ss":39,"used":true},{"PRN":10,"el":43,"az":132,"ss":40,"used":true},{"PRN":12,"el":39,"az":2,"ss":40,"used":true},{"PRN":18,"el":14,"az":332,"ss":25,"used":false},{"PRN":21,"el":34,"az":265,"ss":40,"used":true},{"PRN":24,"el":58,"az":219,"ss":44,"used":true},{"PRN":26,"el":17,"az":54,"ss":38,"used":false},{"PRN":29,"el":20,"az":63,"ss":37,"used":false},{"PRN":30,"el":59,"az":312,"ss":43,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.78,"ydop":0.66,"vdop":2.40,"tdop":1.13,"hdop":1.10,"gdop":2.41,"pdop":2.60,"satellites":[{"PRN":2,"el":15,"az":123,"ss":35,"used":true},{"PRN":5,"el":45,"az":347,"ss":43,"used":true},{"PRN":6,"el":58,"az":198,"ss":42,"used":false},{"PRN":7,"el":45,"az":212,"ss":39,"used":true},{"PRN":10,"el":43,"az":132,"ss":40,"used":true},{"PRN":12,"el":39,"az":2,"ss":40,"used":true},{"PRN":18,"el":14,"az":332,"ss":25,"used":false},{"PRN":21,"el":34,"az":265,"ss":40,"used":true},{"PRN":24,"el":58,"az":219,"ss":44,"used":true},{"PRN":26,"el":17,"az":54,"ss":38,"used":false},{"PRN":29,"el":20,"az":63,"ss":37,"used":false},{"PRN":30,"el":59,"az":312,"ss":43,"used":true}]}
$GPRMC,095401.790,A,2712.6453,S,15303.1133,E,2.36,7.77,080407,,,A*79
{"class":"TPV","tag":"RMC","time":1176026041.790,"ept":0.005,"lat":-27.210755000,"lon":153.051888333,"alt":3.700,"epx":11.747,"epy":9.832,"epv":55.200,"track":7.7700,"speed":1.214,"climb":0.200,"eps":23.49,"mode":3}
$GPVTG,7.77,T,,,2.36,N,4.37,K,A*70
@@ -359,7 +359,7 @@ $GPGSA,A,3,02,05,06,07,10,12,21,24,30,,,,2.5,1.1,2.2*37
$GPGSV,3,1,12,2,15,123,33,5,45,347,44,6,58,197,42,7,45,212,41*7A
$GPGSV,3,2,12,10,43,132,39,12,39,002,41,18,14,332,25,21,34,265,39*7F
$GPGSV,3,3,12,24,58,219,45,26,17,054,38,29,20,063,38,30,59,312,43*7D
-{"class":"SKY","tag":"GSV","vdop":2.20,"hdop":1.10,"pdop":2.50,"satellites":[{"PRN":2,"el":15,"az":123,"ss":33,"used":true},{"PRN":5,"el":45,"az":347,"ss":44,"used":true},{"PRN":6,"el":58,"az":197,"ss":42,"used":true},{"PRN":7,"el":45,"az":212,"ss":41,"used":true},{"PRN":10,"el":43,"az":132,"ss":39,"used":true},{"PRN":12,"el":39,"az":2,"ss":41,"used":true},{"PRN":18,"el":14,"az":332,"ss":25,"used":false},{"PRN":21,"el":34,"az":265,"ss":39,"used":true},{"PRN":24,"el":58,"az":219,"ss":45,"used":true},{"PRN":26,"el":17,"az":54,"ss":38,"used":false},{"PRN":29,"el":20,"az":63,"ss":38,"used":false},{"PRN":30,"el":59,"az":312,"ss":43,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.78,"ydop":0.65,"vdop":2.20,"tdop":1.10,"hdop":1.10,"gdop":2.33,"pdop":2.50,"satellites":[{"PRN":2,"el":15,"az":123,"ss":33,"used":true},{"PRN":5,"el":45,"az":347,"ss":44,"used":true},{"PRN":6,"el":58,"az":197,"ss":42,"used":true},{"PRN":7,"el":45,"az":212,"ss":41,"used":true},{"PRN":10,"el":43,"az":132,"ss":39,"used":true},{"PRN":12,"el":39,"az":2,"ss":41,"used":true},{"PRN":18,"el":14,"az":332,"ss":25,"used":false},{"PRN":21,"el":34,"az":265,"ss":39,"used":true},{"PRN":24,"el":58,"az":219,"ss":45,"used":true},{"PRN":26,"el":17,"az":54,"ss":38,"used":false},{"PRN":29,"el":20,"az":63,"ss":38,"used":false},{"PRN":30,"el":59,"az":312,"ss":43,"used":true}]}
$GPRMC,095404.789,A,2712.6432,S,15303.1137,E,2.45,12.39,080407,,,A*4D
{"class":"TPV","tag":"RMC","time":1176026044.789,"ept":0.005,"lat":-27.210720000,"lon":153.051895000,"alt":3.300,"epx":11.747,"epy":9.832,"epv":55.200,"track":12.3900,"speed":1.260,"climb":-0.200,"eps":23.49,"mode":3}
$GPVTG,12.39,T,,,2.45,N,4.54,K,A*4F
@@ -376,7 +376,7 @@ $GPGSA,A,3,02,05,06,07,10,12,24,30,,,,,3.9,1.7,3.4*38
$GPGSV,3,1,12,2,14,123,33,5,45,347,43,6,58,197,42,7,45,212,41*7C
$GPGSV,3,2,12,10,43,132,42,12,39,002,40,18,14,332,28,21,34,265,36*70
$GPGSV,3,3,12,24,58,219,43,26,17,054,38,29,20,063,39,30,59,312,43*7A
-{"class":"SKY","tag":"GSV","vdop":3.40,"hdop":1.70,"pdop":3.90,"satellites":[{"PRN":2,"el":14,"az":123,"ss":33,"used":true},{"PRN":5,"el":45,"az":347,"ss":43,"used":true},{"PRN":6,"el":58,"az":197,"ss":42,"used":true},{"PRN":7,"el":45,"az":212,"ss":41,"used":true},{"PRN":10,"el":43,"az":132,"ss":42,"used":true},{"PRN":12,"el":39,"az":2,"ss":40,"used":true},{"PRN":18,"el":14,"az":332,"ss":28,"used":false},{"PRN":21,"el":34,"az":265,"ss":36,"used":false},{"PRN":24,"el":58,"az":219,"ss":43,"used":true},{"PRN":26,"el":17,"az":54,"ss":38,"used":false},{"PRN":29,"el":20,"az":63,"ss":39,"used":false},{"PRN":30,"el":59,"az":312,"ss":43,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.79,"ydop":0.65,"vdop":3.40,"tdop":1.10,"hdop":1.70,"gdop":2.37,"pdop":3.90,"satellites":[{"PRN":2,"el":14,"az":123,"ss":33,"used":true},{"PRN":5,"el":45,"az":347,"ss":43,"used":true},{"PRN":6,"el":58,"az":197,"ss":42,"used":true},{"PRN":7,"el":45,"az":212,"ss":41,"used":true},{"PRN":10,"el":43,"az":132,"ss":42,"used":true},{"PRN":12,"el":39,"az":2,"ss":40,"used":true},{"PRN":18,"el":14,"az":332,"ss":28,"used":false},{"PRN":21,"el":34,"az":265,"ss":36,"used":false},{"PRN":24,"el":58,"az":219,"ss":43,"used":true},{"PRN":26,"el":17,"az":54,"ss":38,"used":false},{"PRN":29,"el":20,"az":63,"ss":39,"used":false},{"PRN":30,"el":59,"az":312,"ss":43,"used":true}]}
$GPRMC,095407.788,A,2712.6415,S,15303.1145,E,2.28,40.30,080407,,,A*4A
{"class":"TPV","tag":"RMC","time":1176026047.788,"ept":0.005,"lat":-27.210691667,"lon":153.051908333,"alt":2.500,"epx":11.626,"epy":9.703,"epv":50.600,"track":40.3000,"speed":1.173,"climb":-0.200,"eps":23.28,"mode":3}
$GPVTG,40.30,T,,,2.28,N,4.23,K,A*4A
@@ -393,7 +393,7 @@ $GPGSA,A,3,02,05,06,07,10,12,21,24,30,,,,2.5,1.1,2.2*37
$GPGSV,3,1,12,2,14,123,28,5,45,347,43,6,58,197,42,7,45,212,41*76
$GPGSV,3,2,12,10,43,132,43,12,39,002,42,18,14,332,31,21,34,265,37*7A
$GPGSV,3,3,12,24,58,219,43,26,17,054,39,29,20,063,37,30,59,312,44*72
-{"class":"SKY","tag":"GSV","vdop":2.20,"hdop":1.10,"pdop":2.50,"satellites":[{"PRN":2,"el":14,"az":123,"ss":28,"used":true},{"PRN":5,"el":45,"az":347,"ss":43,"used":true},{"PRN":6,"el":58,"az":197,"ss":42,"used":true},{"PRN":7,"el":45,"az":212,"ss":41,"used":true},{"PRN":10,"el":43,"az":132,"ss":43,"used":true},{"PRN":12,"el":39,"az":2,"ss":42,"used":true},{"PRN":18,"el":14,"az":332,"ss":31,"used":false},{"PRN":21,"el":34,"az":265,"ss":37,"used":true},{"PRN":24,"el":58,"az":219,"ss":43,"used":true},{"PRN":26,"el":17,"az":54,"ss":39,"used":false},{"PRN":29,"el":20,"az":63,"ss":37,"used":false},{"PRN":30,"el":59,"az":312,"ss":44,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.78,"ydop":0.64,"vdop":2.20,"tdop":1.08,"hdop":1.10,"gdop":2.30,"pdop":2.50,"satellites":[{"PRN":2,"el":14,"az":123,"ss":28,"used":true},{"PRN":5,"el":45,"az":347,"ss":43,"used":true},{"PRN":6,"el":58,"az":197,"ss":42,"used":true},{"PRN":7,"el":45,"az":212,"ss":41,"used":true},{"PRN":10,"el":43,"az":132,"ss":43,"used":true},{"PRN":12,"el":39,"az":2,"ss":42,"used":true},{"PRN":18,"el":14,"az":332,"ss":31,"used":false},{"PRN":21,"el":34,"az":265,"ss":37,"used":true},{"PRN":24,"el":58,"az":219,"ss":43,"used":true},{"PRN":26,"el":17,"az":54,"ss":39,"used":false},{"PRN":29,"el":20,"az":63,"ss":37,"used":false},{"PRN":30,"el":59,"az":312,"ss":44,"used":true}]}
$GPRMC,095410.788,A,2712.6407,S,15303.1166,E,2.54,74.38,080407,,,A*4A
{"class":"TPV","tag":"RMC","time":1176026050.788,"ept":0.005,"lat":-27.210678333,"lon":153.051943333,"alt":2.900,"epx":11.782,"epy":9.803,"epv":78.200,"track":74.3800,"speed":1.307,"climb":0.300,"eps":23.56,"mode":3}
$GPVTG,74.38,T,,,2.54,N,4.71,K,A*49
@@ -410,7 +410,7 @@ $GPGSA,A,3,02,05,07,10,12,21,24,30,,,,,2.6,1.1,2.4*34
$GPGSV,3,1,12,2,14,123,25,5,45,347,44,6,58,197,39,7,45,212,38*7E
$GPGSV,3,2,12,10,43,132,35,12,39,002,43,18,14,332,30,21,34,265,38*74
$GPGSV,3,3,12,24,58,219,40,26,17,054,38,29,20,063,38,30,59,312,44*7F
-{"class":"SKY","tag":"GSV","vdop":2.40,"hdop":1.10,"pdop":2.60,"satellites":[{"PRN":2,"el":14,"az":123,"ss":25,"used":true},{"PRN":5,"el":45,"az":347,"ss":44,"used":true},{"PRN":6,"el":58,"az":197,"ss":39,"used":false},{"PRN":7,"el":45,"az":212,"ss":38,"used":true},{"PRN":10,"el":43,"az":132,"ss":35,"used":true},{"PRN":12,"el":39,"az":2,"ss":43,"used":true},{"PRN":18,"el":14,"az":332,"ss":30,"used":false},{"PRN":21,"el":34,"az":265,"ss":38,"used":true},{"PRN":24,"el":58,"az":219,"ss":40,"used":true},{"PRN":26,"el":17,"az":54,"ss":38,"used":false},{"PRN":29,"el":20,"az":63,"ss":38,"used":false},{"PRN":30,"el":59,"az":312,"ss":44,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.79,"ydop":0.65,"vdop":2.40,"tdop":1.10,"hdop":1.10,"gdop":2.37,"pdop":2.60,"satellites":[{"PRN":2,"el":14,"az":123,"ss":25,"used":true},{"PRN":5,"el":45,"az":347,"ss":44,"used":true},{"PRN":6,"el":58,"az":197,"ss":39,"used":false},{"PRN":7,"el":45,"az":212,"ss":38,"used":true},{"PRN":10,"el":43,"az":132,"ss":35,"used":true},{"PRN":12,"el":39,"az":2,"ss":43,"used":true},{"PRN":18,"el":14,"az":332,"ss":30,"used":false},{"PRN":21,"el":34,"az":265,"ss":38,"used":true},{"PRN":24,"el":58,"az":219,"ss":40,"used":true},{"PRN":26,"el":17,"az":54,"ss":38,"used":false},{"PRN":29,"el":20,"az":63,"ss":38,"used":false},{"PRN":30,"el":59,"az":312,"ss":44,"used":true}]}
$GPRMC,095413.787,A,2712.6403,S,15303.1187,E,2.47,79.51,080407,,,A*4D
{"class":"TPV","tag":"RMC","time":1176026053.787,"ept":0.005,"lat":-27.210671667,"lon":153.051978333,"alt":3.100,"epx":11.661,"epy":9.666,"epv":50.600,"track":79.5100,"speed":1.271,"climb":0.100,"eps":23.32,"mode":3}
$GPVTG,79.51,T,,,2.47,N,4.57,K,A*4D
diff --git a/test/daemon/humminbird-M37.log.chk b/test/daemon/humminbird-M37.log.chk
index 699d2b38..9abfd38c 100644
--- a/test/daemon/humminbird-M37.log.chk
+++ b/test/daemon/humminbird-M37.log.chk
@@ -1375,3 +1375,4 @@ $INMTW,17.3,C*11
$INDPT,1.9,0.0*4F
$INRMC,194630,A,4426.2088,N,07139.8923,W,5.2,62.2,160906,15.8,W*60
{"class":"TPV","tag":"RMC","time":1158435990.000,"ept":0.005,"lat":44.436813333,"lon":-71.664871667,"track":62.2000,"speed":2.675,"mode":2}
+$INDPT,1.9,0.0*4F
diff --git a/test/daemon/iTrek.log.chk b/test/daemon/iTrek.log.chk
index 3e2f3d4b..8b10f312 100644
--- a/test/daemon/iTrek.log.chk
+++ b/test/daemon/iTrek.log.chk
@@ -22,9 +22,9 @@ $GPRMC,045851.000,A,3519.9046,N,13640.2631,E,0.12,114.35,270705,,*0B
{"class":"TPV","tag":"RMC","time":1122440331.000,"ept":0.005,"lat":35.331743333,"lon":136.671051667,"alt":80.400,"epv":43.700,"track":114.3500,"speed":0.062,"climb":0.000,"mode":3}
$GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C
$GPGSV,2,2,08,22,62,272,24,18,55,192,16,30,50,179,18,15,09,229,*74
-{"class":"SKY","tag":"GSV","vdop":1.90,"hdop":2.20,"pdop":2.90,"satellites":[{"PRN":22,"el":62,"az":272,"ss":24,"used":false},{"PRN":18,"el":55,"az":192,"ss":16,"used":false},{"PRN":30,"el":50,"az":179,"ss":18,"used":false},{"PRN":15,"el":9,"az":229,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":11.57,"ydop":10.11,"vdop":1.90,"tdop":17.18,"hdop":2.20,"gdop":26.66,"pdop":2.90,"satellites":[{"PRN":22,"el":62,"az":272,"ss":24,"used":false},{"PRN":18,"el":55,"az":192,"ss":16,"used":false},{"PRN":30,"el":50,"az":179,"ss":18,"used":false},{"PRN":15,"el":9,"az":229,"ss":0,"used":false}]}
$GPRMC,045852.000,A,3519.9046,N,13640.2632,E,0.10,104.21,270705,,*0D
-{"class":"TPV","tag":"RMC","time":1122440332.000,"ept":0.005,"lat":35.331743333,"lon":136.671053333,"epx":173.568,"epy":151.635,"track":104.2100,"speed":0.051,"mode":2}
+{"class":"TPV","tag":"RMC","time":1122440332.000,"ept":0.005,"lat":35.331743333,"lon":136.671053333,"epx":173.568,"epy":151.635,"track":104.2100,"speed":0.051,"eps":347.14,"mode":2}
$GPGGA,045853.000,3519.9045,N,13640.2632,E,1,04,2.2,80.4,M,,,,0000*3B
$GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C
$GPRMC,045853.000,A,3519.9045,N,13640.2632,E,0.11,97.51,270705,,*32
@@ -43,7 +43,7 @@ $GPRMC,045856.000,A,3519.9042,N,13640.2632,E,0.11,115.12,270705,,*0C
$GPGGA,045857.000,3519.9040,N,13640.2632,E,1,04,2.2,80.5,M,,,,0000*3B
$GPGSV,2,1,08,05,67,099,26,09,41,047,46,14,32,311,43,26,08,109,30*78
$GPGSV,2,2,08,22,62,272,25,18,55,192,24,30,50,179,19,15,09,229,*75
-{"class":"SKY","tag":"GSV","vdop":1.90,"hdop":2.20,"pdop":2.90,"satellites":[{"PRN":5,"el":67,"az":99,"ss":26,"used":true},{"PRN":9,"el":41,"az":47,"ss":46,"used":true},{"PRN":14,"el":32,"az":311,"ss":43,"used":true},{"PRN":26,"el":8,"az":109,"ss":30,"used":true},{"PRN":22,"el":62,"az":272,"ss":25,"used":false},{"PRN":18,"el":55,"az":192,"ss":24,"used":false},{"PRN":30,"el":50,"az":179,"ss":19,"used":false},{"PRN":15,"el":9,"az":229,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.20,"ydop":1.90,"vdop":1.90,"tdop":1.30,"hdop":2.20,"gdop":3.21,"pdop":2.90,"satellites":[{"PRN":5,"el":67,"az":99,"ss":26,"used":true},{"PRN":9,"el":41,"az":47,"ss":46,"used":true},{"PRN":14,"el":32,"az":311,"ss":43,"used":true},{"PRN":26,"el":8,"az":109,"ss":30,"used":true},{"PRN":22,"el":62,"az":272,"ss":25,"used":false},{"PRN":18,"el":55,"az":192,"ss":24,"used":false},{"PRN":30,"el":50,"az":179,"ss":19,"used":false},{"PRN":15,"el":9,"az":229,"ss":0,"used":false}]}
$GPRMC,045857.000,A,3519.9040,N,13640.2632,E,0.11,116.49,270705,,*02
{"class":"TPV","tag":"RMC","time":1122440337.000,"ept":0.005,"lat":35.331733333,"lon":136.671053333,"alt":80.500,"epx":17.960,"epy":28.495,"epv":43.700,"track":116.4900,"speed":0.057,"climb":0.100,"mode":3}
$GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C
@@ -63,7 +63,7 @@ $GPGGA,045902.000,3519.9034,N,13640.2633,E,1,04,2.2,81.0,M,,,,0000*3C
$GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C
$GPGSV,2,1,08,05,67,099,26,09,41,047,46,14,32,311,42,26,08,109,29*71
$GPGSV,2,2,08,22,62,272,24,18,55,192,24,30,50,179,25,15,09,229,23*7A
-{"class":"SKY","tag":"GSV","vdop":1.90,"hdop":2.20,"pdop":2.90,"satellites":[{"PRN":5,"el":67,"az":99,"ss":26,"used":true},{"PRN":9,"el":41,"az":47,"ss":46,"used":true},{"PRN":14,"el":32,"az":311,"ss":42,"used":true},{"PRN":26,"el":8,"az":109,"ss":29,"used":true},{"PRN":22,"el":62,"az":272,"ss":24,"used":false},{"PRN":18,"el":55,"az":192,"ss":24,"used":false},{"PRN":30,"el":50,"az":179,"ss":25,"used":false},{"PRN":15,"el":9,"az":229,"ss":23,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.20,"ydop":1.90,"vdop":1.90,"tdop":1.30,"hdop":2.20,"gdop":3.21,"pdop":2.90,"satellites":[{"PRN":5,"el":67,"az":99,"ss":26,"used":true},{"PRN":9,"el":41,"az":47,"ss":46,"used":true},{"PRN":14,"el":32,"az":311,"ss":42,"used":true},{"PRN":26,"el":8,"az":109,"ss":29,"used":true},{"PRN":22,"el":62,"az":272,"ss":24,"used":false},{"PRN":18,"el":55,"az":192,"ss":24,"used":false},{"PRN":30,"el":50,"az":179,"ss":25,"used":false},{"PRN":15,"el":9,"az":229,"ss":23,"used":false}]}
$GPRMC,045902.000,A,3519.9034,N,13640.2633,E,0.13,137.85,270705,,*00
{"class":"TPV","tag":"RMC","time":1122440342.000,"ept":0.005,"lat":35.331723333,"lon":136.671055000,"alt":81.000,"epx":17.960,"epy":28.495,"epv":43.700,"track":137.8500,"speed":0.067,"climb":0.000,"mode":3}
$GPGGA,045903.000,3519.9032,N,13640.2633,E,1,04,2.2,81.1,M,,,,0000*3A
@@ -86,7 +86,7 @@ $GPGGA,045907.000,3519.9026,N,13640.2633,E,1,04,2.2,80.6,M,,,,0000*3D
$GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C
$GPGSV,2,1,08,05,67,099,32,09,41,047,46,14,32,311,42,26,08,109,24*79
$GPGSV,2,2,08,22,62,272,25,18,55,192,25,30,50,179,26,15,09,229,*78
-{"class":"SKY","tag":"GSV","vdop":1.90,"hdop":2.20,"pdop":2.90,"satellites":[{"PRN":5,"el":67,"az":99,"ss":32,"used":true},{"PRN":9,"el":41,"az":47,"ss":46,"used":true},{"PRN":14,"el":32,"az":311,"ss":42,"used":true},{"PRN":26,"el":8,"az":109,"ss":24,"used":true},{"PRN":22,"el":62,"az":272,"ss":25,"used":false},{"PRN":18,"el":55,"az":192,"ss":25,"used":false},{"PRN":30,"el":50,"az":179,"ss":26,"used":false},{"PRN":15,"el":9,"az":229,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.20,"ydop":1.90,"vdop":1.90,"tdop":1.30,"hdop":2.20,"gdop":3.21,"pdop":2.90,"satellites":[{"PRN":5,"el":67,"az":99,"ss":32,"used":true},{"PRN":9,"el":41,"az":47,"ss":46,"used":true},{"PRN":14,"el":32,"az":311,"ss":42,"used":true},{"PRN":26,"el":8,"az":109,"ss":24,"used":true},{"PRN":22,"el":62,"az":272,"ss":25,"used":false},{"PRN":18,"el":55,"az":192,"ss":25,"used":false},{"PRN":30,"el":50,"az":179,"ss":26,"used":false},{"PRN":15,"el":9,"az":229,"ss":0,"used":false}]}
$GPRMC,045907.000,A,3519.9026,N,13640.2633,E,0.12,56.07,270705,,*3B
{"class":"TPV","tag":"RMC","time":1122440347.000,"ept":0.005,"lat":35.331710000,"lon":136.671055000,"alt":80.600,"epx":17.960,"epy":28.495,"epv":43.700,"track":56.0700,"speed":0.062,"climb":0.000,"mode":3}
$GPGGA,045908.000,3519.9026,N,13640.2633,E,1,04,2.2,80.8,M,,,,0000*3C
@@ -105,7 +105,7 @@ $GPRMC,045911.000,A,3519.9026,N,13640.2634,E,0.42,13.19,270705,,*30
$GPGGA,045912.000,3519.9026,N,13640.2634,E,1,04,2.2,81.3,M,,,,0000*3A
$GPGSV,2,1,08,05,67,099,33,09,41,047,46,14,32,311,42,26,08,109,23*7F
$GPGSV,2,2,08,22,62,272,25,18,55,192,18,30,50,179,21,15,09,229,*71
-{"class":"SKY","tag":"GSV","vdop":1.90,"hdop":2.20,"pdop":2.90,"satellites":[{"PRN":5,"el":67,"az":99,"ss":33,"used":true},{"PRN":9,"el":41,"az":47,"ss":46,"used":true},{"PRN":14,"el":32,"az":311,"ss":42,"used":true},{"PRN":26,"el":8,"az":109,"ss":23,"used":true},{"PRN":22,"el":62,"az":272,"ss":25,"used":false},{"PRN":18,"el":55,"az":192,"ss":18,"used":false},{"PRN":30,"el":50,"az":179,"ss":21,"used":false},{"PRN":15,"el":9,"az":229,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.20,"ydop":1.90,"vdop":1.90,"tdop":1.30,"hdop":2.20,"gdop":3.21,"pdop":2.90,"satellites":[{"PRN":5,"el":67,"az":99,"ss":33,"used":true},{"PRN":9,"el":41,"az":47,"ss":46,"used":true},{"PRN":14,"el":32,"az":311,"ss":42,"used":true},{"PRN":26,"el":8,"az":109,"ss":23,"used":true},{"PRN":22,"el":62,"az":272,"ss":25,"used":false},{"PRN":18,"el":55,"az":192,"ss":18,"used":false},{"PRN":30,"el":50,"az":179,"ss":21,"used":false},{"PRN":15,"el":9,"az":229,"ss":0,"used":false}]}
$GPRMC,045912.000,A,3519.9026,N,13640.2634,E,0.36,13.64,270705,,*3A
{"class":"TPV","tag":"RMC","time":1122440352.000,"ept":0.005,"lat":35.331710000,"lon":136.671056667,"alt":81.300,"epx":17.960,"epy":28.495,"epv":43.700,"track":13.6400,"speed":0.185,"climb":0.000,"mode":3}
$GPGGA,045913.000,3519.9025,N,13640.2634,E,1,04,2.2,81.2,M,,,,0000*39
@@ -124,7 +124,7 @@ $GPRMC,045916.000,A,3519.9019,N,13640.2636,E,0.31,160.03,270705,,*03
$GPGGA,045917.000,3519.9017,N,13640.2636,E,1,04,2.2,79.0,M,,,,0000*3B
$GPGSV,2,1,08,05,67,099,34,09,41,047,46,14,32,311,42,26,08,109,19*71
$GPGSV,2,2,08,22,62,272,20,18,55,192,19,30,50,179,13,15,09,229,24*72
-{"class":"SKY","tag":"GSV","vdop":1.90,"hdop":2.20,"pdop":2.90,"satellites":[{"PRN":5,"el":67,"az":99,"ss":34,"used":true},{"PRN":9,"el":41,"az":47,"ss":46,"used":true},{"PRN":14,"el":32,"az":311,"ss":42,"used":true},{"PRN":26,"el":8,"az":109,"ss":19,"used":true},{"PRN":22,"el":62,"az":272,"ss":20,"used":false},{"PRN":18,"el":55,"az":192,"ss":19,"used":false},{"PRN":30,"el":50,"az":179,"ss":13,"used":false},{"PRN":15,"el":9,"az":229,"ss":24,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.20,"ydop":1.90,"vdop":1.90,"tdop":1.30,"hdop":2.20,"gdop":3.21,"pdop":2.90,"satellites":[{"PRN":5,"el":67,"az":99,"ss":34,"used":true},{"PRN":9,"el":41,"az":47,"ss":46,"used":true},{"PRN":14,"el":32,"az":311,"ss":42,"used":true},{"PRN":26,"el":8,"az":109,"ss":19,"used":true},{"PRN":22,"el":62,"az":272,"ss":20,"used":false},{"PRN":18,"el":55,"az":192,"ss":19,"used":false},{"PRN":30,"el":50,"az":179,"ss":13,"used":false},{"PRN":15,"el":9,"az":229,"ss":24,"used":false}]}
$GPRMC,045917.000,A,3519.9017,N,13640.2636,E,0.32,160.37,270705,,*08
{"class":"TPV","tag":"RMC","time":1122440357.000,"ept":0.005,"lat":35.331695000,"lon":136.671060000,"alt":79.000,"epx":17.960,"epy":28.495,"epv":43.700,"track":160.3700,"speed":0.165,"climb":0.000,"mode":3}
$GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C
@@ -145,7 +145,7 @@ $GPGGA,045922.000,3519.9007,N,13640.2636,E,1,04,2.2,78.6,M,,,,0000*3B
$GPGSA,A,3,09,05,14,26,,,,,,,,,2.9,2.2,1.9*3C
$GPGSV,2,1,08,05,67,099,21,09,41,047,36,14,32,311,26,26,08,109,21*7B
$GPGSV,2,2,08,22,62,272,20,18,55,192,18,30,50,179,,15,09,229,*77
-{"class":"SKY","tag":"GSV","vdop":1.90,"hdop":2.20,"pdop":2.90,"satellites":[{"PRN":5,"el":67,"az":99,"ss":21,"used":true},{"PRN":9,"el":41,"az":47,"ss":36,"used":true},{"PRN":14,"el":32,"az":311,"ss":26,"used":true},{"PRN":26,"el":8,"az":109,"ss":21,"used":true},{"PRN":22,"el":62,"az":272,"ss":20,"used":false},{"PRN":18,"el":55,"az":192,"ss":18,"used":false},{"PRN":30,"el":50,"az":179,"ss":0,"used":false},{"PRN":15,"el":9,"az":229,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.20,"ydop":1.90,"vdop":1.90,"tdop":1.30,"hdop":2.20,"gdop":3.21,"pdop":2.90,"satellites":[{"PRN":5,"el":67,"az":99,"ss":21,"used":true},{"PRN":9,"el":41,"az":47,"ss":36,"used":true},{"PRN":14,"el":32,"az":311,"ss":26,"used":true},{"PRN":26,"el":8,"az":109,"ss":21,"used":true},{"PRN":22,"el":62,"az":272,"ss":20,"used":false},{"PRN":18,"el":55,"az":192,"ss":18,"used":false},{"PRN":30,"el":50,"az":179,"ss":0,"used":false},{"PRN":15,"el":9,"az":229,"ss":0,"used":false}]}
$GPRMC,045922.000,A,3519.9007,N,13640.2636,E,3.35,194.25,270705,,*03
{"class":"TPV","tag":"RMC","time":1122440362.000,"ept":0.005,"lat":35.331678333,"lon":136.671060000,"alt":78.600,"epx":17.960,"epy":28.495,"epv":43.700,"track":194.2500,"speed":1.723,"climb":0.100,"mode":3}
$GPGSA,A,2,,,,,,,,,,,,,50.0,50.0,50.0*06
diff --git a/test/daemon/italk-binary.log.chk b/test/daemon/italk-binary.log.chk
index 336bce2d..429721b9 100644
--- a/test/daemon/italk-binary.log.chk
+++ b/test/daemon/italk-binary.log.chk
@@ -5,184 +5,197 @@ $GPGSA,A,3,,,,,,,,,,,,,0.0,0.0,0.0*32
$GPGSV,3,1,09,03,35,061,32,06,26,049,34,07,76,101,23,08,60,183,38*71
$GPGSV,3,2,09,10,23,180,00,13,33,166,16,19,43,094,47,25,54,109,44*73
$GPGSV,3,3,09,28,30,125,00*4F
-{"class":"SKY","tag":"ITK-02","time":1246918380.322,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":32,"used":true},{"PRN":6,"el":26,"az":49,"ss":34,"used":true},{"PRN":7,"el":76,"az":101,"ss":23,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":16,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":44,"used":true},{"PRN":28,"el":30,"az":125,"ss":0,"used":false}]}
-$GPGGA,221301,5333.7947,N,11326.3773,W,1,05,,661.09,M,-19.872,M,,*64
+{"class":"SKY","tag":"ITK-02","time":1246918380.322,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":32,"used":true},{"PRN":6,"el":26,"az":49,"ss":34,"used":true},{"PRN":7,"el":76,"az":101,"ss":23,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":16,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":44,"used":true},{"PRN":28,"el":30,"az":125,"ss":0,"used":false}]}
+$GPGGA,221301,5333.7947,N,11326.3773,W,1,05,7.74,661.09,M,-19.872,M,,*7E
$GPRMC,221301,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*38
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918381.145,"ept":0.005,"lat":53.563244879,"lon":-113.439622385,"alt":661.089,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+$GPGBS,221301,0.00,M,0.00,M,75.10,M*0E
+{"class":"TPV","tag":"ITK-07","time":1246918381.145,"ept":0.005,"lat":53.563244879,"lon":-113.439622385,"alt":661.089,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,31,06,26,049,34,07,76,101,00,08,60,183,38*73
$GPGSV,3,2,09,10,23,180,05,13,33,166,12,19,43,094,47,25,54,109,44*72
$GPGSV,3,3,09,28,30,125,00*4F
-{"class":"SKY","tag":"ITK-02","time":1246918381.326,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":34,"used":true},{"PRN":7,"el":76,"az":101,"ss":0,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":5,"used":false},{"PRN":13,"el":33,"az":166,"ss":12,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":44,"used":true},{"PRN":28,"el":30,"az":125,"ss":0,"used":false}]}
-$GPGGA,221302,5333.7947,N,11326.3773,W,1,05,,661.09,M,-19.872,M,,*67
+{"class":"SKY","tag":"ITK-02","time":1246918381.326,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":34,"used":true},{"PRN":7,"el":76,"az":101,"ss":0,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":5,"used":false},{"PRN":13,"el":33,"az":166,"ss":12,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":44,"used":true},{"PRN":28,"el":30,"az":125,"ss":0,"used":false}]}
+$GPGGA,221302,5333.7947,N,11326.3773,W,1,05,7.74,661.09,M,-19.872,M,,*7D
$GPRMC,221302,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3B
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918382.146,"ept":0.005,"lat":53.563244812,"lon":-113.439622325,"alt":661.095,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+$GPGBS,221302,0.00,M,0.00,M,75.10,M*0D
+{"class":"TPV","tag":"ITK-07","time":1246918382.146,"ept":0.005,"lat":53.563244812,"lon":-113.439622325,"alt":661.095,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"epd":0.0000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,31,06,26,049,34,07,76,101,00,08,60,183,38*73
$GPGSV,3,2,09,10,23,180,22,13,33,166,00,19,43,094,47,25,54,109,44*74
$GPGSV,3,3,09,28,30,125,09*46
-{"class":"SKY","tag":"ITK-02","time":1246918382.334,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":34,"used":true},{"PRN":7,"el":76,"az":101,"ss":0,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":22,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":44,"used":true},{"PRN":28,"el":30,"az":125,"ss":9,"used":false}]}
-$GPGGA,221303,5333.7947,N,11326.3773,W,1,05,,661.09,M,-19.872,M,,*66
+{"class":"SKY","tag":"ITK-02","time":1246918382.334,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":34,"used":true},{"PRN":7,"el":76,"az":101,"ss":0,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":22,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":44,"used":true},{"PRN":28,"el":30,"az":125,"ss":9,"used":false}]}
+$GPGGA,221303,5333.7947,N,11326.3773,W,1,05,7.74,661.09,M,-19.872,M,,*7C
$GPRMC,221303,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3A
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918383.146,"ept":0.005,"lat":53.563244812,"lon":-113.439622325,"alt":661.095,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+$GPGBS,221303,0.00,M,0.00,M,75.10,M*0C
+{"class":"TPV","tag":"ITK-07","time":1246918383.146,"ept":0.005,"lat":53.563244812,"lon":-113.439622325,"alt":661.095,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,31,06,26,049,35,07,76,101,05,08,60,183,38*77
$GPGSV,3,2,09,10,23,180,25,13,33,166,00,19,43,094,47,25,54,109,44*73
$GPGSV,3,3,09,28,30,125,18*46
-{"class":"SKY","tag":"ITK-02","time":1246918383.482,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":35,"used":true},{"PRN":7,"el":76,"az":101,"ss":5,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":25,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":44,"used":true},{"PRN":28,"el":30,"az":125,"ss":18,"used":false}]}
-$GPGGA,221304,5333.7947,N,11326.3773,W,1,05,,661.09,M,-19.872,M,,*61
+{"class":"SKY","tag":"ITK-02","time":1246918383.482,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":35,"used":true},{"PRN":7,"el":76,"az":101,"ss":5,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":25,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":44,"used":true},{"PRN":28,"el":30,"az":125,"ss":18,"used":false}]}
+$GPGGA,221304,5333.7947,N,11326.3773,W,1,05,7.74,661.09,M,-19.872,M,,*7B
$GPRMC,221304,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3D
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918384.147,"ept":0.005,"lat":53.563244812,"lon":-113.439622325,"alt":661.095,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
-$GPGGA,221305,5333.7947,N,11326.3773,W,1,05,,661.09,M,-19.872,M,,*60
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+{"class":"TPV","tag":"ITK-07","time":1246918384.147,"ept":0.005,"lat":53.563244812,"lon":-113.439622325,"alt":661.095,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
+$GPGGA,221305,5333.7947,N,11326.3773,W,1,05,7.74,661.09,M,-19.872,M,,*7A
$GPRMC,221305,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3C
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918385.147,"ept":0.005,"lat":53.563244812,"lon":-113.439622325,"alt":661.095,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+{"class":"TPV","tag":"ITK-07","time":1246918385.147,"ept":0.005,"lat":53.563244812,"lon":-113.439622325,"alt":661.095,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,31,06,26,049,34,07,76,101,26,08,60,183,38*77
$GPGSV,3,2,09,10,23,180,00,13,33,166,15,19,43,094,48,25,54,109,44*7F
$GPGSV,3,3,09,28,30,125,27*4A
-{"class":"SKY","tag":"ITK-02","time":1246918385.362,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":34,"used":true},{"PRN":7,"el":76,"az":101,"ss":26,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":15,"used":false},{"PRN":19,"el":43,"az":94,"ss":48,"used":true},{"PRN":25,"el":54,"az":109,"ss":44,"used":true},{"PRN":28,"el":30,"az":125,"ss":27,"used":false}]}
-$GPGGA,221306,5333.7947,N,11326.3773,W,1,05,,661.09,M,-19.872,M,,*63
+{"class":"SKY","tag":"ITK-02","time":1246918385.362,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":34,"used":true},{"PRN":7,"el":76,"az":101,"ss":26,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":15,"used":false},{"PRN":19,"el":43,"az":94,"ss":48,"used":true},{"PRN":25,"el":54,"az":109,"ss":44,"used":true},{"PRN":28,"el":30,"az":125,"ss":27,"used":false}]}
+$GPGGA,221306,5333.7947,N,11326.3773,W,1,05,7.74,661.09,M,-19.872,M,,*79
$GPRMC,221306,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3F
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918386.148,"ept":0.005,"lat":53.563244812,"lon":-113.439622325,"alt":661.095,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+{"class":"TPV","tag":"ITK-07","time":1246918386.148,"ept":0.005,"lat":53.563244812,"lon":-113.439622325,"alt":661.095,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,31,06,26,049,33,07,76,101,27,08,60,183,38*71
$GPGSV,3,2,09,10,23,180,00,13,33,166,18,19,43,094,47,25,54,109,44*7D
$GPGSV,3,3,09,28,30,125,00*4F
-{"class":"SKY","tag":"ITK-02","time":1246918386.328,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":33,"used":true},{"PRN":7,"el":76,"az":101,"ss":27,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":18,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":44,"used":true},{"PRN":28,"el":30,"az":125,"ss":0,"used":false}]}
-$GPGGA,221307,5333.7947,N,11326.3773,W,1,05,,661.09,M,-19.872,M,,*62
+{"class":"SKY","tag":"ITK-02","time":1246918386.328,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":33,"used":true},{"PRN":7,"el":76,"az":101,"ss":27,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":18,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":44,"used":true},{"PRN":28,"el":30,"az":125,"ss":0,"used":false}]}
+$GPGGA,221307,5333.7947,N,11326.3773,W,1,05,7.74,661.09,M,-19.872,M,,*78
$GPRMC,221307,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3E
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918387.149,"ept":0.005,"lat":53.563244812,"lon":-113.439622325,"alt":661.095,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+$GPGBS,221307,0.00,M,0.00,M,75.10,M*08
+{"class":"TPV","tag":"ITK-07","time":1246918387.149,"ept":0.005,"lat":53.563244812,"lon":-113.439622325,"alt":661.095,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,31,06,26,049,33,07,76,101,00,08,60,183,38*74
$GPGSV,3,2,09,10,23,180,06,13,33,166,15,19,43,094,48,25,54,109,45*78
$GPGSV,3,3,09,28,30,125,00*4F
-{"class":"SKY","tag":"ITK-02","time":1246918387.331,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":33,"used":true},{"PRN":7,"el":76,"az":101,"ss":0,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":6,"used":false},{"PRN":13,"el":33,"az":166,"ss":15,"used":false},{"PRN":19,"el":43,"az":94,"ss":48,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":0,"used":false}]}
-$GPGGA,221308,5333.7947,N,11326.3773,W,1,05,,661.10,M,-19.872,M,,*65
+{"class":"SKY","tag":"ITK-02","time":1246918387.331,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":33,"used":true},{"PRN":7,"el":76,"az":101,"ss":0,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":6,"used":false},{"PRN":13,"el":33,"az":166,"ss":15,"used":false},{"PRN":19,"el":43,"az":94,"ss":48,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":0,"used":false}]}
+$GPGGA,221308,5333.7947,N,11326.3773,W,1,05,7.74,661.10,M,-19.872,M,,*7F
$GPRMC,221308,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*31
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918388.149,"ept":0.005,"lat":53.563244746,"lon":-113.439622265,"alt":661.100,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+$GPGBS,221308,0.00,M,0.00,M,75.10,M*07
+{"class":"TPV","tag":"ITK-07","time":1246918388.149,"ept":0.005,"lat":53.563244746,"lon":-113.439622265,"alt":661.100,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"epd":0.0000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,31,06,26,049,33,07,76,101,00,08,60,183,38*74
$GPGSV,3,2,09,10,23,180,14,13,33,166,00,19,43,094,47,25,54,109,45*70
$GPGSV,3,3,09,28,30,125,02*4D
-{"class":"SKY","tag":"ITK-02","time":1246918388.336,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":33,"used":true},{"PRN":7,"el":76,"az":101,"ss":0,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":14,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":2,"used":false}]}
-$GPGGA,221309,5333.7947,N,11326.3773,W,1,05,,661.10,M,-19.872,M,,*64
+{"class":"SKY","tag":"ITK-02","time":1246918388.336,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":33,"used":true},{"PRN":7,"el":76,"az":101,"ss":0,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":14,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":2,"used":false}]}
+$GPGGA,221309,5333.7947,N,11326.3773,W,1,05,7.74,661.10,M,-19.872,M,,*7E
$GPRMC,221309,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*30
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918389.150,"ept":0.005,"lat":53.563244746,"lon":-113.439622265,"alt":661.100,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+$GPGBS,221309,0.00,M,0.00,M,75.10,M*06
+{"class":"TPV","tag":"ITK-07","time":1246918389.150,"ept":0.005,"lat":53.563244746,"lon":-113.439622265,"alt":661.100,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,31,06,26,049,32,07,76,101,08,08,60,183,38*7D
$GPGSV,3,2,09,10,23,180,10,13,33,166,00,19,43,094,48,25,54,109,45*7B
$GPGSV,3,3,09,28,30,125,16*48
-{"class":"SKY","tag":"ITK-02","time":1246918389.358,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":8,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":10,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":48,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":16,"used":false}]}
-$GPGGA,221310,5333.7947,N,11326.3773,W,1,05,,661.10,M,-19.872,M,,*6C
+{"class":"SKY","tag":"ITK-02","time":1246918389.358,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":8,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":10,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":48,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":16,"used":false}]}
+$GPGGA,221310,5333.7947,N,11326.3773,W,1,05,7.74,661.10,M,-19.872,M,,*76
$GPRMC,221310,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*38
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918390.151,"ept":0.005,"lat":53.563244775,"lon":-113.439622126,"alt":661.098,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
-$GPGGA,221311,5333.7947,N,11326.3773,W,1,05,,661.10,M,-19.872,M,,*6D
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+{"class":"TPV","tag":"ITK-07","time":1246918390.151,"ept":0.005,"lat":53.563244775,"lon":-113.439622126,"alt":661.098,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"epd":0.0000,"eps":0.00,"mode":3}
+$GPGGA,221311,5333.7947,N,11326.3773,W,1,05,7.74,661.10,M,-19.872,M,,*77
$GPRMC,221311,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*39
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918391.151,"ept":0.005,"lat":53.563244775,"lon":-113.439622126,"alt":661.098,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+{"class":"TPV","tag":"ITK-07","time":1246918391.151,"ept":0.005,"lat":53.563244775,"lon":-113.439622126,"alt":661.098,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,31,06,26,049,32,07,76,101,26,08,60,183,37*7E
$GPGSV,3,2,09,10,23,180,00,13,33,166,14,19,43,094,47,25,54,109,45*70
$GPGSV,3,3,09,28,30,125,16*48
-{"class":"SKY","tag":"ITK-02","time":1246918391.371,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":26,"used":false},{"PRN":8,"el":60,"az":183,"ss":37,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":14,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":16,"used":false}]}
-$GPGGA,221312,5333.7947,N,11326.3773,W,1,05,,661.10,M,-19.872,M,,*6E
+{"class":"SKY","tag":"ITK-02","time":1246918391.371,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":26,"used":false},{"PRN":8,"el":60,"az":183,"ss":37,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":14,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":16,"used":false}]}
+$GPGGA,221312,5333.7947,N,11326.3773,W,1,05,7.74,661.10,M,-19.872,M,,*74
$GPRMC,221312,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3A
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918392.152,"ept":0.005,"lat":53.563244709,"lon":-113.439622066,"alt":661.103,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+{"class":"TPV","tag":"ITK-07","time":1246918392.152,"ept":0.005,"lat":53.563244709,"lon":-113.439622066,"alt":661.103,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"epd":0.0000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,31,06,26,049,32,07,76,101,26,08,60,183,37*7E
$GPGSV,3,2,09,10,23,180,00,13,33,166,20,19,43,094,47,25,54,109,45*77
$GPGSV,3,3,09,28,30,125,00*4F
-{"class":"SKY","tag":"ITK-02","time":1246918392.326,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":26,"used":false},{"PRN":8,"el":60,"az":183,"ss":37,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":20,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":0,"used":false}]}
-$GPGGA,221313,5333.7947,N,11326.3773,W,1,05,,661.10,M,-19.872,M,,*6F
+{"class":"SKY","tag":"ITK-02","time":1246918392.326,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":31,"used":true},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":26,"used":false},{"PRN":8,"el":60,"az":183,"ss":37,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":20,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":0,"used":false}]}
+$GPGGA,221313,5333.7947,N,11326.3773,W,1,05,7.74,661.10,M,-19.872,M,,*75
$GPRMC,221313,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3B
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918393.153,"ept":0.005,"lat":53.563244709,"lon":-113.439622066,"alt":661.103,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
-$GPGGA,221314,5333.7947,N,11326.3773,W,1,04,,661.10,M,-19.872,M,,*69
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+$GPGBS,221313,0.00,M,0.00,M,75.10,M*0D
+{"class":"TPV","tag":"ITK-07","time":1246918393.153,"ept":0.005,"lat":53.563244709,"lon":-113.439622066,"alt":661.103,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
+$GPGGA,221314,5333.7947,N,11326.3773,W,1,04,7.74,661.10,M,-19.872,M,,*73
$GPRMC,221314,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3C
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918394.153,"ept":0.005,"lat":53.563244709,"lon":-113.439622066,"alt":661.103,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+$GPGBS,221314,0.00,M,0.00,M,75.10,M*0A
+{"class":"TPV","tag":"ITK-07","time":1246918394.153,"ept":0.005,"lat":53.563244709,"lon":-113.439622066,"alt":661.103,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,00,06,26,049,32,07,76,101,00,08,60,183,38*77
$GPGSV,3,2,09,10,23,180,16,13,33,166,00,19,43,094,48,25,54,109,45*7D
$GPGSV,3,3,09,28,30,125,04*4B
-{"class":"SKY","tag":"ITK-02","time":1246918394.337,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":0,"used":true},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":0,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":16,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":48,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":4,"used":false}]}
-$GPGGA,221315,5333.7947,N,11326.3773,W,1,04,,661.10,M,-19.872,M,,*68
+{"class":"SKY","tag":"ITK-02","time":1246918394.337,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":0,"used":true},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":0,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":16,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":48,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":4,"used":false}]}
+$GPGGA,221315,5333.7947,N,11326.3773,W,1,04,7.74,661.10,M,-19.872,M,,*72
$GPRMC,221315,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3D
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918395.154,"ept":0.005,"lat":53.563244709,"lon":-113.439622066,"alt":661.103,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+$GPGBS,221315,0.00,M,0.00,M,75.10,M*0B
+{"class":"TPV","tag":"ITK-07","time":1246918395.154,"ept":0.005,"lat":53.563244709,"lon":-113.439622066,"alt":661.103,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,00,06,26,049,33,07,76,101,05,08,60,183,38*73
$GPGSV,3,2,09,10,23,180,17,13,33,166,00,19,43,094,48,25,54,109,45*7C
$GPGSV,3,3,09,28,30,125,19*47
-{"class":"SKY","tag":"ITK-02","time":1246918395.386,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":0,"used":true},{"PRN":6,"el":26,"az":49,"ss":33,"used":true},{"PRN":7,"el":76,"az":101,"ss":5,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":17,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":48,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":19,"used":false}]}
-$GPGGA,221316,5333.7947,N,11326.3773,W,1,04,,661.10,M,-19.872,M,,*6B
+{"class":"SKY","tag":"ITK-02","time":1246918395.386,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":0,"used":true},{"PRN":6,"el":26,"az":49,"ss":33,"used":true},{"PRN":7,"el":76,"az":101,"ss":5,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":17,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":48,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":19,"used":false}]}
+$GPGGA,221316,5333.7947,N,11326.3773,W,1,04,7.74,661.10,M,-19.872,M,,*71
$GPRMC,221316,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3E
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918396.155,"ept":0.005,"lat":53.563244589,"lon":-113.439622006,"alt":661.101,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
-$GPGGA,221317,5333.7947,N,11326.3773,W,1,04,,661.10,M,-19.872,M,,*6A
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+$GPGBS,221316,0.00,M,0.00,M,75.10,M*08
+{"class":"TPV","tag":"ITK-07","time":1246918396.155,"ept":0.005,"lat":53.563244589,"lon":-113.439622006,"alt":661.101,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"epd":0.0000,"eps":0.00,"mode":3}
+$GPGGA,221317,5333.7947,N,11326.3773,W,1,04,7.74,661.10,M,-19.872,M,,*70
$GPRMC,221317,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3F
-$GPGSA,A,3,03,06,08,19,25,,,,,,,,0.0,0.0,0.0*30
-{"class":"TPV","tag":"ITK-07","time":1246918397.155,"ept":0.005,"lat":53.563244589,"lon":-113.439622006,"alt":661.101,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,03,06,08,19,25,,,,,,,,8.4,7.7,3.3*3C
+$GPGBS,221317,0.00,M,0.00,M,75.10,M*09
+{"class":"TPV","tag":"ITK-07","time":1246918397.155,"ept":0.005,"lat":53.563244589,"lon":-113.439622006,"alt":661.101,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,24,06,26,049,32,07,76,101,19,08,60,183,38*79
$GPGSV,3,2,09,10,23,180,00,13,33,166,15,19,43,094,47,25,54,109,45*71
$GPGSV,3,3,09,28,30,125,21*4C
-{"class":"SKY","tag":"ITK-02","time":1246918397.328,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":24,"used":false},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":19,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":15,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":21,"used":false}]}
-$GPGGA,221318,5333.7947,N,11326.3773,W,1,04,,661.10,M,-19.872,M,,*65
+{"class":"SKY","tag":"ITK-02","time":1246918397.328,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":24,"used":false},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":19,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":15,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":21,"used":false}]}
+$GPGGA,221318,5333.7947,N,11326.3773,W,1,04,7.74,661.10,M,-19.872,M,,*7F
$GPRMC,221318,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*30
-$GPGSA,A,3,06,08,19,25,25,,,,,,,,0.0,0.0,0.0*34
-{"class":"TPV","tag":"ITK-07","time":1246918398.156,"ept":0.005,"lat":53.563244589,"lon":-113.439622006,"alt":661.101,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,06,08,19,25,25,,,,,,,,8.4,7.7,3.3*38
+{"class":"TPV","tag":"ITK-07","time":1246918398.156,"ept":0.005,"lat":53.563244589,"lon":-113.439622006,"alt":661.101,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,25,06,26,049,32,07,76,101,20,08,60,183,38*72
$GPGSV,3,2,09,10,23,180,00,13,33,166,19,19,43,094,47,25,54,109,45*7D
$GPGSV,3,3,09,28,30,125,00*4F
-{"class":"SKY","tag":"ITK-02","time":1246918398.391,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":25,"used":false},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":20,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":19,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":0,"used":false}]}
-$GPGGA,221319,5333.7947,N,11326.3773,W,1,04,,661.10,M,-19.872,M,,*64
+{"class":"SKY","tag":"ITK-02","time":1246918398.391,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":25,"used":false},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":20,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":19,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":0,"used":false}]}
+$GPGGA,221319,5333.7947,N,11326.3773,W,1,04,7.74,661.10,M,-19.872,M,,*7E
$GPRMC,221319,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*31
-$GPGSA,A,3,06,08,19,25,25,,,,,,,,0.0,0.0,0.0*34
-{"class":"TPV","tag":"ITK-07","time":1246918399.157,"ept":0.005,"lat":53.563244589,"lon":-113.439622006,"alt":661.101,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
-$GPGGA,221320,5333.7947,N,11326.3773,W,1,04,,661.11,M,-19.872,M,,*6F
+$GPGSA,A,3,06,08,19,25,25,,,,,,,,8.4,7.7,3.3*38
+$GPGBS,221319,0.00,M,0.00,M,75.10,M*07
+{"class":"TPV","tag":"ITK-07","time":1246918399.157,"ept":0.005,"lat":53.563244589,"lon":-113.439622006,"alt":661.101,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
+$GPGGA,221320,5333.7947,N,11326.3773,W,1,04,7.74,661.11,M,-19.872,M,,*75
$GPRMC,221320,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3B
-$GPGSA,A,3,06,08,19,25,25,,,,,,,,0.0,0.0,0.0*34
-{"class":"TPV","tag":"ITK-07","time":1246918400.157,"ept":0.005,"lat":53.563244523,"lon":-113.439621946,"alt":661.106,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,06,08,19,25,25,,,,,,,,8.4,7.7,3.3*38
+{"class":"TPV","tag":"ITK-07","time":1246918400.157,"ept":0.005,"lat":53.563244523,"lon":-113.439621946,"alt":661.106,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"epd":0.0000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,00,06,26,049,32,07,76,101,00,08,60,183,38*77
$GPGSV,3,2,09,10,23,180,24,13,33,166,00,19,43,094,48,25,54,109,45*7C
$GPGSV,3,3,09,28,30,125,06*49
-{"class":"SKY","tag":"ITK-02","time":1246918400.329,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":0,"used":false},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":0,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":24,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":48,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":6,"used":false}]}
-$GPGGA,221321,5333.7947,N,11326.3773,W,1,04,,661.11,M,-19.872,M,,*6E
+{"class":"SKY","tag":"ITK-02","time":1246918400.329,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":0,"used":false},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":0,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":24,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":48,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":6,"used":false}]}
+$GPGGA,221321,5333.7947,N,11326.3773,W,1,04,7.74,661.11,M,-19.872,M,,*74
$GPRMC,221321,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3A
-$GPGSA,A,3,06,08,19,25,25,,,,,,,,0.0,0.0,0.0*34
-{"class":"TPV","tag":"ITK-07","time":1246918401.158,"ept":0.005,"lat":53.563244523,"lon":-113.439621946,"alt":661.106,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,06,08,19,25,25,,,,,,,,8.4,7.7,3.3*38
+{"class":"TPV","tag":"ITK-07","time":1246918401.158,"ept":0.005,"lat":53.563244523,"lon":-113.439621946,"alt":661.106,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,00,06,26,049,31,07,76,101,00,08,60,183,38*74
$GPGSV,3,2,09,10,23,180,25,13,33,166,00,19,43,094,47,25,54,109,45*72
$GPGSV,3,3,09,28,30,125,07*48
-{"class":"SKY","tag":"ITK-02","time":1246918401.431,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":0,"used":false},{"PRN":6,"el":26,"az":49,"ss":31,"used":true},{"PRN":7,"el":76,"az":101,"ss":0,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":25,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":7,"used":false}]}
-$GPGGA,221322,5333.7947,N,11326.3773,W,1,04,,661.11,M,-19.872,M,,*6D
+{"class":"SKY","tag":"ITK-02","time":1246918401.431,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":0,"used":false},{"PRN":6,"el":26,"az":49,"ss":31,"used":true},{"PRN":7,"el":76,"az":101,"ss":0,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":25,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":7,"used":false}]}
+$GPGGA,221322,5333.7947,N,11326.3773,W,1,04,7.74,661.11,M,-19.872,M,,*77
$GPRMC,221322,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*39
-$GPGSA,A,3,06,08,19,25,25,,,,,,,,0.0,0.0,0.0*34
-{"class":"TPV","tag":"ITK-07","time":1246918402.158,"ept":0.005,"lat":53.563244523,"lon":-113.439621946,"alt":661.106,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
-$GPGGA,221323,5333.7947,N,11326.3773,W,1,04,,661.11,M,-19.872,M,,*6C
+$GPGSA,A,3,06,08,19,25,25,,,,,,,,8.4,7.7,3.3*38
+{"class":"TPV","tag":"ITK-07","time":1246918402.158,"ept":0.005,"lat":53.563244523,"lon":-113.439621946,"alt":661.106,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
+$GPGGA,221323,5333.7947,N,11326.3773,W,1,04,7.74,661.11,M,-19.872,M,,*76
$GPRMC,221323,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*38
-$GPGSA,A,3,06,08,19,25,25,,,,,,,,0.0,0.0,0.0*34
-{"class":"TPV","tag":"ITK-07","time":1246918403.159,"ept":0.005,"lat":53.563244523,"lon":-113.439621946,"alt":661.106,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,06,08,19,25,25,,,,,,,,8.4,7.7,3.3*38
+{"class":"TPV","tag":"ITK-07","time":1246918403.159,"ept":0.005,"lat":53.563244523,"lon":-113.439621946,"alt":661.106,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,24,06,26,049,32,07,76,101,21,08,60,183,38*72
$GPGSV,3,2,09,10,23,180,00,13,33,166,21,19,43,094,47,25,54,109,45*76
$GPGSV,3,3,09,28,30,125,17*49
-{"class":"SKY","tag":"ITK-02","time":1246918403.350,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":24,"used":false},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":21,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":21,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":17,"used":false}]}
-$GPGGA,221324,5333.7947,N,11326.3773,W,1,04,,661.11,M,-19.872,M,,*6B
+{"class":"SKY","tag":"ITK-02","time":1246918403.350,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":24,"used":false},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":21,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":21,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":17,"used":false}]}
+$GPGGA,221324,5333.7947,N,11326.3773,W,1,04,7.74,661.11,M,-19.872,M,,*71
$GPRMC,221324,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3F
-$GPGSA,A,3,06,08,19,25,25,,,,,,,,0.0,0.0,0.0*34
-{"class":"TPV","tag":"ITK-07","time":1246918404.160,"ept":0.005,"lat":53.563244428,"lon":-113.439622025,"alt":661.114,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,06,08,19,25,25,,,,,,,,8.4,7.7,3.3*38
+{"class":"TPV","tag":"ITK-07","time":1246918404.160,"ept":0.005,"lat":53.563244428,"lon":-113.439622025,"alt":661.114,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"epd":0.0000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,26,06,26,049,32,07,76,101,22,08,60,183,38*73
$GPGSV,3,2,09,10,23,180,00,13,33,166,19,19,43,094,47,25,54,109,45*7D
$GPGSV,3,3,09,28,30,125,00*4F
-{"class":"SKY","tag":"ITK-02","time":1246918404.356,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":26,"used":false},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":22,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":19,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":0,"used":false}]}
-$GPGGA,221325,5333.7947,N,11326.3773,W,1,04,,661.11,M,-19.872,M,,*6A
+{"class":"SKY","tag":"ITK-02","time":1246918404.356,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":26,"used":false},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":22,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":0,"used":false},{"PRN":13,"el":33,"az":166,"ss":19,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":0,"used":false}]}
+$GPGGA,221325,5333.7947,N,11326.3773,W,1,04,7.74,661.11,M,-19.872,M,,*70
$GPRMC,221325,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3E
-$GPGSA,A,3,06,08,19,25,25,,,,,,,,0.0,0.0,0.0*34
-{"class":"TPV","tag":"ITK-07","time":1246918405.160,"ept":0.005,"lat":53.563244428,"lon":-113.439622025,"alt":661.114,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
-$GPGGA,221326,5333.7947,N,11326.3773,W,1,04,,661.11,M,-19.872,M,,*69
+$GPGSA,A,3,06,08,19,25,25,,,,,,,,8.4,7.7,3.3*38
+$GPGBS,221325,0.00,M,0.00,M,75.10,M*08
+{"class":"TPV","tag":"ITK-07","time":1246918405.160,"ept":0.005,"lat":53.563244428,"lon":-113.439622025,"alt":661.114,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
+$GPGGA,221326,5333.7947,N,11326.3773,W,1,04,7.74,661.11,M,-19.872,M,,*73
$GPRMC,221326,A,5333.7947,N,11326.3773,W,0.0000,0.000,060709,,*3D
-$GPGSA,A,3,06,08,19,25,25,,,,,,,,0.0,0.0,0.0*34
-{"class":"TPV","tag":"ITK-07","time":1246918406.161,"ept":0.005,"lat":53.563244428,"lon":-113.439622025,"alt":661.114,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,06,08,19,25,25,,,,,,,,8.4,7.7,3.3*38
+{"class":"TPV","tag":"ITK-07","time":1246918406.161,"ept":0.005,"lat":53.563244428,"lon":-113.439622025,"alt":661.114,"epx":0.000,"epy":0.000,"epv":75.102,"track":0.0000,"speed":0.000,"climb":0.000,"eps":0.00,"mode":3}
$GPGSV,3,1,09,03,35,061,00,06,26,049,32,07,76,101,00,08,60,183,38*77
$GPGSV,3,2,09,10,23,180,16,13,33,166,00,19,43,094,47,25,54,109,45*72
$GPGSV,3,3,09,28,30,125,02*4D
-{"class":"SKY","tag":"ITK-02","time":1246918406.375,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":3,"el":35,"az":61,"ss":0,"used":false},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":0,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":16,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":2,"used":false}]}
+{"class":"SKY","tag":"ITK-02","time":1246918406.375,"xdop":0.00,"ydop":0.00,"vdop":3.27,"tdop":4.44,"hdop":7.74,"gdop":9.50,"pdop":8.40,"satellites":[{"PRN":3,"el":35,"az":61,"ss":0,"used":false},{"PRN":6,"el":26,"az":49,"ss":32,"used":true},{"PRN":7,"el":76,"az":101,"ss":0,"used":false},{"PRN":8,"el":60,"az":183,"ss":38,"used":true},{"PRN":10,"el":23,"az":180,"ss":16,"used":false},{"PRN":13,"el":33,"az":166,"ss":0,"used":false},{"PRN":19,"el":43,"az":94,"ss":47,"used":true},{"PRN":25,"el":54,"az":109,"ss":45,"used":true},{"PRN":28,"el":30,"az":125,"ss":2,"used":false}]}
diff --git a/test/daemon/magellan315.log.chk b/test/daemon/magellan315.log.chk
index 1bbdda77..e80bf38b 100644
--- a/test/daemon/magellan315.log.chk
+++ b/test/daemon/magellan315.log.chk
@@ -9,16 +9,16 @@ $GPGSA,A,3,19,15,03,18,22,11,,,,,,,3.5,2.1,2.7*34
$GPGSV,3,1,12,19,77,349,45,03,68,117,41,22,39,052,52,11,35,274,56*7E
$GPGSV,3,2,12,15,22,062,52,14,21,106,,16,10,171,,18,10,040,47*73
$GPGSV,3,3,12,01,08,146,,20,04,211,,08,02,294,,28,02,328,*70
-{"class":"SKY","tag":"GSV","vdop":2.70,"hdop":2.10,"pdop":3.50,"satellites":[{"PRN":19,"el":77,"az":349,"ss":45,"used":true},{"PRN":3,"el":68,"az":117,"ss":41,"used":true},{"PRN":22,"el":39,"az":52,"ss":52,"used":true},{"PRN":11,"el":35,"az":274,"ss":56,"used":true},{"PRN":15,"el":22,"az":62,"ss":52,"used":true},{"PRN":14,"el":21,"az":106,"ss":0,"used":false},{"PRN":16,"el":10,"az":171,"ss":0,"used":false},{"PRN":18,"el":10,"az":40,"ss":47,"used":true},{"PRN":1,"el":8,"az":146,"ss":0,"used":false},{"PRN":20,"el":4,"az":211,"ss":0,"used":false},{"PRN":8,"el":2,"az":294,"ss":0,"used":false},{"PRN":28,"el":2,"az":328,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.76,"ydop":1.47,"vdop":2.70,"tdop":1.37,"hdop":2.10,"gdop":2.83,"pdop":3.50,"satellites":[{"PRN":19,"el":77,"az":349,"ss":45,"used":true},{"PRN":3,"el":68,"az":117,"ss":41,"used":true},{"PRN":22,"el":39,"az":52,"ss":52,"used":true},{"PRN":11,"el":35,"az":274,"ss":56,"used":true},{"PRN":15,"el":22,"az":62,"ss":52,"used":true},{"PRN":14,"el":21,"az":106,"ss":0,"used":false},{"PRN":16,"el":10,"az":171,"ss":0,"used":false},{"PRN":18,"el":10,"az":40,"ss":47,"used":true},{"PRN":1,"el":8,"az":146,"ss":0,"used":false},{"PRN":20,"el":4,"az":211,"ss":0,"used":false},{"PRN":8,"el":2,"az":294,"ss":0,"used":false},{"PRN":28,"el":2,"az":328,"ss":0,"used":false}]}
$GPGLL,3908.8200,N,00023.0832,W,120827.523,A*2C
$GPGGA,120827.52,3908.8200,N,00023.0832,W,1,06,2.1,00176,M,,,,*3F
$GPRMC,120827.52,A,3908.8200,N,00023.0832,W,00.0,000.0,130305,01.,W*64
-{"class":"TPV","tag":"RMC","time":1110715707.520,"ept":0.005,"lat":39.147000000,"lon":-0.384720000,"alt":176.000,"epx":11.328,"epy":22.003,"epv":62.100,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+{"class":"TPV","tag":"RMC","time":1110715707.520,"ept":0.005,"lat":39.147000000,"lon":-0.384720000,"alt":176.000,"epx":11.328,"epy":22.003,"epv":62.100,"track":0.0000,"speed":0.000,"climb":0.000,"eps":15.93,"mode":3}
$GPGSA,A,3,19,15,03,18,22,11,,,,,,,3.5,2.1,2.7*34
$GPGSV,3,1,12,19,77,349,46,03,68,117,42,22,39,052,50,11,35,274,55*7F
$GPGSV,3,2,12,15,22,062,52,14,21,106,,16,10,171,,18,10,040,49*7D
$GPGSV,3,3,12,01,08,146,,20,04,211,,08,02,294,,28,02,328,*70
-{"class":"SKY","tag":"GSV","vdop":2.70,"hdop":2.10,"pdop":3.50,"satellites":[{"PRN":19,"el":77,"az":349,"ss":46,"used":true},{"PRN":3,"el":68,"az":117,"ss":42,"used":true},{"PRN":22,"el":39,"az":52,"ss":50,"used":true},{"PRN":11,"el":35,"az":274,"ss":55,"used":true},{"PRN":15,"el":22,"az":62,"ss":52,"used":true},{"PRN":14,"el":21,"az":106,"ss":0,"used":false},{"PRN":16,"el":10,"az":171,"ss":0,"used":false},{"PRN":18,"el":10,"az":40,"ss":49,"used":true},{"PRN":1,"el":8,"az":146,"ss":0,"used":false},{"PRN":20,"el":4,"az":211,"ss":0,"used":false},{"PRN":8,"el":2,"az":294,"ss":0,"used":false},{"PRN":28,"el":2,"az":328,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.76,"ydop":1.47,"vdop":2.70,"tdop":1.37,"hdop":2.10,"gdop":2.83,"pdop":3.50,"satellites":[{"PRN":19,"el":77,"az":349,"ss":46,"used":true},{"PRN":3,"el":68,"az":117,"ss":42,"used":true},{"PRN":22,"el":39,"az":52,"ss":50,"used":true},{"PRN":11,"el":35,"az":274,"ss":55,"used":true},{"PRN":15,"el":22,"az":62,"ss":52,"used":true},{"PRN":14,"el":21,"az":106,"ss":0,"used":false},{"PRN":16,"el":10,"az":171,"ss":0,"used":false},{"PRN":18,"el":10,"az":40,"ss":49,"used":true},{"PRN":1,"el":8,"az":146,"ss":0,"used":false},{"PRN":20,"el":4,"az":211,"ss":0,"used":false},{"PRN":8,"el":2,"az":294,"ss":0,"used":false},{"PRN":28,"el":2,"az":328,"ss":0,"used":false}]}
$GPGLL,3908.8201,N,00023.0832,W,120829.500,A*22
$GPGGA,120829.50,3908.8201,N,00023.0832,W,1,06,2.1,00176,M,,,,*32
$GPRMC,120829.50,A,3908.8201,N,00023.0832,W,00.0,000.0,130305,01.,W*69
@@ -27,4 +27,4 @@ $GPGSA,A,3,19,15,03,18,22,11,,,,,,,3.5,2.1,2.7*34
$GPGSV,3,1,12,19,77,349,44,03,68,117,42,22,39,052,52,11,35,274,56*7C
$GPGSV,3,2,12,15,22,062,52,14,21,106,,16,10,171,,18,10,040,47*73
$GPGSV,3,3,12,01,08,146,,20,04,211,,08,02,294,,28,02,328,*70
-{"class":"SKY","tag":"GSV","vdop":2.70,"hdop":2.10,"pdop":3.50,"satellites":[{"PRN":19,"el":77,"az":349,"ss":44,"used":true},{"PRN":3,"el":68,"az":117,"ss":42,"used":true},{"PRN":22,"el":39,"az":52,"ss":52,"used":true},{"PRN":11,"el":35,"az":274,"ss":56,"used":true},{"PRN":15,"el":22,"az":62,"ss":52,"used":true},{"PRN":14,"el":21,"az":106,"ss":0,"used":false},{"PRN":16,"el":10,"az":171,"ss":0,"used":false},{"PRN":18,"el":10,"az":40,"ss":47,"used":true},{"PRN":1,"el":8,"az":146,"ss":0,"used":false},{"PRN":20,"el":4,"az":211,"ss":0,"used":false},{"PRN":8,"el":2,"az":294,"ss":0,"used":false},{"PRN":28,"el":2,"az":328,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.76,"ydop":1.47,"vdop":2.70,"tdop":1.37,"hdop":2.10,"gdop":2.83,"pdop":3.50,"satellites":[{"PRN":19,"el":77,"az":349,"ss":44,"used":true},{"PRN":3,"el":68,"az":117,"ss":42,"used":true},{"PRN":22,"el":39,"az":52,"ss":52,"used":true},{"PRN":11,"el":35,"az":274,"ss":56,"used":true},{"PRN":15,"el":22,"az":62,"ss":52,"used":true},{"PRN":14,"el":21,"az":106,"ss":0,"used":false},{"PRN":16,"el":10,"az":171,"ss":0,"used":false},{"PRN":18,"el":10,"az":40,"ss":47,"used":true},{"PRN":1,"el":8,"az":146,"ss":0,"used":false},{"PRN":20,"el":4,"az":211,"ss":0,"used":false},{"PRN":8,"el":2,"az":294,"ss":0,"used":false},{"PRN":28,"el":2,"az":328,"ss":0,"used":false}]}
diff --git a/test/daemon/navcom.log.chk b/test/daemon/navcom.log.chk
index b01d6b4a..a9e765a8 100644
--- a/test/daemon/navcom.log.chk
+++ b/test/daemon/navcom.log.chk
@@ -6,7 +6,7 @@ $GPGBS,102009,0.22,M,0.22,M,10.35,M*03
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,39,03,10,284,34*7F
$GPGSV,3,3,10,07,43,056,43,22,13,173,34*7C
-{"class":"SKY","tag":"0x86","time":1168732908.624,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":34,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.624,"xdop":0.55,"ydop":0.74,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":34,"used":false}]}
$GPGGA,102010,3020.5010,N,01213.7241,E,2,09,1.00,627.58,M,31.479,M,,*49
$GPRMC,102010,A,3020.5010,N,01213.7241,E,31847.9464,0.000,150107,,*2F
$GPGSA,A,3,03,06,07,16,18,21,25,30,31,,,,2.0,1.0,1.8*31
@@ -15,7 +15,7 @@ $GPGBS,102010,0.22,M,0.22,M,10.35,M*0B
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,39,03,10,284,34*7F
$GPGSV,3,3,10,07,43,056,43,22,13,173,32*7A
-{"class":"SKY","tag":"0x86","time":1168732908.625,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":32,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.625,"xdop":0.55,"ydop":0.74,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":32,"used":false}]}
$GPGGA,102011,3020.5010,N,01213.7242,E,2,09,1.00,627.56,M,31.479,M,,*45
$GPRMC,102011,A,3020.5010,N,01213.7242,E,0.0019,90.000,150107,,*1A
$GPGSA,A,3,03,06,07,16,18,21,25,30,31,,,,2.0,1.0,1.8*31
@@ -24,7 +24,7 @@ $GPGBS,102011,0.22,M,0.22,M,10.35,M*0A
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,39,03,10,284,34*7F
$GPGSV,3,3,10,07,43,056,43,22,13,173,44*7B
-{"class":"SKY","tag":"0x86","time":1168732908.626,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":44,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.626,"xdop":0.55,"ydop":0.74,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":44,"used":false}]}
$GPGGA,102012,3020.5010,N,01213.7242,E,2,09,1.00,627.55,M,31.479,M,,*45
$GPRMC,102012,A,3020.5010,N,01213.7242,E,0.0019,90.000,150107,,*19
$GPGSA,A,3,03,06,07,16,18,21,25,30,31,,,,2.0,1.0,1.8*31
@@ -33,16 +33,15 @@ $GPGBS,102012,0.22,M,0.22,M,10.35,M*09
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,39,03,10,284,34*7F
$GPGSV,3,3,10,07,43,056,43,22,13,173,44*7B
-{"class":"SKY","tag":"0x86","time":1168732908.627,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":44,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.627,"xdop":0.55,"ydop":0.74,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":44,"used":false}]}
$GPGGA,102013,3020.5010,N,01213.7242,E,2,09,1.00,627.55,M,31.480,M,,*42
$GPRMC,102013,A,3020.5010,N,01213.7242,E,0.0019,0.000,150107,,*21
$GPGSA,A,3,03,06,07,16,18,21,25,30,31,,,,2.0,1.0,1.8*31
-$GPGBS,102013,0.22,M,0.22,M,10.35,M*08
{"class":"TPV","tag":"0xb1","time":1168856413.000,"ept":3.920,"lat":30.341683214,"lon":12.228735860,"alt":627.552,"epx":0.222,"epy":0.222,"epv":10.350,"track":0.0000,"speed":0.001,"climb":0.000,"eps":0.44,"mode":3}
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,38,03,10,284,34*7E
$GPGSV,3,3,10,07,43,056,43,22,13,173,44*7B
-{"class":"SKY","tag":"0x86","time":1168732908.628,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":44,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.628,"xdop":0.55,"ydop":0.74,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":44,"used":false}]}
$GPGGA,102014,3020.5010,N,01213.7242,E,2,09,1.00,627.54,M,31.479,M,,*42
$GPRMC,102014,A,3020.5010,N,01213.7242,E,0.0019,0.000,150107,,*26
$GPGSA,A,3,03,06,07,16,18,21,25,30,31,,,,2.0,1.0,1.8*31
@@ -51,7 +50,7 @@ $GPGBS,102014,0.22,M,0.22,M,10.35,M*0F
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,38,03,10,284,34*7E
$GPGSV,3,3,10,07,43,056,43,22,13,173,35*7D
-{"class":"SKY","tag":"0x86","time":1168732908.629,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.629,"xdop":0.55,"ydop":0.74,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
$GPGGA,102015,3020.5010,N,01213.7242,E,2,09,1.00,627.55,M,31.479,M,,*42
$GPRMC,102015,A,3020.5010,N,01213.7242,E,31847.9407,0.000,150107,,*2C
$GPGSA,A,3,03,06,07,16,18,21,25,30,31,,,,2.0,1.0,1.8*31
@@ -60,7 +59,7 @@ $GPGBS,102015,0.22,M,0.22,M,10.35,M*0E
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,38,03,10,284,34*7E
$GPGSV,3,3,10,07,43,056,43,22,13,173,35*7D
-{"class":"SKY","tag":"0x86","time":1168732908.630,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.630,"xdop":0.55,"ydop":0.74,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
$GPGGA,102016,3020.5010,N,01213.7242,E,2,09,1.00,627.55,M,31.479,M,,*41
$GPRMC,102016,A,3020.5010,N,01213.7242,E,0.0019,0.000,150107,,*24
$GPGSA,A,3,03,06,07,16,18,21,25,30,31,,,,2.0,1.0,1.8*31
@@ -69,7 +68,7 @@ $GPGBS,102016,0.22,M,0.22,M,10.35,M*0D
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,39,03,10,284,34*7F
$GPGSV,3,3,10,07,43,056,43,22,13,173,01*7A
-{"class":"SKY","tag":"0x86","time":1168732908.631,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":1,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.631,"xdop":0.55,"ydop":0.74,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":1,"used":false}]}
$GPGGA,102017,3020.5010,N,01213.7242,E,2,09,1.00,627.56,M,31.479,M,,*43
$GPRMC,102017,A,3020.5010,N,01213.7242,E,0.0000,0.000,150107,,*2D
$GPGSA,A,3,03,06,07,16,18,21,25,30,31,,,,2.0,1.0,1.8*31
@@ -78,7 +77,7 @@ $GPGBS,102017,0.22,M,0.22,M,10.35,M*0C
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,39,03,10,284,34*7F
$GPGSV,3,3,10,07,43,056,43,22,13,173,33*7B
-{"class":"SKY","tag":"0x86","time":1168732908.632,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":33,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.632,"xdop":0.55,"ydop":0.74,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":33,"used":false}]}
$GPGGA,102018,3020.5010,N,01213.7241,E,2,09,1.00,627.56,M,31.479,M,,*4F
$GPRMC,102018,A,3020.5010,N,01213.7241,E,0.0019,90.000,150107,,*10
$GPGSA,A,3,03,06,07,16,18,21,25,30,31,,,,2.0,1.0,1.8*31
@@ -87,7 +86,7 @@ $GPGBS,102018,0.22,M,0.22,M,10.35,M*03
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,39,03,10,284,34*7F
$GPGSV,3,3,10,07,43,056,43,22,13,173,35*7D
-{"class":"SKY","tag":"0x86","time":1168732908.633,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.633,"xdop":0.55,"ydop":0.74,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
$GPGGA,102019,3020.5010,N,01213.7242,E,2,09,1.00,627.56,M,31.479,M,,*4D
$GPRMC,102019,A,3020.5010,N,01213.7242,E,0.0060,71.565,150107,,*15
$GPGSA,A,3,03,06,07,16,18,21,25,30,31,,,,2.0,1.0,1.8*31
@@ -96,7 +95,7 @@ $GPGBS,102019,0.22,M,0.22,M,10.35,M*02
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,38,03,10,284,34*7E
$GPGSV,3,3,10,07,43,056,43,22,13,173,35*7D
-{"class":"SKY","tag":"0x86","time":1168732908.634,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.634,"xdop":0.55,"ydop":0.74,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
$GPGGA,102020,3020.5010,N,01213.7242,E,2,09,1.00,627.56,M,31.479,M,,*47
$GPRMC,102020,A,3020.5010,N,01213.7242,E,0.0019,0.000,150107,,*21
$GPGSA,A,3,03,06,07,16,18,21,25,30,31,,,,2.0,1.0,1.8*31
@@ -105,7 +104,7 @@ $GPGBS,102020,0.22,M,0.22,M,10.35,M*08
$GPGSV,3,1,10,21,78,040,46,31,39,230,45,06,36,062,43,25,36,245,43*7E
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,39,03,10,284,34*7F
$GPGSV,3,3,10,07,43,056,43,22,13,173,35*7D
-{"class":"SKY","tag":"0x86","time":1168732908.635,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":45,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.635,"xdop":0.55,"ydop":0.74,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":45,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
$GPGGA,102021,3020.5010,N,01213.7242,E,2,09,1.00,627.54,M,31.480,M,,*42
$GPRMC,102021,A,3020.5010,N,01213.7242,E,31847.9445,0.000,150107,,*2D
$GPGSA,A,3,03,06,07,16,18,21,25,30,31,,,,2.0,1.0,1.8*31
@@ -114,7 +113,7 @@ $GPGBS,102021,0.22,M,0.22,M,10.35,M*09
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,39,03,10,284,34*7F
$GPGSV,3,3,10,07,43,056,43,22,13,173,35*7D
-{"class":"SKY","tag":"0x86","time":1168732908.636,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.636,"xdop":0.55,"ydop":0.74,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
$GPGGA,102022,3020.5010,N,01213.7242,E,2,09,1.00,627.52,M,31.479,M,,*41
$GPRMC,102022,A,3020.5010,N,01213.7242,E,31847.9464,0.000,150107,,*2D
$GPGSA,A,3,03,06,07,16,18,21,25,30,31,,,,2.0,1.0,1.8*31
@@ -123,7 +122,7 @@ $GPGBS,102022,0.22,M,0.22,M,10.35,M*0A
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,39,03,10,284,34*7F
$GPGSV,3,3,10,07,43,056,43,22,13,173,35*7D
-{"class":"SKY","tag":"0x86","time":1168732908.637,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.637,"xdop":0.55,"ydop":0.74,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
$GPGGA,102023,3020.5010,N,01213.7242,E,2,09,1.00,627.54,M,31.479,M,,*46
$GPRMC,102023,A,3020.5010,N,01213.7242,E,0.0027,45.000,150107,,*1E
$GPGSA,A,3,03,06,07,16,18,21,25,30,31,,,,2.0,1.0,1.8*31
@@ -132,7 +131,7 @@ $GPGBS,102023,0.22,M,0.22,M,10.35,M*0B
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,39,03,10,284,32*79
$GPGSV,3,3,10,07,43,056,43,22,13,173,35*7D
-{"class":"SKY","tag":"0x86","time":1168732908.638,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":32,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.638,"xdop":0.55,"ydop":0.74,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":32,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
$GPGGA,102024,3020.5010,N,01213.7242,E,2,09,1.00,627.52,M,31.479,M,,*47
$GPRMC,102024,A,3020.5010,N,01213.7242,E,45039.7977,45.000,150107,,*19
$GPGSA,A,3,03,06,07,16,18,21,25,30,31,,,,2.0,1.0,1.8*31
@@ -141,7 +140,7 @@ $GPGBS,102024,0.22,M,0.22,M,10.35,M*0C
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,39,03,10,284,35*7E
$GPGSV,3,3,10,07,43,056,43,22,13,173,35*7D
-{"class":"SKY","tag":"0x86","time":1168732908.639,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":false},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":35,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.639,"xdop":0.59,"ydop":0.81,"vdop":1.80,"tdop":1.30,"hdop":1.00,"gdop":2.40,"pdop":2.00,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":false},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":39,"used":true},{"PRN":3,"el":10,"az":284,"ss":35,"used":true},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":35,"used":false}]}
$GPGGA,102025,3020.5010,N,01213.7242,E,2,08,1.10,627.55,M,31.479,M,,*41
$GPRMC,102025,A,3020.5010,N,01213.7242,E,0.0057,90.000,150107,,*17
$GPGSA,A,3,06,07,16,18,21,25,30,31,31,,,,2.3,1.1,2.1*38
@@ -150,7 +149,7 @@ $GPGBS,102025,0.22,M,0.22,M,12.08,M*01
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,38,03,10,284,33*79
$GPGSV,3,3,10,07,43,056,43,22,13,173,34*7C
-{"class":"SKY","tag":"0x86","time":1168732908.640,"vdop":2.10,"tdop":1.50,"hdop":1.10,"gdop":2.80,"pdop":2.30,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":33,"used":false},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":34,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.640,"xdop":0.59,"ydop":0.81,"vdop":2.10,"tdop":1.50,"hdop":1.10,"gdop":2.80,"pdop":2.30,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":33,"used":false},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":34,"used":false}]}
$GPGGA,102026,3020.5010,N,01213.7242,E,2,08,1.10,627.54,M,31.479,M,,*43
$GPRMC,102026,A,3020.5010,N,01213.7242,E,0.0042,26.565,150107,,*1B
$GPGSA,A,3,06,07,16,18,21,25,30,31,31,,,,2.3,1.1,2.1*38
@@ -159,7 +158,7 @@ $GPGBS,102026,0.22,M,0.22,M,12.08,M*02
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,38,03,10,284,32*78
$GPGSV,3,3,10,07,43,056,43,22,13,173,34*7C
-{"class":"SKY","tag":"0x86","time":1168732908.641,"vdop":2.10,"tdop":1.50,"hdop":1.10,"gdop":2.80,"pdop":2.30,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":32,"used":false},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":34,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.641,"xdop":0.59,"ydop":0.81,"vdop":2.10,"tdop":1.50,"hdop":1.10,"gdop":2.80,"pdop":2.30,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":32,"used":false},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":34,"used":false}]}
$GPGGA,102027,3020.5010,N,01213.7242,E,2,08,1.10,627.53,M,31.479,M,,*45
$GPRMC,102027,A,3020.5010,N,01213.7242,E,31847.9464,90.000,150107,,*11
$GPGSA,A,3,06,07,16,18,21,25,30,31,31,,,,2.3,1.1,2.1*38
@@ -168,7 +167,7 @@ $GPGBS,102027,0.24,M,0.24,M,12.08,M*03
$GPGSV,3,1,10,21,78,040,46,31,39,230,45,06,36,062,43,25,36,245,43*7E
$GPGSV,3,2,10,30,26,132,37,16,40,321,42,18,31,140,38,03,10,284,32*77
$GPGSV,3,3,10,07,43,056,43,22,13,173,34*7C
-{"class":"SKY","tag":"0x86","time":1168732908.642,"vdop":2.10,"tdop":1.50,"hdop":1.10,"gdop":2.80,"pdop":2.30,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":45,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":37,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":32,"used":false},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":34,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.642,"xdop":0.59,"ydop":0.81,"vdop":2.10,"tdop":1.50,"hdop":1.10,"gdop":2.80,"pdop":2.30,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":45,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":37,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":32,"used":false},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":34,"used":false}]}
$GPGGA,102028,3020.5010,N,01213.7242,E,2,08,1.10,627.54,M,31.479,M,,*4D
$GPRMC,102028,A,3020.5010,N,01213.7242,E,31847.9464,90.000,150107,,*1E
$GPGSA,A,3,06,07,16,18,21,25,30,31,31,,,,2.3,1.1,2.1*38
@@ -177,7 +176,7 @@ $GPGBS,102028,0.24,M,0.24,M,12.08,M*0C
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,38,03,10,284,33*79
$GPGSV,3,3,10,07,43,056,43,22,13,173,34*7C
-{"class":"SKY","tag":"0x86","time":1168732908.643,"vdop":2.10,"tdop":1.50,"hdop":1.10,"gdop":2.80,"pdop":2.30,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":33,"used":false},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":34,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.643,"xdop":0.59,"ydop":0.81,"vdop":2.10,"tdop":1.50,"hdop":1.10,"gdop":2.80,"pdop":2.30,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":33,"used":false},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":34,"used":false}]}
$GPGGA,102029,3020.5010,N,01213.7242,E,2,08,1.10,627.56,M,31.479,M,,*4E
$GPRMC,102029,A,3020.5010,N,01213.7242,E,31847.9445,0.000,150107,,*25
$GPGSA,A,3,06,07,16,18,21,25,30,31,31,,,,2.3,1.1,2.1*38
@@ -186,7 +185,7 @@ $GPGBS,102029,0.24,M,0.24,M,12.08,M*0D
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,38,03,10,284,34*7E
$GPGSV,3,3,10,07,43,056,43,22,13,173,34*7C
-{"class":"SKY","tag":"0x86","time":1168732908.644,"vdop":2.10,"tdop":1.50,"hdop":1.10,"gdop":2.80,"pdop":2.30,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":false},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":34,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.644,"xdop":0.59,"ydop":0.81,"vdop":2.10,"tdop":1.50,"hdop":1.10,"gdop":2.80,"pdop":2.30,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":false},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":34,"used":false}]}
$GPGGA,102030,3020.5010,N,01213.7242,E,2,08,1.10,627.54,M,31.479,M,,*44
$GPRMC,102030,A,3020.5010,N,01213.7242,E,31847.9464,90.000,150107,,*17
$GPGSA,A,3,06,07,16,18,21,25,30,31,31,,,,2.3,1.1,2.1*38
@@ -195,4 +194,4 @@ $GPGBS,102030,0.25,M,0.25,M,12.08,M*05
$GPGSV,3,1,10,21,78,040,46,31,39,230,44,06,36,062,43,25,36,245,43*7F
$GPGSV,3,2,10,30,26,132,38,16,40,321,42,18,31,140,38,03,10,284,34*7E
$GPGSV,3,3,10,07,43,056,43,22,13,173,34*7C
-{"class":"SKY","tag":"0x86","time":1168732908.645,"vdop":2.10,"tdop":1.50,"hdop":1.10,"gdop":2.80,"pdop":2.30,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":false},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":34,"used":false}]}
+{"class":"SKY","tag":"0x86","time":1168732908.645,"xdop":0.59,"ydop":0.81,"vdop":2.10,"tdop":1.50,"hdop":1.10,"gdop":2.80,"pdop":2.30,"satellites":[{"PRN":21,"el":78,"az":40,"ss":46,"used":true},{"PRN":31,"el":39,"az":230,"ss":44,"used":true},{"PRN":6,"el":36,"az":62,"ss":43,"used":true},{"PRN":25,"el":36,"az":245,"ss":43,"used":true},{"PRN":30,"el":26,"az":132,"ss":38,"used":true},{"PRN":16,"el":40,"az":321,"ss":42,"used":true},{"PRN":18,"el":31,"az":140,"ss":38,"used":true},{"PRN":3,"el":10,"az":284,"ss":34,"used":false},{"PRN":7,"el":43,"az":56,"ss":43,"used":true},{"PRN":22,"el":13,"az":173,"ss":34,"used":false}]}
diff --git a/test/daemon/nl402u.log.chk b/test/daemon/nl402u.log.chk
index 223a2ac1..fdd6aea6 100644
--- a/test/daemon/nl402u.log.chk
+++ b/test/daemon/nl402u.log.chk
@@ -15,7 +15,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.7,1.1,1.3*3C
$GPGSV,3,1,12,08,30,075,25,09,20,262,32,10,16,194,27,15,74,263,46*77
$GPGSV,3,2,12,17,14,127,19,18,22,315,27,19,05,014,27,21,00,284,*7F
$GPGSV,3,3,12,22,00,337,19,26,03,304,,27,41,264,26,28,58,081,30*7C
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.10,"pdop":1.70,"satellites":[{"PRN":8,"el":30,"az":75,"ss":25,"used":true},{"PRN":9,"el":20,"az":262,"ss":32,"used":true},{"PRN":10,"el":16,"az":194,"ss":27,"used":true},{"PRN":15,"el":74,"az":263,"ss":46,"used":true},{"PRN":17,"el":14,"az":127,"ss":19,"used":false},{"PRN":18,"el":22,"az":315,"ss":27,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":19,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":264,"ss":26,"used":true},{"PRN":28,"el":58,"az":81,"ss":30,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":1.10,"gdop":1.65,"pdop":1.70,"satellites":[{"PRN":8,"el":30,"az":75,"ss":25,"used":true},{"PRN":9,"el":20,"az":262,"ss":32,"used":true},{"PRN":10,"el":16,"az":194,"ss":27,"used":true},{"PRN":15,"el":74,"az":263,"ss":46,"used":true},{"PRN":17,"el":14,"az":127,"ss":19,"used":false},{"PRN":18,"el":22,"az":315,"ss":27,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":19,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":264,"ss":26,"used":true},{"PRN":28,"el":58,"az":81,"ss":30,"used":true}]}
$GPGLL,5405.6081,N,01049.4791,E,104706.000,A,A*51
{"class":"TPV","tag":"GLL","time":1248432426.000,"ept":0.005,"lat":54.093468333,"lon":10.824651667,"alt":40.800,"epx":8.042,"epy":9.278,"epv":29.900,"track":18.0200,"speed":0.123,"climb":0.000,"mode":3}
$GPRMC,104707.000,A,5405.6083,N,01049.4822,E,0.50,19.27,240709,,,A*52
@@ -25,7 +25,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,1.0,1.3*3C
$GPGSV,3,1,12,08,30,075,22,09,20,262,31,10,16,194,27,15,74,263,46*73
$GPGSV,3,2,12,17,14,127,17,18,22,315,27,19,05,014,26,21,00,284,*70
$GPGSV,3,3,12,22,00,337,17,26,03,304,,27,41,264,27,28,58,081,30*73
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.00,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":27,"used":true},{"PRN":15,"el":74,"az":263,"ss":46,"used":true},{"PRN":17,"el":14,"az":127,"ss":17,"used":false},{"PRN":18,"el":22,"az":315,"ss":27,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":17,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":264,"ss":27,"used":true},{"PRN":28,"el":58,"az":81,"ss":30,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":1.00,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":27,"used":true},{"PRN":15,"el":74,"az":263,"ss":46,"used":true},{"PRN":17,"el":14,"az":127,"ss":17,"used":false},{"PRN":18,"el":22,"az":315,"ss":27,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":17,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":264,"ss":27,"used":true},{"PRN":28,"el":58,"az":81,"ss":30,"used":true}]}
$GPGLL,5405.6083,N,01049.4822,E,104707.000,A,A*55
{"class":"TPV","tag":"GLL","time":1248432427.000,"ept":0.005,"lat":54.093471667,"lon":10.824703333,"alt":40.600,"epx":8.042,"epy":9.278,"epv":29.900,"track":19.2700,"speed":0.257,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104708.000,A,5405.6082,N,01049.4856,E,0.32,19.19,240709,,,A*56
@@ -35,7 +35,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,23,09,20,262,32,10,16,194,26,15,74,263,45*73
$GPGSV,3,2,12,17,14,127,15,18,22,315,26,19,05,014,26,21,00,284,*73
$GPGSV,3,3,12,22,00,337,15,26,03,304,,27,41,264,28,28,58,081,30*7E
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":32,"used":true},{"PRN":10,"el":16,"az":194,"ss":26,"used":true},{"PRN":15,"el":74,"az":263,"ss":45,"used":true},{"PRN":17,"el":14,"az":127,"ss":15,"used":false},{"PRN":18,"el":22,"az":315,"ss":26,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":15,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":264,"ss":28,"used":true},{"PRN":28,"el":58,"az":81,"ss":30,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":32,"used":true},{"PRN":10,"el":16,"az":194,"ss":26,"used":true},{"PRN":15,"el":74,"az":263,"ss":45,"used":true},{"PRN":17,"el":14,"az":127,"ss":15,"used":false},{"PRN":18,"el":22,"az":315,"ss":26,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":15,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":264,"ss":28,"used":true},{"PRN":28,"el":58,"az":81,"ss":30,"used":true}]}
$GPGLL,5405.6082,N,01049.4856,E,104708.000,A,A*58
{"class":"TPV","tag":"GLL","time":1248432428.000,"ept":0.005,"lat":54.093470000,"lon":10.824760000,"alt":40.000,"epx":8.042,"epy":9.278,"epv":29.900,"track":19.1900,"speed":0.165,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104709.000,A,5405.6083,N,01049.4868,E,0.37,21.29,240709,,,A*56
@@ -45,7 +45,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,24,09,20,262,31,10,16,194,25,15,74,263,44*75
$GPGSV,3,2,12,17,14,127,14,18,22,315,25,19,05,014,26,21,00,284,*71
$GPGSV,3,3,12,22,00,337,16,26,03,304,,27,41,264,26,28,58,081,29*7B
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":24,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":14,"used":false},{"PRN":18,"el":22,"az":315,"ss":25,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":16,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":264,"ss":26,"used":true},{"PRN":28,"el":58,"az":81,"ss":29,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":24,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":14,"used":false},{"PRN":18,"el":22,"az":315,"ss":25,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":16,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":264,"ss":26,"used":true},{"PRN":28,"el":58,"az":81,"ss":29,"used":true}]}
$GPGLL,5405.6083,N,01049.4868,E,104709.000,A,A*55
{"class":"TPV","tag":"GLL","time":1248432429.000,"ept":0.005,"lat":54.093471667,"lon":10.824780000,"alt":40.600,"epx":8.042,"epy":9.278,"epv":29.900,"track":21.2900,"speed":0.190,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104710.000,A,5405.6081,N,01049.4876,E,0.94,27.15,240709,,,A*53
@@ -55,7 +55,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,24,09,20,262,30,10,16,194,25,15,74,263,44*74
$GPGSV,3,2,12,17,14,127,14,18,22,315,24,19,05,014,26,21,00,284,*70
$GPGSV,3,3,12,22,00,337,16,26,03,304,,27,41,264,25,28,58,081,30*70
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":24,"used":true},{"PRN":9,"el":20,"az":262,"ss":30,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":14,"used":false},{"PRN":18,"el":22,"az":315,"ss":24,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":16,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":264,"ss":25,"used":true},{"PRN":28,"el":58,"az":81,"ss":30,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":24,"used":true},{"PRN":9,"el":20,"az":262,"ss":30,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":14,"used":false},{"PRN":18,"el":22,"az":315,"ss":24,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":16,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":264,"ss":25,"used":true},{"PRN":28,"el":58,"az":81,"ss":30,"used":true}]}
$GPGLL,5405.6081,N,01049.4876,E,104710.000,A,A*50
{"class":"TPV","tag":"GLL","time":1248432430.000,"ept":0.005,"lat":54.093468333,"lon":10.824793333,"alt":40.400,"epx":8.042,"epy":9.278,"epv":29.900,"track":27.1500,"speed":0.484,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104711.000,A,5405.6083,N,01049.4879,E,0.63,28.37,240709,,,A*58
@@ -65,7 +65,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,1.0,1.3*3C
$GPGSV,3,1,12,08,30,075,24,09,20,262,30,10,16,194,24,15,74,263,44*75
$GPGSV,3,2,12,17,14,127,,18,22,315,22,19,05,014,26,21,00,284,*73
$GPGSV,3,3,12,22,00,337,,26,03,304,,27,41,264,28,28,58,081,30*7A
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.00,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":24,"used":true},{"PRN":9,"el":20,"az":262,"ss":30,"used":true},{"PRN":10,"el":16,"az":194,"ss":24,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":264,"ss":28,"used":true},{"PRN":28,"el":58,"az":81,"ss":30,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":1.00,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":24,"used":true},{"PRN":9,"el":20,"az":262,"ss":30,"used":true},{"PRN":10,"el":16,"az":194,"ss":24,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":264,"ss":28,"used":true},{"PRN":28,"el":58,"az":81,"ss":30,"used":true}]}
$GPGLL,5405.6083,N,01049.4879,E,104711.000,A,A*5C
{"class":"TPV","tag":"GLL","time":1248432431.000,"ept":0.005,"lat":54.093471667,"lon":10.824798333,"alt":39.800,"epx":8.042,"epy":9.278,"epv":29.900,"track":28.3700,"speed":0.324,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104712.000,A,5405.6086,N,01049.4879,E,1.23,24.74,240709,,,A*50
@@ -75,7 +75,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,1.0,1.3*3C
$GPGSV,3,1,12,08,30,075,23,09,20,262,29,10,16,194,22,15,74,263,42*7A
$GPGSV,3,2,12,17,14,127,,18,22,315,18,19,05,014,26,21,00,284,*7A
$GPGSV,3,3,12,22,00,337,,26,03,304,,27,41,264,29,28,58,081,29*73
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.00,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":29,"used":true},{"PRN":10,"el":16,"az":194,"ss":22,"used":true},{"PRN":15,"el":74,"az":263,"ss":42,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":18,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":264,"ss":29,"used":true},{"PRN":28,"el":58,"az":81,"ss":29,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":1.00,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":29,"used":true},{"PRN":10,"el":16,"az":194,"ss":22,"used":true},{"PRN":15,"el":74,"az":263,"ss":42,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":18,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":264,"ss":29,"used":true},{"PRN":28,"el":58,"az":81,"ss":29,"used":true}]}
$GPGLL,5405.6086,N,01049.4879,E,104712.000,A,A*5A
{"class":"TPV","tag":"GLL","time":1248432432.000,"ept":0.005,"lat":54.093476667,"lon":10.824798333,"alt":39.200,"epx":8.042,"epy":9.278,"epv":29.900,"track":24.7400,"speed":0.633,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104713.000,A,5405.6087,N,01049.4885,E,0.19,24.74,240709,,,A*5B
@@ -85,7 +85,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,1.0,1.3*3C
$GPGSV,3,1,12,08,30,075,25,09,20,262,29,10,16,194,23,15,74,263,43*7C
$GPGSV,3,2,12,17,14,127,,18,22,315,19,19,05,014,27,21,00,284,*7A
$GPGSV,3,3,12,22,00,337,,26,03,304,,27,41,264,31,28,58,081,29*7A
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.00,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":25,"used":true},{"PRN":9,"el":20,"az":262,"ss":29,"used":true},{"PRN":10,"el":16,"az":194,"ss":23,"used":true},{"PRN":15,"el":74,"az":263,"ss":43,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":19,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":264,"ss":31,"used":true},{"PRN":28,"el":58,"az":81,"ss":29,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":1.00,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":25,"used":true},{"PRN":9,"el":20,"az":262,"ss":29,"used":true},{"PRN":10,"el":16,"az":194,"ss":23,"used":true},{"PRN":15,"el":74,"az":263,"ss":43,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":19,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":264,"ss":31,"used":true},{"PRN":28,"el":58,"az":81,"ss":29,"used":true}]}
$GPGLL,5405.6087,N,01049.4885,E,104713.000,A,A*59
{"class":"TPV","tag":"GLL","time":1248432433.000,"ept":0.005,"lat":54.093478333,"lon":10.824808333,"alt":39.000,"epx":8.042,"epy":9.278,"epv":29.900,"track":24.7400,"speed":0.098,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104714.000,A,5405.6087,N,01049.4885,E,0.25,14.12,240709,,,A*50
@@ -95,7 +95,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,1.0,1.3*3C
$GPGSV,3,1,12,08,30,075,25,09,20,262,31,10,16,194,23,15,74,263,44*72
$GPGSV,3,2,12,17,14,127,,18,22,315,20,19,05,014,27,21,00,284,*70
$GPGSV,3,3,12,22,00,337,,26,03,304,19,27,41,264,31,28,58,081,29*72
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.00,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":25,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":23,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":20,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":19,"used":false},{"PRN":27,"el":41,"az":264,"ss":31,"used":true},{"PRN":28,"el":58,"az":81,"ss":29,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":1.00,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":25,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":23,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":20,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":19,"used":false},{"PRN":27,"el":41,"az":264,"ss":31,"used":true},{"PRN":28,"el":58,"az":81,"ss":29,"used":true}]}
$GPGLL,5405.6087,N,01049.4885,E,104714.000,A,A*5E
{"class":"TPV","tag":"GLL","time":1248432434.000,"ept":0.005,"lat":54.093478333,"lon":10.824808333,"alt":38.800,"epx":8.042,"epy":9.278,"epv":29.900,"track":14.1200,"speed":0.129,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104715.000,A,5405.6087,N,01049.4890,E,1.07,20.69,240709,,,A*5F
@@ -105,7 +105,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,1.0,1.3*3C
$GPGSV,3,1,12,08,30,075,23,09,20,262,31,10,16,194,24,15,74,263,44*73
$GPGSV,3,2,12,17,14,127,,18,22,315,21,19,05,014,28,21,00,284,*7E
$GPGSV,3,3,12,22,00,337,,26,03,304,19,27,41,264,30,28,58,081,29*73
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.00,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":24,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":28,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":19,"used":false},{"PRN":27,"el":41,"az":264,"ss":30,"used":true},{"PRN":28,"el":58,"az":81,"ss":29,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":1.00,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":24,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":28,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":19,"used":false},{"PRN":27,"el":41,"az":264,"ss":30,"used":true},{"PRN":28,"el":58,"az":81,"ss":29,"used":true}]}
$GPGLL,5405.6087,N,01049.4890,E,104715.000,A,A*5B
{"class":"TPV","tag":"GLL","time":1248432435.000,"ept":0.005,"lat":54.093478333,"lon":10.824816667,"alt":38.300,"epx":8.042,"epy":9.278,"epv":29.900,"track":20.6900,"speed":0.550,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104716.000,A,5405.6088,N,01049.4891,E,0.41,23.09,240709,,,A*54
@@ -115,7 +115,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,1.0,1.3*3C
$GPGSV,3,1,12,08,30,075,22,09,20,262,30,10,16,194,23,15,74,263,44*74
$GPGSV,3,2,12,17,14,127,,18,22,315,21,19,05,014,27,21,00,284,*71
$GPGSV,3,3,12,22,00,337,,26,03,304,18,27,41,264,30,28,58,081,29*72
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.00,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":30,"used":true},{"PRN":10,"el":16,"az":194,"ss":23,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":18,"used":false},{"PRN":27,"el":41,"az":264,"ss":30,"used":true},{"PRN":28,"el":58,"az":81,"ss":29,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":1.00,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":30,"used":true},{"PRN":10,"el":16,"az":194,"ss":23,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":18,"used":false},{"PRN":27,"el":41,"az":264,"ss":30,"used":true},{"PRN":28,"el":58,"az":81,"ss":29,"used":true}]}
$GPGLL,5405.6088,N,01049.4891,E,104716.000,A,A*56
{"class":"TPV","tag":"GLL","time":1248432436.000,"ept":0.005,"lat":54.093480000,"lon":10.824818333,"alt":38.000,"epx":8.042,"epy":9.278,"epv":29.900,"track":23.0900,"speed":0.211,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104717.000,A,5405.6087,N,01049.4896,E,0.53,27.07,240709,,,A*54
@@ -125,7 +125,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,1.0,1.3*3C
$GPGSV,3,1,12,08,30,075,22,09,20,262,31,10,16,194,24,15,74,263,44*72
$GPGSV,3,2,12,17,14,127,,18,22,315,20,19,05,014,27,21,00,284,*70
$GPGSV,3,3,12,22,00,337,,26,03,304,18,27,41,264,30,28,58,081,28*73
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":1.00,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":24,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":20,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":18,"used":false},{"PRN":27,"el":41,"az":264,"ss":30,"used":true},{"PRN":28,"el":58,"az":81,"ss":28,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":1.00,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":24,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":20,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":18,"used":false},{"PRN":27,"el":41,"az":264,"ss":30,"used":true},{"PRN":28,"el":58,"az":81,"ss":28,"used":true}]}
$GPGLL,5405.6087,N,01049.4896,E,104717.000,A,A*5F
{"class":"TPV","tag":"GLL","time":1248432437.000,"ept":0.005,"lat":54.093478333,"lon":10.824826667,"alt":37.600,"epx":8.042,"epy":9.278,"epv":29.900,"track":27.0700,"speed":0.273,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104718.000,A,5405.6084,N,01049.4902,E,0.55,32.66,240709,,,A*51
@@ -135,7 +135,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,21,09,20,262,31,10,16,194,25,15,74,263,44*70
$GPGSV,3,2,12,17,14,127,,18,22,315,20,19,05,014,27,21,00,284,*70
$GPGSV,3,3,12,22,00,337,,26,03,304,16,27,41,264,29,28,58,081,27*7A
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":21,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":20,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":16,"used":false},{"PRN":27,"el":41,"az":264,"ss":29,"used":true},{"PRN":28,"el":58,"az":81,"ss":27,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":21,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":20,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":16,"used":false},{"PRN":27,"el":41,"az":264,"ss":29,"used":true},{"PRN":28,"el":58,"az":81,"ss":27,"used":true}]}
$GPGLL,5405.6084,N,01049.4902,E,104718.000,A,A*5F
{"class":"TPV","tag":"GLL","time":1248432438.000,"ept":0.005,"lat":54.093473333,"lon":10.824836667,"alt":37.100,"epx":8.042,"epy":9.278,"epv":29.900,"track":32.6600,"speed":0.283,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104719.000,A,5405.6085,N,01049.4903,E,1.08,28.79,240709,,,A*5C
@@ -145,7 +145,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,22,09,20,262,31,10,16,194,25,15,74,263,44*73
$GPGSV,3,2,12,17,14,127,,18,22,315,19,19,05,014,26,21,00,284,*7B
$GPGSV,3,3,12,22,00,337,,26,03,304,14,27,41,264,29,28,58,081,26*79
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":19,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":14,"used":false},{"PRN":27,"el":41,"az":264,"ss":29,"used":true},{"PRN":28,"el":58,"az":81,"ss":26,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":19,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":14,"used":false},{"PRN":27,"el":41,"az":264,"ss":29,"used":true},{"PRN":28,"el":58,"az":81,"ss":26,"used":true}]}
$GPGLL,5405.6085,N,01049.4903,E,104719.000,A,A*5E
{"class":"TPV","tag":"GLL","time":1248432439.000,"ept":0.005,"lat":54.093475000,"lon":10.824838333,"alt":36.800,"epx":8.042,"epy":9.278,"epv":29.900,"track":28.7900,"speed":0.556,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104720.000,A,5405.6083,N,01049.4905,E,0.31,19.40,240709,,,A*55
@@ -155,7 +155,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,22,09,20,262,31,10,16,194,25,15,74,263,44*73
$GPGSV,3,2,12,17,14,127,,18,22,315,21,19,05,014,26,21,00,284,*70
$GPGSV,3,3,12,22,00,337,,26,03,304,12,27,41,264,28,28,58,081,27*7F
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":12,"used":false},{"PRN":27,"el":41,"az":264,"ss":28,"used":true},{"PRN":28,"el":58,"az":81,"ss":27,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":12,"used":false},{"PRN":27,"el":41,"az":264,"ss":28,"used":true},{"PRN":28,"el":58,"az":81,"ss":27,"used":true}]}
$GPGLL,5405.6083,N,01049.4905,E,104720.000,A,A*54
{"class":"TPV","tag":"GLL","time":1248432440.000,"ept":0.005,"lat":54.093471667,"lon":10.824841667,"alt":36.500,"epx":8.042,"epy":9.278,"epv":29.900,"track":19.4000,"speed":0.159,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104721.000,A,5405.6081,N,01049.4905,E,0.82,9.27,240709,,,A*6E
@@ -165,7 +165,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,23,09,20,262,33,10,16,194,25,15,74,263,46*72
$GPGSV,3,2,12,17,14,127,,18,22,315,21,19,05,014,26,21,00,284,*70
$GPGSV,3,3,12,22,00,337,,26,03,304,12,27,41,264,28,28,58,081,27*7F
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":33,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":46,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":12,"used":false},{"PRN":27,"el":41,"az":264,"ss":28,"used":true},{"PRN":28,"el":58,"az":81,"ss":27,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":33,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":46,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":12,"used":false},{"PRN":27,"el":41,"az":264,"ss":28,"used":true},{"PRN":28,"el":58,"az":81,"ss":27,"used":true}]}
$GPGLL,5405.6081,N,01049.4905,E,104721.000,A,A*57
{"class":"TPV","tag":"GLL","time":1248432441.000,"ept":0.005,"lat":54.093468333,"lon":10.824841667,"alt":36.400,"epx":8.042,"epy":9.278,"epv":29.900,"track":9.2700,"speed":0.422,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104722.000,A,5405.6080,N,01049.4910,E,1.06,14.12,240709,,,A*5F
@@ -175,7 +175,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,21,09,20,262,33,10,16,194,24,15,74,263,45*72
$GPGSV,3,2,12,17,14,127,,18,22,315,22,19,05,014,26,21,00,284,*73
$GPGSV,3,3,12,22,00,337,,26,03,304,11,27,41,264,28,28,58,081,26*7D
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":21,"used":true},{"PRN":9,"el":20,"az":262,"ss":33,"used":true},{"PRN":10,"el":16,"az":194,"ss":24,"used":true},{"PRN":15,"el":74,"az":263,"ss":45,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":11,"used":false},{"PRN":27,"el":41,"az":264,"ss":28,"used":true},{"PRN":28,"el":58,"az":81,"ss":26,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":21,"used":true},{"PRN":9,"el":20,"az":262,"ss":33,"used":true},{"PRN":10,"el":16,"az":194,"ss":24,"used":true},{"PRN":15,"el":74,"az":263,"ss":45,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":11,"used":false},{"PRN":27,"el":41,"az":264,"ss":28,"used":true},{"PRN":28,"el":58,"az":81,"ss":26,"used":true}]}
$GPGLL,5405.6080,N,01049.4910,E,104722.000,A,A*51
{"class":"TPV","tag":"GLL","time":1248432442.000,"ept":0.005,"lat":54.093466667,"lon":10.824850000,"alt":36.400,"epx":8.042,"epy":9.278,"epv":29.900,"track":14.1200,"speed":0.545,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104723.000,A,5405.6079,N,01049.4913,E,0.23,18.77,240709,,,A*52
@@ -185,7 +185,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,22,09,20,262,32,10,16,194,25,15,74,263,43*77
$GPGSV,3,2,12,17,14,127,,18,22,315,23,19,05,014,26,21,00,284,*72
$GPGSV,3,3,12,22,00,337,,26,03,304,09,27,41,264,28,28,58,081,26*74
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":32,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":43,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":23,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":9,"used":false},{"PRN":27,"el":41,"az":264,"ss":28,"used":true},{"PRN":28,"el":58,"az":81,"ss":26,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":32,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":43,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":23,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":9,"used":false},{"PRN":27,"el":41,"az":264,"ss":28,"used":true},{"PRN":28,"el":58,"az":81,"ss":26,"used":true}]}
$GPGLL,5405.6079,N,01049.4913,E,104723.000,A,A*55
{"class":"TPV","tag":"GLL","time":1248432443.000,"ept":0.005,"lat":54.093465000,"lon":10.824855000,"alt":36.200,"epx":8.042,"epy":9.278,"epv":29.900,"track":18.7700,"speed":0.118,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104724.000,A,5405.6076,N,01049.4916,E,0.43,25.48,240709,,,A*5B
@@ -195,7 +195,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,23,09,20,262,32,10,16,194,26,15,74,263,44*72
$GPGSV,3,2,12,17,14,127,,18,22,315,24,19,05,014,26,21,00,284,*75
$GPGSV,3,3,12,22,00,337,,26,03,304,11,27,41,264,27,28,58,081,26*72
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":32,"used":true},{"PRN":10,"el":16,"az":194,"ss":26,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":24,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":11,"used":false},{"PRN":27,"el":41,"az":264,"ss":27,"used":true},{"PRN":28,"el":58,"az":81,"ss":26,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":32,"used":true},{"PRN":10,"el":16,"az":194,"ss":26,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":24,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":11,"used":false},{"PRN":27,"el":41,"az":264,"ss":27,"used":true},{"PRN":28,"el":58,"az":81,"ss":26,"used":true}]}
$GPGLL,5405.6076,N,01049.4916,E,104724.000,A,A*58
{"class":"TPV","tag":"GLL","time":1248432444.000,"ept":0.005,"lat":54.093460000,"lon":10.824860000,"alt":35.900,"epx":8.042,"epy":9.278,"epv":29.900,"track":25.4800,"speed":0.221,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104725.000,A,5405.6076,N,01049.4917,E,0.31,24.01,240709,,,A*52
@@ -205,7 +205,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,24,09,20,262,31,10,16,194,25,15,74,263,44*75
$GPGSV,3,2,12,17,14,127,,18,22,315,22,19,05,014,27,21,00,284,*72
$GPGSV,3,3,12,22,00,337,,26,03,304,09,27,41,264,25,28,58,081,25*7A
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":24,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":9,"used":false},{"PRN":27,"el":41,"az":264,"ss":25,"used":true},{"PRN":28,"el":58,"az":81,"ss":25,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":24,"used":true},{"PRN":9,"el":20,"az":262,"ss":31,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":9,"used":false},{"PRN":27,"el":41,"az":264,"ss":25,"used":true},{"PRN":28,"el":58,"az":81,"ss":25,"used":true}]}
$GPGLL,5405.6076,N,01049.4917,E,104725.000,A,A*58
{"class":"TPV","tag":"GLL","time":1248432445.000,"ept":0.005,"lat":54.093460000,"lon":10.824861667,"alt":35.600,"epx":8.042,"epy":9.278,"epv":29.900,"track":24.0100,"speed":0.159,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104726.000,A,5405.6076,N,01049.4918,E,0.42,31.83,240709,,,A*54
@@ -215,7 +215,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,22,09,20,262,32,10,16,194,24,15,74,263,44*71
$GPGSV,3,2,12,17,14,127,,18,22,315,21,19,05,014,27,21,00,284,*71
$GPGSV,3,3,12,22,00,337,,26,03,304,08,27,41,264,23,28,58,081,24*7C
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":32,"used":true},{"PRN":10,"el":16,"az":194,"ss":24,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":8,"used":false},{"PRN":27,"el":41,"az":264,"ss":23,"used":true},{"PRN":28,"el":58,"az":81,"ss":24,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":32,"used":true},{"PRN":10,"el":16,"az":194,"ss":24,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":8,"used":false},{"PRN":27,"el":41,"az":264,"ss":23,"used":true},{"PRN":28,"el":58,"az":81,"ss":24,"used":true}]}
$GPGLL,5405.6076,N,01049.4918,E,104726.000,A,A*54
{"class":"TPV","tag":"GLL","time":1248432446.000,"ept":0.005,"lat":54.093460000,"lon":10.824863333,"alt":35.300,"epx":8.042,"epy":9.278,"epv":29.900,"track":31.8300,"speed":0.216,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104727.000,A,5405.6077,N,01049.4916,E,0.80,28.30,240709,,,A*54
@@ -225,7 +225,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,21,09,20,262,32,10,16,194,24,15,74,263,44*72
$GPGSV,3,2,12,17,14,127,,18,22,315,21,19,05,014,26,21,00,284,*70
$GPGSV,3,3,12,22,00,337,,26,03,304,08,27,41,264,24,28,58,081,24*7B
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":21,"used":true},{"PRN":9,"el":20,"az":262,"ss":32,"used":true},{"PRN":10,"el":16,"az":194,"ss":24,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":8,"used":false},{"PRN":27,"el":41,"az":264,"ss":24,"used":true},{"PRN":28,"el":58,"az":81,"ss":24,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":21,"used":true},{"PRN":9,"el":20,"az":262,"ss":32,"used":true},{"PRN":10,"el":16,"az":194,"ss":24,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":26,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":8,"used":false},{"PRN":27,"el":41,"az":264,"ss":24,"used":true},{"PRN":28,"el":58,"az":81,"ss":24,"used":true}]}
$GPGLL,5405.6077,N,01049.4916,E,104727.000,A,A*5A
{"class":"TPV","tag":"GLL","time":1248432447.000,"ept":0.005,"lat":54.093461667,"lon":10.824860000,"alt":35.100,"epx":8.042,"epy":9.278,"epv":29.900,"track":28.3000,"speed":0.412,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104728.000,A,5405.6078,N,01049.4918,E,0.56,28.66,240709,,,A*52
@@ -235,7 +235,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,22,09,20,262,32,10,16,194,25,15,74,263,44*70
$GPGSV,3,2,12,17,14,127,,18,22,315,21,19,05,014,27,21,00,284,*71
$GPGSV,3,3,12,22,00,337,,26,03,304,09,27,41,265,24,28,58,081,22*7D
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":32,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":9,"used":false},{"PRN":27,"el":41,"az":265,"ss":24,"used":true},{"PRN":28,"el":58,"az":81,"ss":22,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":32,"used":true},{"PRN":10,"el":16,"az":194,"ss":25,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":9,"used":false},{"PRN":27,"el":41,"az":265,"ss":24,"used":true},{"PRN":28,"el":58,"az":81,"ss":22,"used":true}]}
$GPGLL,5405.6078,N,01049.4918,E,104728.000,A,A*54
{"class":"TPV","tag":"GLL","time":1248432448.000,"ept":0.005,"lat":54.093463333,"lon":10.824863333,"alt":34.900,"epx":8.042,"epy":9.278,"epv":29.900,"track":28.6600,"speed":0.288,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104729.000,A,5405.6076,N,01049.4921,E,0.51,34.94,240709,,,A*50
@@ -245,7 +245,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,22,09,20,262,32,10,16,194,24,15,74,263,44*71
$GPGSV,3,2,12,17,14,127,,18,22,315,22,19,05,014,27,21,00,284,*72
$GPGSV,3,3,12,22,00,337,,26,03,304,08,27,41,265,25,28,58,081,22*7D
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":32,"used":true},{"PRN":10,"el":16,"az":194,"ss":24,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":8,"used":false},{"PRN":27,"el":41,"az":265,"ss":25,"used":true},{"PRN":28,"el":58,"az":81,"ss":22,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":32,"used":true},{"PRN":10,"el":16,"az":194,"ss":24,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":0,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":8,"used":false},{"PRN":27,"el":41,"az":265,"ss":25,"used":true},{"PRN":28,"el":58,"az":81,"ss":22,"used":true}]}
$GPGLL,5405.6076,N,01049.4921,E,104729.000,A,A*51
{"class":"TPV","tag":"GLL","time":1248432449.000,"ept":0.005,"lat":54.093460000,"lon":10.824868333,"alt":34.700,"epx":8.042,"epy":9.278,"epv":29.900,"track":34.9400,"speed":0.262,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104730.000,A,5405.6073,N,01049.4922,E,1.07,44.97,240709,,,A*58
@@ -255,7 +255,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,23,09,20,262,33,10,16,194,23,15,74,263,44*76
$GPGSV,3,2,12,17,14,127,18,18,22,315,22,19,05,014,27,21,00,284,*7B
$GPGSV,3,3,12,22,00,337,,26,03,304,08,27,41,265,25,28,58,081,21*7E
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":33,"used":true},{"PRN":10,"el":16,"az":194,"ss":23,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":18,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":8,"used":false},{"PRN":27,"el":41,"az":265,"ss":25,"used":true},{"PRN":28,"el":58,"az":81,"ss":21,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":33,"used":true},{"PRN":10,"el":16,"az":194,"ss":23,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":18,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":8,"used":false},{"PRN":27,"el":41,"az":265,"ss":25,"used":true},{"PRN":28,"el":58,"az":81,"ss":21,"used":true}]}
$GPGLL,5405.6073,N,01049.4922,E,104730.000,A,A*5F
{"class":"TPV","tag":"GLL","time":1248432450.000,"ept":0.005,"lat":54.093455000,"lon":10.824870000,"alt":34.500,"epx":8.042,"epy":9.278,"epv":29.900,"track":44.9700,"speed":0.550,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104731.000,A,5405.6070,N,01049.4926,E,0.67,50.17,240709,,,A*54
@@ -265,7 +265,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,21,09,20,262,33,10,16,194,23,15,74,263,44*74
$GPGSV,3,2,12,17,14,127,17,18,22,315,22,19,05,014,27,21,00,284,*74
$GPGSV,3,3,12,22,00,337,,26,03,304,08,27,41,265,26,28,58,081,22*7E
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":21,"used":true},{"PRN":9,"el":20,"az":262,"ss":33,"used":true},{"PRN":10,"el":16,"az":194,"ss":23,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":17,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":8,"used":false},{"PRN":27,"el":41,"az":265,"ss":26,"used":true},{"PRN":28,"el":58,"az":81,"ss":22,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":21,"used":true},{"PRN":9,"el":20,"az":262,"ss":33,"used":true},{"PRN":10,"el":16,"az":194,"ss":23,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":17,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":8,"used":false},{"PRN":27,"el":41,"az":265,"ss":26,"used":true},{"PRN":28,"el":58,"az":81,"ss":22,"used":true}]}
$GPGLL,5405.6070,N,01049.4926,E,104731.000,A,A*59
{"class":"TPV","tag":"GLL","time":1248432451.000,"ept":0.005,"lat":54.093450000,"lon":10.824876667,"alt":34.400,"epx":8.042,"epy":9.278,"epv":29.900,"track":50.1700,"speed":0.345,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104732.000,A,5405.6071,N,01049.4925,E,0.71,43.34,240709,,,A*51
@@ -275,7 +275,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,21,09,20,262,34,10,16,194,23,15,74,263,44*73
$GPGSV,3,2,12,17,14,127,15,18,22,315,21,19,05,014,27,21,00,284,*75
$GPGSV,3,3,12,22,00,337,,26,03,304,,27,41,265,25,28,58,081,23*74
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":21,"used":true},{"PRN":9,"el":20,"az":262,"ss":34,"used":true},{"PRN":10,"el":16,"az":194,"ss":23,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":15,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":265,"ss":25,"used":true},{"PRN":28,"el":58,"az":81,"ss":23,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":21,"used":true},{"PRN":9,"el":20,"az":262,"ss":34,"used":true},{"PRN":10,"el":16,"az":194,"ss":23,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":15,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":265,"ss":25,"used":true},{"PRN":28,"el":58,"az":81,"ss":23,"used":true}]}
$GPGLL,5405.6071,N,01049.4925,E,104732.000,A,A*58
{"class":"TPV","tag":"GLL","time":1248432452.000,"ept":0.005,"lat":54.093451667,"lon":10.824875000,"alt":34.300,"epx":8.042,"epy":9.278,"epv":29.900,"track":43.3400,"speed":0.365,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104733.000,A,5405.6069,N,01049.4928,E,1.13,49.89,240709,,,A*5D
@@ -285,7 +285,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,22,09,20,262,33,10,16,194,22,15,74,263,44*76
$GPGSV,3,2,12,17,14,127,16,18,22,315,22,19,05,014,27,21,00,284,*75
$GPGSV,3,3,12,22,00,337,,26,03,304,,27,41,265,24,28,58,081,24*72
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":33,"used":true},{"PRN":10,"el":16,"az":194,"ss":22,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":16,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":265,"ss":24,"used":true},{"PRN":28,"el":58,"az":81,"ss":24,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":22,"used":true},{"PRN":9,"el":20,"az":262,"ss":33,"used":true},{"PRN":10,"el":16,"az":194,"ss":22,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":16,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":265,"ss":24,"used":true},{"PRN":28,"el":58,"az":81,"ss":24,"used":true}]}
$GPGLL,5405.6069,N,01049.4928,E,104733.000,A,A*5D
{"class":"TPV","tag":"GLL","time":1248432453.000,"ept":0.005,"lat":54.093448333,"lon":10.824880000,"alt":34.100,"epx":8.042,"epy":9.278,"epv":29.900,"track":49.8900,"speed":0.581,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104734.000,A,5405.6070,N,01049.4930,E,1.06,48.90,240709,,,A*56
@@ -295,7 +295,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,23,09,20,262,34,10,16,194,23,15,74,263,44*71
$GPGSV,3,2,12,17,14,127,17,18,22,315,22,19,05,014,27,21,00,284,*74
$GPGSV,3,3,12,22,00,337,,26,03,304,,27,41,265,24,28,58,081,24*72
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":34,"used":true},{"PRN":10,"el":16,"az":194,"ss":23,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":17,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":265,"ss":24,"used":true},{"PRN":28,"el":58,"az":81,"ss":24,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":34,"used":true},{"PRN":10,"el":16,"az":194,"ss":23,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":17,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":265,"ss":24,"used":true},{"PRN":28,"el":58,"az":81,"ss":24,"used":true}]}
$GPGLL,5405.6070,N,01049.4930,E,104734.000,A,A*5B
{"class":"TPV","tag":"GLL","time":1248432454.000,"ept":0.005,"lat":54.093450000,"lon":10.824883333,"alt":34.000,"epx":8.042,"epy":9.278,"epv":29.900,"track":48.9000,"speed":0.545,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104735.000,A,5405.6071,N,01049.4935,E,0.96,50.63,240709,,,A*5E
@@ -305,7 +305,7 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,23,09,20,262,33,10,16,194,23,15,74,263,44*76
$GPGSV,3,2,12,17,14,127,16,18,22,315,22,19,05,014,27,21,00,284,*75
$GPGSV,3,3,12,22,00,337,,26,03,304,,27,41,265,24,28,58,081,24*72
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":33,"used":true},{"PRN":10,"el":16,"az":194,"ss":23,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":16,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":265,"ss":24,"used":true},{"PRN":28,"el":58,"az":81,"ss":24,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":33,"used":true},{"PRN":10,"el":16,"az":194,"ss":23,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":16,"used":false},{"PRN":18,"el":22,"az":315,"ss":22,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":265,"ss":24,"used":true},{"PRN":28,"el":58,"az":81,"ss":24,"used":true}]}
$GPGLL,5405.6071,N,01049.4935,E,104735.000,A,A*5E
{"class":"TPV","tag":"GLL","time":1248432455.000,"ept":0.005,"lat":54.093451667,"lon":10.824891667,"alt":33.800,"epx":8.042,"epy":9.278,"epv":29.900,"track":50.6300,"speed":0.494,"climb":0.000,"eps":18.56,"mode":3}
$GPRMC,104736.000,A,5405.6072,N,01049.4936,E,0.52,50.27,240709,,,A*55
@@ -315,6 +315,6 @@ $GPGSA,A,3,28,18,27,19,08,09,10,15,,,,,1.6,0.9,1.3*34
$GPGSV,3,1,12,08,30,075,23,09,20,262,33,10,16,194,24,15,74,263,44*71
$GPGSV,3,2,12,17,14,127,16,18,22,315,21,19,05,014,27,21,00,284,*76
$GPGSV,3,3,12,22,00,337,,26,03,304,,27,41,265,24,28,58,081,24*72
-{"class":"SKY","tag":"GSV","vdop":1.30,"hdop":0.90,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":33,"used":true},{"PRN":10,"el":16,"az":194,"ss":24,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":16,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":265,"ss":24,"used":true},{"PRN":28,"el":58,"az":81,"ss":24,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.54,"ydop":0.62,"vdop":1.30,"tdop":0.59,"hdop":0.90,"gdop":1.65,"pdop":1.60,"satellites":[{"PRN":8,"el":30,"az":75,"ss":23,"used":true},{"PRN":9,"el":20,"az":262,"ss":33,"used":true},{"PRN":10,"el":16,"az":194,"ss":24,"used":true},{"PRN":15,"el":74,"az":263,"ss":44,"used":true},{"PRN":17,"el":14,"az":127,"ss":16,"used":false},{"PRN":18,"el":22,"az":315,"ss":21,"used":true},{"PRN":19,"el":5,"az":14,"ss":27,"used":true},{"PRN":21,"el":0,"az":284,"ss":0,"used":false},{"PRN":22,"el":0,"az":337,"ss":0,"used":false},{"PRN":26,"el":3,"az":304,"ss":0,"used":false},{"PRN":27,"el":41,"az":265,"ss":24,"used":true},{"PRN":28,"el":58,"az":81,"ss":24,"used":true}]}
$GPGLL,5405.6072,N,01049.4936,E,104736.000,A,A*5D
{"class":"TPV","tag":"GLL","time":1248432456.000,"ept":0.005,"lat":54.093453333,"lon":10.824893333,"alt":33.700,"epx":8.042,"epy":9.278,"epv":29.900,"track":50.2700,"speed":0.268,"climb":0.000,"eps":18.56,"mode":3}
diff --git a/test/daemon/nokia-ld-4w.log.chk b/test/daemon/nokia-ld-4w.log.chk
index 552fc7e8..979e1ac1 100644
--- a/test/daemon/nokia-ld-4w.log.chk
+++ b/test/daemon/nokia-ld-4w.log.chk
@@ -5,7 +5,7 @@ $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32
$GPGSV,3,1,11,29,65,214,25,30,52,154,23,31,45,272,32,02,41,068,*7A
$GPGSV,3,2,11,12,23,132,25,23,18,348,13,10,16,098,15,04,12,040,24*7E
$GPGSV,3,3,11,05,11,110,23,16,07,296,33,13,07,020,26*43
-{"class":"SKY","tag":"GSV","vdop":1.90,"hdop":1.20,"pdop":2.20,"satellites":[{"PRN":29,"el":65,"az":214,"ss":25,"used":true},{"PRN":30,"el":52,"az":154,"ss":23,"used":true},{"PRN":31,"el":45,"az":272,"ss":32,"used":true},{"PRN":2,"el":41,"az":68,"ss":0,"used":false},{"PRN":12,"el":23,"az":132,"ss":25,"used":true},{"PRN":23,"el":18,"az":348,"ss":13,"used":true},{"PRN":10,"el":16,"az":98,"ss":15,"used":false},{"PRN":4,"el":12,"az":40,"ss":24,"used":true},{"PRN":5,"el":11,"az":110,"ss":23,"used":false},{"PRN":16,"el":7,"az":296,"ss":33,"used":true},{"PRN":13,"el":7,"az":20,"ss":26,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.89,"ydop":0.96,"vdop":1.90,"tdop":1.44,"hdop":1.20,"gdop":2.99,"pdop":2.20,"satellites":[{"PRN":29,"el":65,"az":214,"ss":25,"used":true},{"PRN":30,"el":52,"az":154,"ss":23,"used":true},{"PRN":31,"el":45,"az":272,"ss":32,"used":true},{"PRN":2,"el":41,"az":68,"ss":0,"used":false},{"PRN":12,"el":23,"az":132,"ss":25,"used":true},{"PRN":23,"el":18,"az":348,"ss":13,"used":true},{"PRN":10,"el":16,"az":98,"ss":15,"used":false},{"PRN":4,"el":12,"az":40,"ss":24,"used":true},{"PRN":5,"el":11,"az":110,"ss":23,"used":false},{"PRN":16,"el":7,"az":296,"ss":33,"used":true},{"PRN":13,"el":7,"az":20,"ss":26,"used":false}]}
$GPRMC,080315.000,A,6503.0241,N,02528.3627,E,0.95,25.69,051209,,,A*50
{"class":"TPV","tag":"RMC","time":1260000195.000,"ept":0.005,"lat":65.050401667,"lon":25.472711667,"alt":9.900,"epx":13.383,"epy":14.464,"epv":43.700,"track":25.6900,"speed":0.489,"mode":3}
$GPGGA,080316.000,6503.0241,N,02528.3625,E,1,07,1.2,10.4,M,21.6,M,,0000*6C
@@ -29,7 +29,7 @@ $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32
$GPGSV,3,1,11,29,66,214,24,30,52,154,24,31,45,272,32,02,41,068,*7F
$GPGSV,3,2,11,12,23,132,26,23,18,348,16,10,16,098,,04,12,040,25*7D
$GPGSV,3,3,11,05,12,110,23,16,07,296,33,13,07,020,25*43
-{"class":"SKY","tag":"GSV","vdop":1.90,"hdop":1.20,"pdop":2.20,"satellites":[{"PRN":29,"el":66,"az":214,"ss":24,"used":true},{"PRN":30,"el":52,"az":154,"ss":24,"used":true},{"PRN":31,"el":45,"az":272,"ss":32,"used":true},{"PRN":2,"el":41,"az":68,"ss":0,"used":false},{"PRN":12,"el":23,"az":132,"ss":26,"used":true},{"PRN":23,"el":18,"az":348,"ss":16,"used":true},{"PRN":10,"el":16,"az":98,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":23,"used":false},{"PRN":16,"el":7,"az":296,"ss":33,"used":true},{"PRN":13,"el":7,"az":20,"ss":25,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.89,"ydop":0.97,"vdop":1.90,"tdop":1.43,"hdop":1.20,"gdop":2.97,"pdop":2.20,"satellites":[{"PRN":29,"el":66,"az":214,"ss":24,"used":true},{"PRN":30,"el":52,"az":154,"ss":24,"used":true},{"PRN":31,"el":45,"az":272,"ss":32,"used":true},{"PRN":2,"el":41,"az":68,"ss":0,"used":false},{"PRN":12,"el":23,"az":132,"ss":26,"used":true},{"PRN":23,"el":18,"az":348,"ss":16,"used":true},{"PRN":10,"el":16,"az":98,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":23,"used":false},{"PRN":16,"el":7,"az":296,"ss":33,"used":true},{"PRN":13,"el":7,"az":20,"ss":25,"used":false}]}
$GPRMC,080320.000,A,6503.0233,N,02528.3606,E,0.11,349.73,051209,,,A*6E
{"class":"TPV","tag":"RMC","time":1260000200.000,"ept":0.005,"lat":65.050388333,"lon":25.472676667,"alt":10.900,"epx":13.407,"epy":14.485,"epv":43.700,"track":349.7300,"speed":0.057,"climb":0.600,"mode":3}
$GPGGA,080321.000,6503.0229,N,02528.3601,E,1,07,1.2,10.2,M,21.6,M,,0000*66
@@ -53,7 +53,7 @@ $GPGSA,A,3,29,12,30,23,04,31,02,16,,,,,2.0,1.0,1.7*3E
$GPGSV,3,1,11,29,66,214,24,30,52,154,25,31,45,272,32,02,41,068,17*78
$GPGSV,3,2,11,12,23,132,26,23,18,348,18,10,16,098,,04,12,040,25*73
$GPGSV,3,3,11,05,12,110,23,16,07,296,32,13,07,020,25*42
-{"class":"SKY","tag":"GSV","vdop":1.70,"hdop":1.00,"pdop":2.00,"satellites":[{"PRN":29,"el":66,"az":214,"ss":24,"used":true},{"PRN":30,"el":52,"az":154,"ss":25,"used":true},{"PRN":31,"el":45,"az":272,"ss":32,"used":true},{"PRN":2,"el":41,"az":68,"ss":17,"used":true},{"PRN":12,"el":23,"az":132,"ss":26,"used":true},{"PRN":23,"el":18,"az":348,"ss":18,"used":true},{"PRN":10,"el":16,"az":98,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":23,"used":false},{"PRN":16,"el":7,"az":296,"ss":32,"used":true},{"PRN":13,"el":7,"az":20,"ss":25,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.87,"ydop":0.89,"vdop":1.70,"tdop":1.42,"hdop":1.00,"gdop":2.92,"pdop":2.00,"satellites":[{"PRN":29,"el":66,"az":214,"ss":24,"used":true},{"PRN":30,"el":52,"az":154,"ss":25,"used":true},{"PRN":31,"el":45,"az":272,"ss":32,"used":true},{"PRN":2,"el":41,"az":68,"ss":17,"used":true},{"PRN":12,"el":23,"az":132,"ss":26,"used":true},{"PRN":23,"el":18,"az":348,"ss":18,"used":true},{"PRN":10,"el":16,"az":98,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":23,"used":false},{"PRN":16,"el":7,"az":296,"ss":32,"used":true},{"PRN":13,"el":7,"az":20,"ss":25,"used":false}]}
$GPRMC,080325.000,A,6503.0216,N,02528.3580,E,0.12,86.47,051209,,,A*55
{"class":"TPV","tag":"RMC","time":1260000205.000,"ept":0.005,"lat":65.050360000,"lon":25.472633333,"alt":8.000,"epx":13.114,"epy":13.403,"epv":43.700,"track":86.4700,"speed":0.062,"climb":-0.100,"mode":3}
$GPGGA,080326.000,6503.0215,N,02528.3576,E,1,06,1.4,8.6,M,21.6,M,,0000*57
@@ -77,7 +77,7 @@ $GPGSA,A,3,29,12,30,23,04,31,02,16,,,,,2.0,1.0,1.7*3E
$GPGSV,3,1,11,29,66,214,23,30,52,154,26,31,45,272,32,02,41,068,17*7C
$GPGSV,3,2,11,12,23,132,25,23,18,348,20,10,16,098,,04,12,040,25*7B
$GPGSV,3,3,11,05,12,110,24,16,07,296,32,13,07,020,23*43
-{"class":"SKY","tag":"GSV","vdop":1.70,"hdop":1.00,"pdop":2.00,"satellites":[{"PRN":29,"el":66,"az":214,"ss":23,"used":true},{"PRN":30,"el":52,"az":154,"ss":26,"used":true},{"PRN":31,"el":45,"az":272,"ss":32,"used":true},{"PRN":2,"el":41,"az":68,"ss":17,"used":true},{"PRN":12,"el":23,"az":132,"ss":25,"used":true},{"PRN":23,"el":18,"az":348,"ss":20,"used":true},{"PRN":10,"el":16,"az":98,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":24,"used":false},{"PRN":16,"el":7,"az":296,"ss":32,"used":true},{"PRN":13,"el":7,"az":20,"ss":23,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.87,"ydop":0.89,"vdop":1.70,"tdop":1.42,"hdop":1.00,"gdop":2.92,"pdop":2.00,"satellites":[{"PRN":29,"el":66,"az":214,"ss":23,"used":true},{"PRN":30,"el":52,"az":154,"ss":26,"used":true},{"PRN":31,"el":45,"az":272,"ss":32,"used":true},{"PRN":2,"el":41,"az":68,"ss":17,"used":true},{"PRN":12,"el":23,"az":132,"ss":25,"used":true},{"PRN":23,"el":18,"az":348,"ss":20,"used":true},{"PRN":10,"el":16,"az":98,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":24,"used":false},{"PRN":16,"el":7,"az":296,"ss":32,"used":true},{"PRN":13,"el":7,"az":20,"ss":23,"used":false}]}
$GPRMC,080330.000,A,6503.0205,N,02528.3561,E,0.14,181.62,051209,,,A*6B
{"class":"TPV","tag":"RMC","time":1260000210.000,"ept":0.005,"lat":65.050341667,"lon":25.472601667,"alt":5.700,"epx":13.114,"epy":13.403,"epv":39.100,"track":181.6200,"speed":0.072,"climb":-1.100,"mode":3}
$GPGGA,080331.000,6503.0202,N,02528.3556,E,1,08,1.0,5.3,M,21.6,M,,0000*57
@@ -101,7 +101,7 @@ $GPGSA,A,3,29,12,30,23,04,31,16,,,,,,2.2,1.2,1.9*32
$GPGSV,3,1,11,29,66,214,22,30,52,154,27,31,45,272,32,02,41,068,*7A
$GPGSV,3,2,11,12,23,132,18,23,18,348,21,10,16,098,,04,12,040,25*74
$GPGSV,3,3,11,05,12,110,24,16,07,296,32,13,07,020,22*42
-{"class":"SKY","tag":"GSV","vdop":1.90,"hdop":1.20,"pdop":2.20,"satellites":[{"PRN":29,"el":66,"az":214,"ss":22,"used":true},{"PRN":30,"el":52,"az":154,"ss":27,"used":true},{"PRN":31,"el":45,"az":272,"ss":32,"used":true},{"PRN":2,"el":41,"az":68,"ss":0,"used":false},{"PRN":12,"el":23,"az":132,"ss":18,"used":true},{"PRN":23,"el":18,"az":348,"ss":21,"used":true},{"PRN":10,"el":16,"az":98,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":24,"used":false},{"PRN":16,"el":7,"az":296,"ss":32,"used":true},{"PRN":13,"el":7,"az":20,"ss":22,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.89,"ydop":0.97,"vdop":1.90,"tdop":1.43,"hdop":1.20,"gdop":2.97,"pdop":2.20,"satellites":[{"PRN":29,"el":66,"az":214,"ss":22,"used":true},{"PRN":30,"el":52,"az":154,"ss":27,"used":true},{"PRN":31,"el":45,"az":272,"ss":32,"used":true},{"PRN":2,"el":41,"az":68,"ss":0,"used":false},{"PRN":12,"el":23,"az":132,"ss":18,"used":true},{"PRN":23,"el":18,"az":348,"ss":21,"used":true},{"PRN":10,"el":16,"az":98,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":24,"used":false},{"PRN":16,"el":7,"az":296,"ss":32,"used":true},{"PRN":13,"el":7,"az":20,"ss":22,"used":false}]}
$GPRMC,080335.000,A,6503.0195,N,02528.3544,E,0.28,93.31,051209,,,A*58
{"class":"TPV","tag":"RMC","time":1260000215.000,"ept":0.005,"lat":65.050325000,"lon":25.472573333,"alt":3.300,"epx":13.407,"epy":14.485,"epv":43.700,"track":93.3100,"speed":0.144,"climb":0.300,"mode":3}
$GPGGA,080336.000,6503.0192,N,02528.3542,E,1,07,1.2,2.1,M,21.6,M,,0000*57
@@ -125,7 +125,7 @@ $GPGSA,A,3,29,30,23,04,31,16,,,,,,,3.3,1.7,2.8*36
$GPGSV,3,1,11,29,66,214,21,30,52,154,28,31,45,272,31,02,41,068,*75
$GPGSV,3,2,11,12,23,132,17,23,18,348,21,10,16,098,,04,12,040,25*7B
$GPGSV,3,3,11,05,12,110,23,16,07,296,31,13,07,020,22*46
-{"class":"SKY","tag":"GSV","vdop":2.80,"hdop":1.70,"pdop":3.30,"satellites":[{"PRN":29,"el":66,"az":214,"ss":21,"used":true},{"PRN":30,"el":52,"az":154,"ss":28,"used":true},{"PRN":31,"el":45,"az":272,"ss":31,"used":true},{"PRN":2,"el":41,"az":68,"ss":0,"used":false},{"PRN":12,"el":23,"az":132,"ss":17,"used":false},{"PRN":23,"el":18,"az":348,"ss":21,"used":true},{"PRN":10,"el":16,"az":98,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":23,"used":false},{"PRN":16,"el":7,"az":296,"ss":31,"used":true},{"PRN":13,"el":7,"az":20,"ss":22,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.93,"ydop":0.98,"vdop":2.80,"tdop":1.59,"hdop":1.70,"gdop":3.20,"pdop":3.30,"satellites":[{"PRN":29,"el":66,"az":214,"ss":21,"used":true},{"PRN":30,"el":52,"az":154,"ss":28,"used":true},{"PRN":31,"el":45,"az":272,"ss":31,"used":true},{"PRN":2,"el":41,"az":68,"ss":0,"used":false},{"PRN":12,"el":23,"az":132,"ss":17,"used":false},{"PRN":23,"el":18,"az":348,"ss":21,"used":true},{"PRN":10,"el":16,"az":98,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":23,"used":false},{"PRN":16,"el":7,"az":296,"ss":31,"used":true},{"PRN":13,"el":7,"az":20,"ss":22,"used":false}]}
$GPRMC,080340.000,A,6503.0196,N,02528.3527,E,0.17,253.19,051209,,,A*64
{"class":"TPV","tag":"RMC","time":1260000220.000,"ept":0.005,"lat":65.050326667,"lon":25.472545000,"alt":1.700,"epx":13.935,"epy":14.650,"epv":64.400,"track":253.1900,"speed":0.087,"climb":0.300,"mode":3}
$GPGGA,080341.000,6503.0192,N,02528.3525,E,1,07,1.2,0.1,M,21.6,M,,0000*54
@@ -149,7 +149,7 @@ $GPGSA,A,3,29,12,30,23,04,31,02,16,,,,,2.0,1.0,1.7*3E
$GPGSV,3,1,11,29,66,214,21,30,52,154,29,31,45,272,31,02,41,068,17*72
$GPGSV,3,2,11,12,23,132,19,23,18,348,12,10,16,098,,04,12,040,25*75
$GPGSV,3,3,11,05,12,110,22,16,07,296,31,13,07,020,21*44
-{"class":"SKY","tag":"GSV","vdop":1.70,"hdop":1.00,"pdop":2.00,"satellites":[{"PRN":29,"el":66,"az":214,"ss":21,"used":true},{"PRN":30,"el":52,"az":154,"ss":29,"used":true},{"PRN":31,"el":45,"az":272,"ss":31,"used":true},{"PRN":2,"el":41,"az":68,"ss":17,"used":true},{"PRN":12,"el":23,"az":132,"ss":19,"used":true},{"PRN":23,"el":18,"az":348,"ss":12,"used":true},{"PRN":10,"el":16,"az":98,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":22,"used":false},{"PRN":16,"el":7,"az":296,"ss":31,"used":true},{"PRN":13,"el":7,"az":20,"ss":21,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.87,"ydop":0.89,"vdop":1.70,"tdop":1.42,"hdop":1.00,"gdop":2.92,"pdop":2.00,"satellites":[{"PRN":29,"el":66,"az":214,"ss":21,"used":true},{"PRN":30,"el":52,"az":154,"ss":29,"used":true},{"PRN":31,"el":45,"az":272,"ss":31,"used":true},{"PRN":2,"el":41,"az":68,"ss":17,"used":true},{"PRN":12,"el":23,"az":132,"ss":19,"used":true},{"PRN":23,"el":18,"az":348,"ss":12,"used":true},{"PRN":10,"el":16,"az":98,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":22,"used":false},{"PRN":16,"el":7,"az":296,"ss":31,"used":true},{"PRN":13,"el":7,"az":20,"ss":21,"used":false}]}
$GPRMC,080345.000,A,6503.0200,N,02528.3521,E,0.02,174.00,051209,,,A*61
{"class":"TPV","tag":"RMC","time":1260000225.000,"ept":0.005,"lat":65.050333333,"lon":25.472535000,"alt":0.200,"epx":13.114,"epy":13.403,"epv":39.100,"track":174.0000,"speed":0.010,"climb":1.900,"mode":3}
$GPGGA,080346.000,6503.0204,N,02528.3519,E,1,08,1.0,1.5,M,21.6,M,,0000*58
@@ -173,7 +173,7 @@ $GPGSA,A,3,29,12,30,04,31,16,,,,,,,2.4,1.4,1.9*33
$GPGSV,3,1,12,29,66,213,20,30,52,154,29,31,45,271,30,02,41,068,16*74
$GPGSV,3,2,12,12,23,132,21,23,18,348,,10,16,097,,04,12,040,25*71
$GPGSV,3,3,12,05,12,110,22,16,07,296,31,13,07,020,20,21,00,196,*7B
-{"class":"SKY","tag":"GSV","vdop":1.90,"hdop":1.40,"pdop":2.40,"satellites":[{"PRN":29,"el":66,"az":213,"ss":20,"used":true},{"PRN":30,"el":52,"az":154,"ss":29,"used":true},{"PRN":31,"el":45,"az":271,"ss":30,"used":true},{"PRN":2,"el":41,"az":68,"ss":16,"used":false},{"PRN":12,"el":23,"az":132,"ss":21,"used":true},{"PRN":23,"el":18,"az":348,"ss":0,"used":false},{"PRN":10,"el":16,"az":97,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":22,"used":false},{"PRN":16,"el":7,"az":296,"ss":31,"used":true},{"PRN":13,"el":7,"az":20,"ss":20,"used":false},{"PRN":21,"el":0,"az":196,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.93,"ydop":0.97,"vdop":1.90,"tdop":1.59,"hdop":1.40,"gdop":3.20,"pdop":2.40,"satellites":[{"PRN":29,"el":66,"az":213,"ss":20,"used":true},{"PRN":30,"el":52,"az":154,"ss":29,"used":true},{"PRN":31,"el":45,"az":271,"ss":30,"used":true},{"PRN":2,"el":41,"az":68,"ss":16,"used":false},{"PRN":12,"el":23,"az":132,"ss":21,"used":true},{"PRN":23,"el":18,"az":348,"ss":0,"used":false},{"PRN":10,"el":16,"az":97,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":22,"used":false},{"PRN":16,"el":7,"az":296,"ss":31,"used":true},{"PRN":13,"el":7,"az":20,"ss":20,"used":false},{"PRN":21,"el":0,"az":196,"ss":0,"used":false}]}
$GPRMC,080350.000,A,6503.0211,N,02528.3517,E,0.15,309.98,051209,,,A*6F
{"class":"TPV","tag":"RMC","time":1260000230.000,"ept":0.005,"lat":65.050351667,"lon":25.472528333,"alt":3.400,"epx":13.890,"epy":14.620,"epv":43.700,"track":309.9800,"speed":0.077,"climb":-0.200,"mode":3}
$GPGGA,080351.000,6503.0211,N,02528.3515,E,1,07,1.2,3.8,M,21.6,M,,0000*54
@@ -197,7 +197,7 @@ $GPGSA,A,3,29,12,30,23,04,31,02,16,,,,,2.0,1.0,1.7*3E
$GPGSV,3,1,12,29,66,213,20,30,52,154,29,31,45,271,30,02,41,068,15*77
$GPGSV,3,2,12,12,23,132,22,23,18,348,18,10,16,097,,04,12,040,25*7B
$GPGSV,3,3,12,05,12,110,12,16,07,296,30,13,07,020,19,21,00,196,*73
-{"class":"SKY","tag":"GSV","vdop":1.70,"hdop":1.00,"pdop":2.00,"satellites":[{"PRN":29,"el":66,"az":213,"ss":20,"used":true},{"PRN":30,"el":52,"az":154,"ss":29,"used":true},{"PRN":31,"el":45,"az":271,"ss":30,"used":true},{"PRN":2,"el":41,"az":68,"ss":15,"used":true},{"PRN":12,"el":23,"az":132,"ss":22,"used":true},{"PRN":23,"el":18,"az":348,"ss":18,"used":true},{"PRN":10,"el":16,"az":97,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":12,"used":false},{"PRN":16,"el":7,"az":296,"ss":30,"used":true},{"PRN":13,"el":7,"az":20,"ss":19,"used":false},{"PRN":21,"el":0,"az":196,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.87,"ydop":0.90,"vdop":1.70,"tdop":1.42,"hdop":1.00,"gdop":2.92,"pdop":2.00,"satellites":[{"PRN":29,"el":66,"az":213,"ss":20,"used":true},{"PRN":30,"el":52,"az":154,"ss":29,"used":true},{"PRN":31,"el":45,"az":271,"ss":30,"used":true},{"PRN":2,"el":41,"az":68,"ss":15,"used":true},{"PRN":12,"el":23,"az":132,"ss":22,"used":true},{"PRN":23,"el":18,"az":348,"ss":18,"used":true},{"PRN":10,"el":16,"az":97,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":12,"used":false},{"PRN":16,"el":7,"az":296,"ss":30,"used":true},{"PRN":13,"el":7,"az":20,"ss":19,"used":false},{"PRN":21,"el":0,"az":196,"ss":0,"used":false}]}
$GPRMC,080355.000,A,6503.0204,N,02528.3517,E,0.14,17.41,051209,,,A*57
{"class":"TPV","tag":"RMC","time":1260000235.000,"ept":0.005,"lat":65.050340000,"lon":25.472528333,"alt":2.500,"epx":13.052,"epy":13.425,"epv":39.100,"track":17.4100,"speed":0.072,"climb":0.400,"mode":3}
$GPGGA,080356.000,6503.0205,N,02528.3514,E,1,08,1.0,3.5,M,21.6,M,,0000*57
@@ -221,7 +221,7 @@ $GPGSA,A,3,29,12,30,23,04,31,02,16,,,,,2.0,1.0,1.7*3E
$GPGSV,3,1,12,29,66,213,20,30,52,154,29,31,45,271,30,02,41,068,15*77
$GPGSV,3,2,12,12,23,132,23,23,18,348,18,10,16,097,,04,12,040,25*7A
$GPGSV,3,3,12,05,12,110,15,16,07,296,30,13,07,020,18,21,00,196,*75
-{"class":"SKY","tag":"GSV","vdop":1.70,"hdop":1.00,"pdop":2.00,"satellites":[{"PRN":29,"el":66,"az":213,"ss":20,"used":true},{"PRN":30,"el":52,"az":154,"ss":29,"used":true},{"PRN":31,"el":45,"az":271,"ss":30,"used":true},{"PRN":2,"el":41,"az":68,"ss":15,"used":true},{"PRN":12,"el":23,"az":132,"ss":23,"used":true},{"PRN":23,"el":18,"az":348,"ss":18,"used":true},{"PRN":10,"el":16,"az":97,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":15,"used":false},{"PRN":16,"el":7,"az":296,"ss":30,"used":true},{"PRN":13,"el":7,"az":20,"ss":18,"used":false},{"PRN":21,"el":0,"az":196,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.87,"ydop":0.90,"vdop":1.70,"tdop":1.42,"hdop":1.00,"gdop":2.92,"pdop":2.00,"satellites":[{"PRN":29,"el":66,"az":213,"ss":20,"used":true},{"PRN":30,"el":52,"az":154,"ss":29,"used":true},{"PRN":31,"el":45,"az":271,"ss":30,"used":true},{"PRN":2,"el":41,"az":68,"ss":15,"used":true},{"PRN":12,"el":23,"az":132,"ss":23,"used":true},{"PRN":23,"el":18,"az":348,"ss":18,"used":true},{"PRN":10,"el":16,"az":97,"ss":0,"used":false},{"PRN":4,"el":12,"az":40,"ss":25,"used":true},{"PRN":5,"el":12,"az":110,"ss":15,"used":false},{"PRN":16,"el":7,"az":296,"ss":30,"used":true},{"PRN":13,"el":7,"az":20,"ss":18,"used":false},{"PRN":21,"el":0,"az":196,"ss":0,"used":false}]}
$GPRMC,080400.000,A,6503.0198,N,02528.3504,E,0.40,159.57,051209,,,A*69
{"class":"TPV","tag":"RMC","time":1260000240.000,"ept":0.005,"lat":65.050330000,"lon":25.472506667,"alt":1.500,"epx":13.052,"epy":13.425,"epv":39.100,"track":159.5700,"speed":0.206,"climb":-0.800,"mode":3}
$GPGGA,080401.000,6503.0194,N,02528.3504,E,1,08,1.0,-0.2,M,21.6,M,,0000*71
diff --git a/test/daemon/pharos-360.log.chk b/test/daemon/pharos-360.log.chk
index 9c8e3179..990e9da6 100644
--- a/test/daemon/pharos-360.log.chk
+++ b/test/daemon/pharos-360.log.chk
@@ -13,7 +13,7 @@ $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39
$GPGSV,3,1,9,8,49,156,27,17,49,212,0,28,82,35,36,11,38,84,37*4A
$GPGSV,3,2,9,26,32,278,39,29,31,270,38,19,6,48,0,27,22,152,26*71
$GPGSV,3,3,9,123,0,0,0*40
-{"class":"SKY","tag":"GSV","vdop":3.10,"hdop":12.50,"pdop":12.90,"satellites":[{"PRN":8,"el":49,"az":156,"ss":27,"used":false},{"PRN":17,"el":49,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":35,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":37,"used":true},{"PRN":26,"el":32,"az":278,"ss":39,"used":true},{"PRN":29,"el":31,"az":270,"ss":38,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":26,"used":false},{"PRN":123,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":2.18,"ydop":2.31,"vdop":3.10,"tdop":5.16,"hdop":12.50,"gdop":8.30,"pdop":12.90,"satellites":[{"PRN":8,"el":49,"az":156,"ss":27,"used":false},{"PRN":17,"el":49,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":35,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":37,"used":true},{"PRN":26,"el":32,"az":278,"ss":39,"used":true},{"PRN":29,"el":31,"az":270,"ss":38,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":26,"used":false},{"PRN":123,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021614.949,A,5029.3800,N,10441.0388,W,0.016538,341.48,280706,,*1B
{"class":"TPV","tag":"RMC","time":1154052974.949,"ept":0.005,"lat":50.489666667,"lon":-104.683980000,"alt":572.300,"epx":32.645,"epy":34.721,"epv":71.300,"track":341.4800,"speed":0.009,"climb":-0.100,"mode":3}
$GPGGA,021615.949,5029.3799,N,10441.0387,W,1,04,12.5,572.1,M,-20.3,M,0.0,0000*7C
@@ -42,7 +42,7 @@ $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39
$GPGSV,3,1,9,8,48,156,25,17,50,212,0,28,82,37,36,11,38,84,36*42
$GPGSV,3,2,9,26,32,277,39,29,31,270,38,19,6,48,0,27,22,152,20*78
$GPGSV,3,3,9,123,0,0,0*40
-{"class":"SKY","tag":"GSV","vdop":3.10,"hdop":12.50,"pdop":12.90,"satellites":[{"PRN":8,"el":48,"az":156,"ss":25,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":36,"used":true},{"PRN":26,"el":32,"az":277,"ss":39,"used":true},{"PRN":29,"el":31,"az":270,"ss":38,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":20,"used":false},{"PRN":123,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":2.28,"ydop":2.35,"vdop":3.10,"tdop":5.42,"hdop":12.50,"gdop":8.68,"pdop":12.90,"satellites":[{"PRN":8,"el":48,"az":156,"ss":25,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":36,"used":true},{"PRN":26,"el":32,"az":277,"ss":39,"used":true},{"PRN":29,"el":31,"az":270,"ss":38,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":20,"used":false},{"PRN":123,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021619.949,A,5029.3802,N,10441.0387,W,0.152675,359.28,280706,,*1F
{"class":"TPV","tag":"RMC","time":1154052979.949,"ept":0.005,"lat":50.489670000,"lon":-104.683978333,"alt":571.600,"epx":34.137,"epy":35.324,"epv":71.300,"track":359.2800,"speed":0.079,"climb":-0.200,"mode":3}
$GPGGA,021620.949,5029.3803,N,10441.0387,W,1,04,12.5,571.7,M,-20.3,M,0.0,0000*73
@@ -71,7 +71,7 @@ $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39
$GPGSV,3,1,9,8,48,156,25,17,50,212,0,28,82,37,37,11,38,84,37*42
$GPGSV,3,2,9,26,32,277,39,29,31,270,38,19,6,48,0,27,22,152,21*79
$GPGSV,3,3,9,123,0,0,0*40
-{"class":"SKY","tag":"GSV","vdop":3.10,"hdop":12.50,"pdop":12.90,"satellites":[{"PRN":8,"el":48,"az":156,"ss":25,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":37,"used":true},{"PRN":11,"el":38,"az":84,"ss":37,"used":true},{"PRN":26,"el":32,"az":277,"ss":39,"used":true},{"PRN":29,"el":31,"az":270,"ss":38,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":21,"used":false},{"PRN":123,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":2.28,"ydop":2.35,"vdop":3.10,"tdop":5.42,"hdop":12.50,"gdop":8.68,"pdop":12.90,"satellites":[{"PRN":8,"el":48,"az":156,"ss":25,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":37,"used":true},{"PRN":11,"el":38,"az":84,"ss":37,"used":true},{"PRN":26,"el":32,"az":277,"ss":39,"used":true},{"PRN":29,"el":31,"az":270,"ss":38,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":21,"used":false},{"PRN":123,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021624.949,A,5029.3810,N,10441.0386,W,0.200234,356.84,280706,,*1F
{"class":"TPV","tag":"RMC","time":1154052984.949,"ept":0.005,"lat":50.489683333,"lon":-104.683976667,"alt":570.700,"epx":34.137,"epy":35.324,"epv":71.300,"track":356.8400,"speed":0.103,"climb":-0.500,"mode":3}
$GPGGA,021625.949,5029.3812,N,10441.0386,W,1,04,12.5,570.1,M,-20.3,M,0.0,0000*70
@@ -100,7 +100,7 @@ $GPGSA,A,3,28,11,26,29,27,,,,,,,,3.6,2.0,3.0*36
$GPGSV,3,1,9,8,48,156,0,17,50,212,0,28,82,37,37,11,38,84,36*74
$GPGSV,3,2,9,26,32,277,39,29,31,270,37,19,6,48,0,27,22,152,28*7F
$GPGSV,3,3,9,124,0,0,0*47
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":37,"used":true},{"PRN":11,"el":38,"az":84,"ss":36,"used":true},{"PRN":26,"el":32,"az":277,"ss":39,"used":true},{"PRN":29,"el":31,"az":270,"ss":37,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":28,"used":true},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.83,"ydop":1.35,"vdop":3.00,"tdop":2.18,"hdop":2.00,"gdop":4.00,"pdop":3.60,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":37,"used":true},{"PRN":11,"el":38,"az":84,"ss":36,"used":true},{"PRN":26,"el":32,"az":277,"ss":39,"used":true},{"PRN":29,"el":31,"az":270,"ss":37,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":28,"used":true},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021629.948,A,5029.3826,N,10441.0381,W,0.066422,8.45,280706,,*17
{"class":"TPV","tag":"RMC","time":1154052989.948,"ept":0.005,"lat":50.489710000,"lon":-104.683968333,"alt":567.000,"epx":12.458,"epy":20.312,"epv":69.000,"track":8.4500,"speed":0.034,"climb":-0.600,"mode":3}
$GPGGA,021630.948,5029.3826,N,10441.0380,W,1,04,12.5,567.0,M,-20.3,M,0.0,0000*73
@@ -129,7 +129,7 @@ $GPGSA,A,3,28,11,26,29,,,,,,,,,12.9,12.5,3.1*39
$GPGSV,3,1,9,8,48,156,0,17,50,212,0,28,82,37,37,11,38,84,36*74
$GPGSV,3,2,9,26,32,277,38,29,31,270,37,19,6,48,0,27,22,152,27*71
$GPGSV,3,3,9,124,0,0,0*47
-{"class":"SKY","tag":"GSV","vdop":3.10,"hdop":12.50,"pdop":12.90,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":37,"used":true},{"PRN":11,"el":38,"az":84,"ss":36,"used":true},{"PRN":26,"el":32,"az":277,"ss":38,"used":true},{"PRN":29,"el":31,"az":270,"ss":37,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":27,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":2.28,"ydop":2.35,"vdop":3.10,"tdop":5.42,"hdop":12.50,"gdop":8.68,"pdop":12.90,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":37,"used":true},{"PRN":11,"el":38,"az":84,"ss":36,"used":true},{"PRN":26,"el":32,"az":277,"ss":38,"used":true},{"PRN":29,"el":31,"az":270,"ss":37,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":27,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021634.948,A,5029.3825,N,10441.0370,W,0.003955,192.84,280706,,*17
{"class":"TPV","tag":"RMC","time":1154052994.948,"ept":0.005,"lat":50.489708333,"lon":-104.683950000,"alt":566.700,"epx":34.137,"epy":35.324,"epv":71.300,"track":192.8400,"speed":0.002,"climb":-0.200,"mode":3}
$GPGGA,021635.948,5029.3825,N,10441.0370,W,1,04,12.5,566.4,M,-20.3,M,0.0,0000*7F
@@ -158,7 +158,7 @@ $GPGSA,A,3,28,11,26,29,27,,,,,,,,3.6,2.0,3.0*36
$GPGSV,3,1,9,8,48,156,0,17,50,212,0,28,82,37,37,11,38,84,36*74
$GPGSV,3,2,9,26,32,277,38,29,31,270,36,19,6,48,0,27,22,152,28*7F
$GPGSV,3,3,9,124,0,0,0*47
-{"class":"SKY","tag":"GSV","vdop":3.00,"hdop":2.00,"pdop":3.60,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":37,"used":true},{"PRN":11,"el":38,"az":84,"ss":36,"used":true},{"PRN":26,"el":32,"az":277,"ss":38,"used":true},{"PRN":29,"el":31,"az":270,"ss":36,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":28,"used":true},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.83,"ydop":1.35,"vdop":3.00,"tdop":2.18,"hdop":2.00,"gdop":4.00,"pdop":3.60,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":0,"used":false},{"PRN":28,"el":82,"az":37,"ss":37,"used":true},{"PRN":11,"el":38,"az":84,"ss":36,"used":true},{"PRN":26,"el":32,"az":277,"ss":38,"used":true},{"PRN":29,"el":31,"az":270,"ss":36,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":28,"used":true},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021639.948,A,5029.3825,N,10441.0375,W,0.024297,20.59,280706,,*27
{"class":"TPV","tag":"RMC","time":1154052999.948,"ept":0.005,"lat":50.489708333,"lon":-104.683958333,"alt":565.600,"epx":12.458,"epy":20.312,"epv":69.000,"track":20.5900,"speed":0.012,"climb":-0.600,"mode":3}
$GPGGA,021640.948,5029.3825,N,10441.0376,W,1,04,12.5,565.3,M,-20.3,M,0.0,0000*7F
@@ -187,7 +187,7 @@ $GPGSA,A,3,17,28,11,26,29,,,,,,,,3.5,2.0,2.8*3F
$GPGSV,3,1,9,8,48,156,0,17,50,212,33,28,82,37,36,11,38,84,35*46
$GPGSV,3,2,9,26,32,277,37,29,31,270,36,19,6,48,0,27,22,152,25*7D
$GPGSV,3,3,9,124,0,0,0*47
-{"class":"SKY","tag":"GSV","vdop":2.80,"hdop":2.00,"pdop":3.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":33,"used":true},{"PRN":28,"el":82,"az":37,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":35,"used":true},{"PRN":26,"el":32,"az":277,"ss":37,"used":true},{"PRN":29,"el":31,"az":270,"ss":36,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":25,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.83,"ydop":1.35,"vdop":2.80,"tdop":2.18,"hdop":2.00,"gdop":4.00,"pdop":3.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":33,"used":true},{"PRN":28,"el":82,"az":37,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":35,"used":true},{"PRN":26,"el":32,"az":277,"ss":37,"used":true},{"PRN":29,"el":31,"az":270,"ss":36,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":25,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021644.947,A,5029.3844,N,10441.0383,W,0.225686,357.97,280706,,*1A
{"class":"TPV","tag":"RMC","time":1154053004.947,"ept":0.005,"lat":50.489740000,"lon":-104.683971667,"alt":562.500,"epx":12.458,"epy":20.312,"epv":64.400,"track":357.9700,"speed":0.116,"climb":-1.100,"mode":3}
$GPGGA,021645.947,5029.3848,N,10441.0383,W,1,06,1.4,561.4,M,-20.3,M,0.0,0000*46
@@ -216,7 +216,7 @@ $GPGSA,A,3,17,28,11,26,29,,,,,,,,3.5,2.0,2.8*3F
$GPGSV,3,1,9,8,48,156,0,17,50,212,34,28,82,39,35,11,38,84,33*4A
$GPGSV,3,2,9,26,32,277,37,29,31,269,34,19,6,48,0,27,22,152,28*7A
$GPGSV,3,3,9,124,0,0,0*47
-{"class":"SKY","tag":"GSV","vdop":2.80,"hdop":2.00,"pdop":3.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":34,"used":true},{"PRN":28,"el":82,"az":39,"ss":35,"used":true},{"PRN":11,"el":38,"az":84,"ss":33,"used":true},{"PRN":26,"el":32,"az":277,"ss":37,"used":true},{"PRN":29,"el":31,"az":269,"ss":34,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":28,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.83,"ydop":1.36,"vdop":2.80,"tdop":2.18,"hdop":2.00,"gdop":4.00,"pdop":3.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":34,"used":true},{"PRN":28,"el":82,"az":39,"ss":35,"used":true},{"PRN":11,"el":38,"az":84,"ss":33,"used":true},{"PRN":26,"el":32,"az":277,"ss":37,"used":true},{"PRN":29,"el":31,"az":269,"ss":34,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":28,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021649.947,A,5029.3856,N,10441.0379,W,0.118754,16.61,280706,,*2D
{"class":"TPV","tag":"RMC","time":1154053009.947,"ept":0.005,"lat":50.489760000,"lon":-104.683965000,"alt":559.300,"epx":12.462,"epy":20.352,"epv":64.400,"track":16.6100,"speed":0.061,"climb":-0.700,"mode":3}
$GPGGA,021650.947,5029.3857,N,10441.0380,W,1,05,2.0,559.1,M,-20.3,M,0.0,0000*45
@@ -245,7 +245,7 @@ $GPGSA,A,3,17,28,11,26,29,,,,,,,,3.5,2.0,2.8*3F
$GPGSV,3,1,9,8,48,156,0,17,50,212,34,28,82,39,36,11,38,84,33*49
$GPGSV,3,2,9,26,32,277,37,29,31,269,34,19,6,48,0,27,22,152,0*40
$GPGSV,3,3,9,124,0,0,0*47
-{"class":"SKY","tag":"GSV","vdop":2.80,"hdop":2.00,"pdop":3.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":34,"used":true},{"PRN":28,"el":82,"az":39,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":33,"used":true},{"PRN":26,"el":32,"az":277,"ss":37,"used":true},{"PRN":29,"el":31,"az":269,"ss":34,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":0,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.83,"ydop":1.36,"vdop":2.80,"tdop":2.18,"hdop":2.00,"gdop":4.00,"pdop":3.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":34,"used":true},{"PRN":28,"el":82,"az":39,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":33,"used":true},{"PRN":26,"el":32,"az":277,"ss":37,"used":true},{"PRN":29,"el":31,"az":269,"ss":34,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":0,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021654.947,A,5029.3855,N,10441.0381,W,0.142516,3.80,280706,,*15
{"class":"TPV","tag":"RMC","time":1154053014.947,"ept":0.005,"lat":50.489758333,"lon":-104.683968333,"alt":559.500,"epx":12.462,"epy":20.352,"epv":64.400,"track":3.8000,"speed":0.073,"climb":0.100,"mode":3}
$GPGGA,021655.947,5029.3855,N,10441.0381,W,1,05,2.0,559.8,M,-20.3,M,0.0,0000*4A
@@ -274,7 +274,7 @@ $GPGSA,A,3,17,28,11,26,29,,,,,,,,3.5,2.0,2.8*3F
$GPGSV,3,1,9,8,48,156,0,17,50,212,33,28,82,39,36,11,38,84,32*4F
$GPGSV,3,2,9,26,32,277,36,29,31,269,34,19,6,48,0,27,22,152,27*74
$GPGSV,3,3,9,124,0,0,0*47
-{"class":"SKY","tag":"GSV","vdop":2.80,"hdop":2.00,"pdop":3.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":33,"used":true},{"PRN":28,"el":82,"az":39,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":32,"used":true},{"PRN":26,"el":32,"az":277,"ss":36,"used":true},{"PRN":29,"el":31,"az":269,"ss":34,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":27,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.83,"ydop":1.36,"vdop":2.80,"tdop":2.18,"hdop":2.00,"gdop":4.00,"pdop":3.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":0,"used":false},{"PRN":17,"el":50,"az":212,"ss":33,"used":true},{"PRN":28,"el":82,"az":39,"ss":36,"used":true},{"PRN":11,"el":38,"az":84,"ss":32,"used":true},{"PRN":26,"el":32,"az":277,"ss":36,"used":true},{"PRN":29,"el":31,"az":269,"ss":34,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":27,"used":false},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021659.946,A,5029.3855,N,10441.0376,W,0.144243,359.38,280706,,*1F
{"class":"TPV","tag":"RMC","time":1154053019.946,"ept":0.005,"lat":50.489758333,"lon":-104.683960000,"alt":559.800,"epx":12.462,"epy":20.352,"epv":64.400,"track":359.3800,"speed":0.074,"climb":-0.200,"mode":3}
$GPGGA,021700.946,5029.3856,N,10441.0373,W,1,05,2.0,559.4,M,-20.3,M,0.0,0000*48
@@ -303,7 +303,7 @@ $GPGSA,A,3,08,17,28,11,26,29,27,,,,,,2.5,1.3,2.1*3A
$GPGSV,3,1,9,8,48,156,31,17,50,212,32,28,82,39,39,11,38,84,33*72
$GPGSV,3,2,9,26,32,277,37,29,31,269,34,19,6,48,0,27,22,152,30*73
$GPGSV,3,3,9,124,0,0,0*47
-{"class":"SKY","tag":"GSV","vdop":2.10,"hdop":1.30,"pdop":2.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":31,"used":true},{"PRN":17,"el":50,"az":212,"ss":32,"used":true},{"PRN":28,"el":82,"az":39,"ss":39,"used":true},{"PRN":11,"el":38,"az":84,"ss":33,"used":true},{"PRN":26,"el":32,"az":277,"ss":37,"used":true},{"PRN":29,"el":31,"az":269,"ss":34,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":30,"used":true},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.62,"ydop":1.27,"vdop":2.10,"tdop":1.22,"hdop":1.30,"gdop":2.69,"pdop":2.50,"satellites":[{"PRN":8,"el":48,"az":156,"ss":31,"used":true},{"PRN":17,"el":50,"az":212,"ss":32,"used":true},{"PRN":28,"el":82,"az":39,"ss":39,"used":true},{"PRN":11,"el":38,"az":84,"ss":33,"used":true},{"PRN":26,"el":32,"az":277,"ss":37,"used":true},{"PRN":29,"el":31,"az":269,"ss":34,"used":true},{"PRN":19,"el":6,"az":48,"ss":0,"used":false},{"PRN":27,"el":22,"az":152,"ss":30,"used":true},{"PRN":124,"el":0,"az":0,"ss":0,"used":false}]}
$GPRMC,021704.946,A,5029.3858,N,10441.0363,W,0.096613,335.19,280706,,*19
{"class":"TPV","tag":"RMC","time":1154053024.946,"ept":0.005,"lat":50.489763333,"lon":-104.683938333,"alt":556.000,"epx":9.353,"epy":18.976,"epv":64.400,"track":335.1900,"speed":0.050,"climb":-0.800,"mode":3}
$GPGGA,021705.946,5029.3859,N,10441.0363,W,1,07,1.3,555.4,M,-20.3,M,0.0,0000*4D
diff --git a/test/daemon/superstar2.log.chk b/test/daemon/superstar2.log.chk
index b079f7c6..a3a52007 100644
--- a/test/daemon/superstar2.log.chk
+++ b/test/daemon/superstar2.log.chk
@@ -1,7 +1,7 @@
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,39,03,41,063,36*7C
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,00,23,14,223,00*72
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","xdop":0.00,"ydop":0.00,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":36,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":0.00,"ydop":0.00,"vdop":4.13,"tdop":3.58,"hdop":3.16,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":36,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055054,5333.7867,N,11326.3743,W,1,05,3.10,631.80,M,,,*29
$GPRMC,055054,A,5333.7867,N,11326.3743,W,0.0000,0.000,040709,,*38
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.3*33
@@ -9,7 +9,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.3*33
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,39,03,41,063,36*7C
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,00,23,14,223,00*72
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.30,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":36,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.30,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":36,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055055,5333.7867,N,11326.3743,W,1,05,3.10,631.87,M,,,*2F
$GPRMC,055055,A,5333.7867,N,11326.3743,W,0.0000,0.000,040709,,*39
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.3*33
@@ -17,7 +17,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.3*33
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,39,03,41,063,36*7C
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,00,23,14,223,00*72
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.30,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":36,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.30,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":36,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055056,5333.7867,N,11326.3744,W,1,05,3.10,631.94,M,,,*29
$GPRMC,055056,A,5333.7867,N,11326.3744,W,0.0000,0.000,040709,,*3D
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.3*33
@@ -25,7 +25,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.3*33
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,40,03,41,063,36*72
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,00,23,14,223,00*72
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.30,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":36,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.30,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":36,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055057,5333.7867,N,11326.3744,W,1,05,3.10,632.00,M,,,*26
$GPRMC,055057,A,5333.7867,N,11326.3744,W,0.0000,0.000,040709,,*3C
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.3*33
@@ -33,7 +33,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.3*33
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,40,03,41,063,36*72
$GPGSV,3,2,12,28,22,023,36,09,18,156,00,30,15,073,00,23,14,223,00*73
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.30,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":36,"used":true},{"PRN":28,"el":22,"az":23,"ss":36,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.30,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":36,"used":true},{"PRN":28,"el":22,"az":23,"ss":36,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055058,5333.7866,N,11326.3744,W,1,05,3.10,632.09,M,,,*21
$GPRMC,055058,A,5333.7866,N,11326.3744,W,0.0000,0.000,040709,,*32
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.3*33
@@ -41,7 +41,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.3*33
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,39,03,41,063,36*7C
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,00,23,14,223,00*72
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.30,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":36,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.30,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":36,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055059,5333.7866,N,11326.3745,W,1,05,3.10,632.20,M,,,*2A
$GPRMC,055059,A,5333.7866,N,11326.3745,W,0.0000,0.000,040709,,*32
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.3*33
@@ -49,7 +49,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.3*33
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,40,03,41,063,36*72
$GPGSV,3,2,12,28,22,023,36,09,18,156,00,30,15,073,00,23,14,223,00*73
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.30,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":36,"used":true},{"PRN":28,"el":22,"az":23,"ss":36,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.30,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":36,"used":true},{"PRN":28,"el":22,"az":23,"ss":36,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055100,5333.7866,N,11326.3745,W,1,05,3.10,632.27,M,,,*20
$GPRMC,055100,A,5333.7866,N,11326.3745,W,0.0000,0.000,040709,,*3F
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.3*33
@@ -57,7 +57,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.3*33
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,40,03,41,063,36*72
$GPGSV,3,2,12,28,22,023,36,09,18,156,00,30,15,073,00,23,14,223,00*73
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.30,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":36,"used":true},{"PRN":28,"el":22,"az":23,"ss":36,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.30,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":36,"used":true},{"PRN":28,"el":22,"az":23,"ss":36,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055101,5333.7866,N,11326.3745,W,1,05,3.10,632.29,M,,,*2F
$GPRMC,055101,A,5333.7866,N,11326.3745,W,0.0000,0.000,040709,,*3E
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -65,7 +65,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,76,110,49,11,67,212,50,29,55,030,41,03,41,063,37*7A
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,00,23,14,223,00*72
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":49,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":37,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":49,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":37,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055102,5333.7865,N,11326.3746,W,1,05,3.10,632.27,M,,,*22
$GPRMC,055102,A,5333.7865,N,11326.3746,W,0.0000,0.000,040709,,*3D
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -73,7 +73,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,41,03,41,063,37*72
$GPGSV,3,2,12,28,22,023,36,09,18,156,00,30,15,073,00,23,14,223,00*73
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":37,"used":true},{"PRN":28,"el":22,"az":23,"ss":36,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":37,"used":true},{"PRN":28,"el":22,"az":23,"ss":36,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055103,5333.7865,N,11326.3746,W,1,05,3.10,632.22,M,,,*26
$GPRMC,055103,A,5333.7865,N,11326.3746,W,0.0000,0.000,040709,,*3C
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -81,7 +81,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,41,03,41,063,37*72
$GPGSV,3,2,12,28,22,023,36,09,18,156,00,30,15,073,00,23,14,223,00*73
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":37,"used":true},{"PRN":28,"el":22,"az":23,"ss":36,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":37,"used":true},{"PRN":28,"el":22,"az":23,"ss":36,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055104,5333.7864,N,11326.3746,W,1,05,3.10,632.11,M,,,*20
$GPRMC,055104,A,5333.7864,N,11326.3746,W,0.0000,0.000,040709,,*3A
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -89,7 +89,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,76,110,49,11,67,212,50,29,55,030,41,03,41,063,37*7A
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,00,23,14,223,00*72
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":49,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":37,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":49,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":37,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055105,5333.7863,N,11326.3746,W,1,05,3.10,631.96,M,,,*2A
$GPRMC,055105,A,5333.7863,N,11326.3746,W,0.0000,0.000,040709,,*3C
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -97,7 +97,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,41,03,41,063,37*72
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,00,23,14,223,00*72
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":37,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":37,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055106,5333.7863,N,11326.3746,W,1,05,3.10,631.78,M,,,*29
$GPRMC,055106,A,5333.7863,N,11326.3746,W,0.0000,0.000,040709,,*3F
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -105,7 +105,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,41,03,41,063,37*72
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,00,23,14,223,00*72
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":37,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":37,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055107,5333.7862,N,11326.3746,W,1,05,3.10,631.63,M,,,*23
$GPRMC,055107,A,5333.7862,N,11326.3746,W,0.0000,0.000,040709,,*3F
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -113,7 +113,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,41,03,41,063,38*7D
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,00,23,14,223,00*72
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":0,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055108,5333.7862,N,11326.3746,W,1,05,3.10,631.50,M,,,*2C
$GPRMC,055108,A,5333.7862,N,11326.3746,W,0.0000,0.000,040709,,*30
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -121,7 +121,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,40,03,41,063,38*7C
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,34,23,14,223,00*75
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":34,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":34,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055109,5333.7861,N,11326.3746,W,1,05,3.10,631.39,M,,,*21
$GPRMC,055109,A,5333.7861,N,11326.3746,W,0.0000,0.000,040709,,*32
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -129,7 +129,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,76,110,49,11,67,212,50,29,55,030,41,03,41,063,38*75
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,34,23,14,223,00*75
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":49,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":34,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":49,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":34,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055110,5333.7861,N,11326.3746,W,1,05,3.10,631.30,M,,,*20
$GPRMC,055110,A,5333.7861,N,11326.3746,W,0.0000,0.000,040709,,*3A
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -137,7 +137,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,76,110,49,11,67,212,50,29,55,030,41,03,41,063,38*75
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,34,23,14,223,00*75
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":49,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":34,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":49,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":34,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055111,5333.7861,N,11326.3746,W,1,05,3.10,631.22,M,,,*22
$GPRMC,055111,A,5333.7861,N,11326.3746,W,0.0000,0.000,040709,,*3B
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -145,7 +145,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,40,03,41,063,38*7C
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,34,23,14,223,00*75
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":34,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":34,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055112,5333.7860,N,11326.3746,W,1,05,3.10,631.13,M,,,*22
$GPRMC,055112,A,5333.7860,N,11326.3746,W,0.0000,0.000,040709,,*39
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -153,7 +153,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,40,03,41,063,38*7C
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,34,23,14,223,00*75
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":34,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":34,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055113,5333.7860,N,11326.3745,W,1,05,3.10,631.04,M,,,*26
$GPRMC,055113,A,5333.7860,N,11326.3745,W,0.0000,0.000,040709,,*3B
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -161,7 +161,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,40,03,41,063,38*7C
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,34,23,14,223,00*75
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":34,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":34,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055114,5333.7859,N,11326.3745,W,1,05,3.10,630.98,M,,,*2F
$GPRMC,055114,A,5333.7859,N,11326.3745,W,0.0000,0.000,040709,,*36
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -169,7 +169,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,76,110,50,11,67,212,50,29,55,030,41,03,41,063,39*7C
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,15,073,33,23,14,223,00*72
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":33,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.10,"ydop":2.37,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.31,"pdop":5.20,"satellites":[{"PRN":1,"el":76,"az":110,"ss":50,"used":true},{"PRN":11,"el":67,"az":212,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":15,"az":73,"ss":33,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055115,5333.7859,N,11326.3745,W,1,05,3.10,630.95,M,,,*23
$GPRMC,055115,A,5333.7859,N,11326.3745,W,0.0000,0.000,040709,,*37
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -177,7 +177,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,40,03,41,063,39*7D
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,33,23,14,223,00*71
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":33,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.35,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.32,"pdop":5.20,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":33,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055116,5333.7859,N,11326.3745,W,1,05,3.10,630.96,M,,,*23
$GPRMC,055116,A,5333.7859,N,11326.3745,W,0.0000,0.000,040709,,*34
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -185,7 +185,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,41,03,41,063,39*7C
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,33,23,14,223,00*71
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":33,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.35,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.32,"pdop":5.20,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":33,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055117,5333.7859,N,11326.3745,W,1,06,3.10,630.99,M,,,*2E
$GPRMC,055117,A,5333.7859,N,11326.3745,W,0.0000,0.000,040709,,*35
$GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
@@ -193,7 +193,7 @@ $GPGSA,A,3,01,11,29,03,28,,,,,,,,0.0,3.1,3.4*34
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,40,03,41,063,39*7D
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,33,23,14,223,00*71
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":33,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":1.96,"ydop":0.77,"vdop":3.40,"tdop":1.69,"hdop":3.10,"gdop":3.30,"pdop":2.83,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":33,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055118,5333.7859,N,11326.3744,W,1,06,3.10,631.00,M,,,*21
$GPRMC,055118,A,5333.7859,N,11326.3744,W,0.0000,0.000,040709,,*3B
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -201,7 +201,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,50,11,67,211,50,29,55,030,40,03,41,063,39*75
$GPGSV,3,2,12,28,22,023,38,09,18,156,00,30,16,073,33,23,14,223,00*7E
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":50,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":33,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":1.96,"ydop":0.77,"vdop":3.40,"tdop":1.69,"hdop":3.10,"gdop":3.30,"pdop":2.83,"satellites":[{"PRN":1,"el":75,"az":109,"ss":50,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":33,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055119,5333.7858,N,11326.3744,W,1,06,3.10,631.04,M,,,*25
$GPRMC,055119,A,5333.7858,N,11326.3744,W,0.0000,0.000,040709,,*3B
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -209,7 +209,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,50,11,67,211,50,29,55,030,40,03,41,063,39*75
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,33,23,14,223,00*71
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":50,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":33,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":1.96,"ydop":0.77,"vdop":3.40,"tdop":1.69,"hdop":3.10,"gdop":3.30,"pdop":2.83,"satellites":[{"PRN":1,"el":75,"az":109,"ss":50,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":33,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055120,5333.7858,N,11326.3744,W,1,06,3.10,631.09,M,,,*22
$GPRMC,055120,A,5333.7858,N,11326.3744,W,0.0000,0.000,040709,,*31
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -217,7 +217,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,50,11,67,211,50,29,55,030,40,03,41,063,39*75
$GPGSV,3,2,12,28,22,023,38,09,18,156,00,30,16,073,33,23,14,223,00*7E
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":50,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":33,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":1.96,"ydop":0.77,"vdop":3.40,"tdop":1.69,"hdop":3.10,"gdop":3.30,"pdop":2.83,"satellites":[{"PRN":1,"el":75,"az":109,"ss":50,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":33,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055121,5333.7858,N,11326.3744,W,1,06,3.10,631.18,M,,,*23
$GPRMC,055121,A,5333.7858,N,11326.3744,W,0.0000,0.000,040709,,*30
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -225,7 +225,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,40,03,41,063,39*7D
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,32,23,14,223,00*70
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":32,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":1.96,"ydop":0.77,"vdop":3.40,"tdop":1.69,"hdop":3.10,"gdop":3.30,"pdop":2.83,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":32,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055122,5333.7857,N,11326.3744,W,1,06,3.10,631.27,M,,,*23
$GPRMC,055122,A,5333.7857,N,11326.3744,W,0.0000,0.000,040709,,*3C
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -233,7 +233,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,41,03,41,063,40*72
$GPGSV,3,2,12,28,22,023,38,09,18,156,00,30,16,073,33,23,14,223,00*7E
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":40,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":33,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":1.96,"ydop":0.77,"vdop":3.40,"tdop":1.69,"hdop":3.10,"gdop":3.30,"pdop":2.83,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":40,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":33,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055123,5333.7857,N,11326.3743,W,1,06,2.70,631.36,M,,,*22
$GPRMC,055123,A,5333.7857,N,11326.3743,W,0.0000,0.000,040709,,*3A
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,2.7,3.3*37
@@ -241,7 +241,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,2.7,3.3*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,41,03,41,063,40*72
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,32,23,14,223,00*70
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.30,"hdop":2.70,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":40,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":32,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":1.96,"ydop":0.77,"vdop":3.30,"tdop":1.69,"hdop":2.70,"gdop":3.30,"pdop":2.83,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":41,"used":true},{"PRN":3,"el":41,"az":63,"ss":40,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":32,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055124,5333.7857,N,11326.3743,W,1,06,2.70,631.42,M,,,*26
$GPRMC,055124,A,5333.7857,N,11326.3743,W,0.0000,0.000,040709,,*3D
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,2.7,3.3*37
@@ -249,7 +249,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,2.7,3.3*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,40,03,41,063,39*7D
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,32,23,14,223,00*70
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.30,"hdop":2.70,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":32,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":1.96,"ydop":0.77,"vdop":3.30,"tdop":1.69,"hdop":2.70,"gdop":3.30,"pdop":2.83,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":32,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055125,5333.7856,N,11326.3743,W,1,06,2.70,631.47,M,,,*23
$GPRMC,055125,A,5333.7856,N,11326.3743,W,0.0000,0.000,040709,,*3D
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,2.7,3.3*37
@@ -257,7 +257,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,2.7,3.3*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,40,03,41,063,39*7D
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,32,23,14,223,00*70
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.30,"hdop":2.70,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":32,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":1.96,"ydop":0.77,"vdop":3.30,"tdop":1.69,"hdop":2.70,"gdop":3.30,"pdop":2.83,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":32,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055126,5333.7856,N,11326.3743,W,1,06,2.70,631.52,M,,,*24
$GPRMC,055126,A,5333.7856,N,11326.3743,W,0.0000,0.000,040709,,*3E
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,2.7,3.3*37
@@ -265,7 +265,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,2.7,3.3*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,40,03,41,063,39*7D
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,32,23,14,223,00*70
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.30,"hdop":2.70,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":32,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":1.96,"ydop":0.77,"vdop":3.30,"tdop":1.69,"hdop":2.70,"gdop":3.30,"pdop":2.83,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":32,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055127,5333.7855,N,11326.3742,W,1,06,2.70,631.54,M,,,*21
$GPRMC,055127,A,5333.7855,N,11326.3742,W,0.0000,0.000,040709,,*3D
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,2.7,3.3*37
@@ -273,7 +273,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,2.7,3.3*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,40,03,41,063,39*7D
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,31,23,14,223,00*73
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.30,"hdop":2.70,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":31,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":1.96,"ydop":0.77,"vdop":3.30,"tdop":1.69,"hdop":2.70,"gdop":3.30,"pdop":2.83,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":31,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055128,5333.7855,N,11326.3742,W,1,06,2.70,631.55,M,,,*2F
$GPRMC,055128,A,5333.7855,N,11326.3742,W,0.0000,0.000,040709,,*32
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,2.7,3.3*37
@@ -281,7 +281,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,2.7,3.3*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,40,03,41,063,39*7D
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,31,23,14,223,00*73
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.30,"hdop":2.70,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":31,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":1.96,"ydop":0.77,"vdop":3.30,"tdop":1.69,"hdop":2.70,"gdop":3.30,"pdop":2.83,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":31,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055129,5333.7854,N,11326.3742,W,1,06,2.70,631.56,M,,,*2C
$GPRMC,055129,A,5333.7854,N,11326.3742,W,0.0000,0.000,040709,,*32
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,2.7,3.3*37
@@ -289,7 +289,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,2.7,3.3*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,39,03,41,063,39*73
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,30,23,14,223,00*72
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.30,"hdop":2.70,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":30,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":1.96,"ydop":0.77,"vdop":3.30,"tdop":1.69,"hdop":2.70,"gdop":3.30,"pdop":2.83,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":30,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055130,5333.7853,N,11326.3741,W,1,06,2.70,631.57,M,,,*21
$GPRMC,055130,A,5333.7853,N,11326.3741,W,0.0000,0.000,040709,,*3E
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,2.7,3.3*37
@@ -297,7 +297,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,2.7,3.3*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,40,03,41,063,39*7D
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,30,23,14,223,00*72
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.30,"hdop":2.70,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":30,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":1.96,"ydop":0.77,"vdop":3.30,"tdop":1.69,"hdop":2.70,"gdop":3.30,"pdop":2.83,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":30,"used":true},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055131,5333.7853,N,11326.3741,W,1,05,3.10,631.59,M,,,*2A
$GPRMC,055131,A,5333.7853,N,11326.3741,W,0.0000,0.000,040709,,*3F
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -305,7 +305,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,39,03,41,063,39*73
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,29,23,14,223,00*7A
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":29,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.35,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.32,"pdop":5.20,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":29,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055132,5333.7853,N,11326.3741,W,1,05,3.10,631.62,M,,,*21
$GPRMC,055132,A,5333.7853,N,11326.3741,W,0.0000,0.000,040709,,*3C
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -313,7 +313,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,39,03,41,063,38*72
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,29,23,14,223,00*7A
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":29,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.35,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.32,"pdop":5.20,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":29,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055133,5333.7853,N,11326.3741,W,1,05,3.10,631.66,M,,,*24
$GPRMC,055133,A,5333.7853,N,11326.3741,W,0.0000,0.000,040709,,*3D
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -321,7 +321,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,40,03,41,063,39*7D
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,28,23,14,223,00*7B
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.35,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.32,"pdop":5.20,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055134,5333.7854,N,11326.3741,W,1,05,3.10,631.68,M,,,*2A
$GPRMC,055134,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*3D
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -329,7 +329,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,40,03,41,063,39*7D
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,27,23,14,223,00*74
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":27,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.35,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.32,"pdop":5.20,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":27,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055135,5333.7854,N,11326.3741,W,1,05,3.10,631.69,M,,,*2A
$GPRMC,055135,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*3C
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -337,7 +337,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,39,03,41,063,38*72
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,27,23,14,223,00*74
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,00*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":27,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.35,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.32,"pdop":5.20,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":27,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":0,"used":false}]}
$GPGGA,055136,5333.7854,N,11326.3741,W,1,05,3.10,631.69,M,,,*29
$GPRMC,055136,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*3F
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -345,7 +345,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,40,03,41,063,39*7D
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,27,23,14,223,00*74
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,33*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":27,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.35,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.32,"pdop":5.20,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":27,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055137,5333.7854,N,11326.3741,W,1,05,3.10,631.68,M,,,*29
$GPRMC,055137,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*3E
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -353,7 +353,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,40,03,41,063,39*7D
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,26,23,14,223,00*75
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,33*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.35,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.32,"pdop":5.20,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055138,5333.7854,N,11326.3741,W,1,05,3.10,631.64,M,,,*2A
$GPRMC,055138,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*31
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -361,7 +361,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,40,03,41,063,39*7D
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,27,23,14,223,00*74
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,32*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":27,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.35,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.32,"pdop":5.20,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":27,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
$GPGGA,055139,5333.7854,N,11326.3741,W,1,05,3.10,631.60,M,,,*2F
$GPRMC,055139,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*30
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -369,7 +369,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,40,03,41,063,38*7C
$GPGSV,3,2,12,28,22,023,38,09,18,156,00,30,16,073,26,23,14,223,00*7A
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,32*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.35,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.32,"pdop":5.20,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
$GPGGA,055140,5333.7854,N,11326.3741,W,1,05,3.10,631.55,M,,,*27
$GPRMC,055140,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*3E
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -377,7 +377,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,030,40,03,41,063,39*7C
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,26,23,14,223,00*75
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,32*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.35,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.32,"pdop":5.20,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
$GPGGA,055141,5333.7854,N,11326.3741,W,1,05,3.10,631.51,M,,,*22
$GPRMC,055141,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*3F
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -385,7 +385,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,030,40,03,41,063,39*7C
$GPGSV,3,2,12,28,22,023,37,09,18,156,00,30,16,073,26,23,14,223,00*75
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,32*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.35,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.32,"pdop":5.20,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":37,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
$GPGGA,055142,5333.7854,N,11326.3741,W,1,05,3.10,631.46,M,,,*27
$GPRMC,055142,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*3C
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -393,7 +393,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,030,40,03,41,063,39*7C
$GPGSV,3,2,12,28,22,023,38,09,18,156,00,30,16,073,25,23,14,223,00*79
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,33*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":25,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.35,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.32,"pdop":5.20,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":40,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":25,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055143,5333.7854,N,11326.3741,W,1,05,3.10,631.41,M,,,*21
$GPRMC,055143,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*3D
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -401,7 +401,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,030,39,03,41,063,38*73
$GPGSV,3,2,12,28,22,023,38,09,18,156,00,30,16,073,25,23,14,223,00*79
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,33*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":25,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.35,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.32,"pdop":5.20,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":25,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055144,5333.7854,N,11326.3741,W,1,05,3.10,631.36,M,,,*26
$GPRMC,055144,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*3A
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -409,7 +409,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,030,39,03,41,063,38*72
$GPGSV,3,2,12,28,22,023,38,09,18,156,00,30,16,073,25,23,14,223,00*79
$GPGSV,3,3,12,22,06,031,00,08,01,208,00,137,28,172,00,134,26,203,33*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":25,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.35,"vdop":3.40,"tdop":3.58,"hdop":3.10,"gdop":6.32,"pdop":5.20,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":30,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":25,"used":false},{"PRN":23,"el":14,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":1,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055145,5333.7854,N,11326.3741,W,1,05,3.10,631.33,M,,,*22
$GPRMC,055145,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*3B
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -417,7 +417,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,49,11,67,211,50,29,55,029,39,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,38,09,18,156,00,30,16,073,26,23,15,223,00*7B
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":49,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055146,5333.7854,N,11326.3741,W,1,05,3.10,631.33,M,,,*21
$GPRMC,055146,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*38
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -425,7 +425,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,39,03,41,063,38*7B
$GPGSV,3,2,12,28,22,023,38,09,18,156,00,30,16,073,26,23,15,223,00*7B
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055147,5333.7854,N,11326.3741,W,1,05,3.10,631.33,M,,,*20
$GPRMC,055147,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*39
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -433,7 +433,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,39,03,41,063,38*7B
$GPGSV,3,2,12,28,22,023,38,09,18,156,00,30,16,073,26,23,15,223,00*7B
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055148,5333.7854,N,11326.3741,W,1,05,3.10,631.35,M,,,*29
$GPRMC,055148,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*36
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -441,7 +441,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,39,03,41,063,38*7B
$GPGSV,3,2,12,28,22,023,38,09,18,156,00,30,16,073,26,23,15,223,00*7B
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055149,5333.7854,N,11326.3741,W,1,05,3.10,631.35,M,,,*28
$GPRMC,055149,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*37
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -449,7 +449,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,39,03,41,063,38*7B
$GPGSV,3,2,12,28,22,023,38,09,18,156,00,30,16,073,26,23,15,223,00*7B
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":39,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055150,5333.7854,N,11326.3741,W,1,05,3.10,631.34,M,,,*21
$GPRMC,055150,A,5333.7854,N,11326.3741,W,0.0000,0.000,040709,,*3F
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -457,7 +457,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,38,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,38,09,18,156,00,30,16,073,26,23,15,223,00*7B
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":26,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055151,5333.7854,N,11326.3742,W,1,05,3.10,631.29,M,,,*2F
$GPRMC,055151,A,5333.7854,N,11326.3742,W,0.0000,0.000,040709,,*3D
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -465,7 +465,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,38,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,38,09,18,156,00,30,16,073,27,23,15,223,00*7A
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,32*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":27,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":27,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
$GPGGA,055152,5333.7854,N,11326.3742,W,1,05,3.10,631.26,M,,,*23
$GPRMC,055152,A,5333.7854,N,11326.3742,W,0.0000,0.000,040709,,*3E
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -473,7 +473,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,38,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,39,09,18,156,00,30,16,073,28,23,15,223,00*74
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055153,5333.7854,N,11326.3742,W,1,05,3.10,631.25,M,,,*21
$GPRMC,055153,A,5333.7854,N,11326.3742,W,0.0000,0.000,040709,,*3F
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -481,7 +481,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,38,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,38,09,18,156,00,30,16,073,28,23,15,223,00*75
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,32*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
$GPGGA,055154,5333.7854,N,11326.3742,W,1,05,3.10,631.22,M,,,*21
$GPRMC,055154,A,5333.7854,N,11326.3742,W,0.0000,0.000,040709,,*38
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -489,7 +489,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,38,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,38,09,18,156,00,30,16,073,28,23,15,223,00*75
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,32*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":38,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
$GPGGA,055155,5333.7854,N,11326.3742,W,1,05,3.10,631.20,M,,,*22
$GPRMC,055155,A,5333.7854,N,11326.3742,W,0.0000,0.000,040709,,*39
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -497,7 +497,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,38,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,39,09,18,156,00,30,16,073,28,23,15,223,00*74
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,32*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
$GPGGA,055156,5333.7854,N,11326.3742,W,1,05,3.10,631.19,M,,,*2B
$GPRMC,055156,A,5333.7854,N,11326.3742,W,0.0000,0.000,040709,,*3A
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -505,7 +505,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,38,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,39,09,18,156,00,30,16,073,28,23,15,223,00*74
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055157,5333.7854,N,11326.3742,W,1,05,3.10,631.18,M,,,*2B
$GPRMC,055157,A,5333.7854,N,11326.3742,W,0.0000,0.000,040709,,*3B
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -513,7 +513,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,38,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,39,09,18,156,00,30,16,073,28,23,15,223,00*74
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055158,5333.7855,N,11326.3742,W,1,05,3.10,631.19,M,,,*24
$GPRMC,055158,A,5333.7855,N,11326.3742,W,0.0000,0.000,040709,,*35
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -521,7 +521,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,38,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,39,09,18,156,00,30,16,073,28,23,15,223,00*74
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055159,5333.7855,N,11326.3742,W,1,05,3.10,631.20,M,,,*2F
$GPRMC,055159,A,5333.7855,N,11326.3742,W,0.0000,0.000,040709,,*34
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -529,7 +529,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,37,03,41,063,38*75
$GPGSV,3,2,12,28,22,023,39,09,18,156,00,30,16,073,28,23,15,223,00*74
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,32*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":37,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":37,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
$GPGGA,055200,5333.7856,N,11326.3742,W,1,05,3.10,631.24,M,,,*27
$GPRMC,055200,A,5333.7856,N,11326.3742,W,0.0000,0.000,040709,,*38
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -537,7 +537,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,38,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,39,09,18,156,00,30,16,073,28,23,15,223,00*74
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055201,5333.7856,N,11326.3742,W,1,05,3.10,631.32,M,,,*21
$GPRMC,055201,A,5333.7856,N,11326.3742,W,0.0000,0.000,040709,,*39
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -545,7 +545,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,37,03,41,063,38*75
$GPGSV,3,2,12,28,22,023,39,09,18,156,00,30,16,073,28,23,15,223,00*74
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":37,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":37,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055202,5333.7857,N,11326.3742,W,1,05,3.10,631.41,M,,,*27
$GPRMC,055202,A,5333.7857,N,11326.3742,W,0.0000,0.000,040709,,*3B
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -553,7 +553,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,38,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,39,09,18,156,00,30,16,073,28,23,15,223,00*74
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,32*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
$GPGGA,055203,5333.7858,N,11326.3742,W,1,05,3.10,631.53,M,,,*2A
$GPRMC,055203,A,5333.7858,N,11326.3742,W,0.0000,0.000,040709,,*35
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -561,7 +561,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,38,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,39,09,18,156,00,30,16,073,28,23,15,223,00*74
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,32*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":39,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
$GPGGA,055204,5333.7858,N,11326.3742,W,1,05,3.10,631.66,M,,,*2B
$GPRMC,055204,A,5333.7858,N,11326.3742,W,0.0000,0.000,040709,,*32
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -569,7 +569,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,38,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,40,09,18,156,00,30,16,073,28,23,15,223,00*7A
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,32*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
$GPGGA,055205,5333.7859,N,11326.3742,W,1,05,3.10,631.82,M,,,*21
$GPRMC,055205,A,5333.7859,N,11326.3742,W,0.0000,0.000,040709,,*32
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -577,7 +577,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,38,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,40,09,18,156,00,30,16,073,28,23,15,223,00*7A
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055206,5333.7860,N,11326.3742,W,1,05,3.10,631.97,M,,,*2C
$GPRMC,055206,A,5333.7860,N,11326.3742,W,0.0000,0.000,040709,,*3B
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -585,7 +585,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,38,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,40,09,18,156,00,30,16,073,28,23,15,223,00*7A
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,32*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
$GPGGA,055207,5333.7861,N,11326.3742,W,1,05,3.10,632.11,M,,,*21
$GPRMC,055207,A,5333.7861,N,11326.3742,W,0.0000,0.000,040709,,*3B
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -593,7 +593,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,47,11,67,211,50,29,55,029,38,03,41,063,38*75
$GPGSV,3,2,12,28,22,023,40,09,18,156,00,30,16,073,28,23,15,223,00*7A
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":47,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":47,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055208,5333.7861,N,11326.3742,W,1,05,3.10,632.27,M,,,*2B
$GPRMC,055208,A,5333.7861,N,11326.3742,W,0.0000,0.000,040709,,*34
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -601,7 +601,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,48,11,67,211,50,29,55,029,38,03,41,063,38*7A
$GPGSV,3,2,12,28,22,023,40,09,18,156,00,30,16,073,28,23,15,223,00*7A
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,32*75
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":48,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
$GPGGA,055209,5333.7862,N,11326.3742,W,1,05,3.10,632.42,M,,,*2A
$GPRMC,055209,A,5333.7862,N,11326.3742,W,0.0000,0.000,040709,,*36
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -609,7 +609,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,47,11,67,211,50,29,55,029,38,03,41,063,38*75
$GPGSV,3,2,12,28,22,023,40,09,18,156,00,30,16,073,28,23,15,223,00*7A
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":47,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":47,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055210,5333.7863,N,11326.3742,W,1,05,3.10,632.57,M,,,*27
$GPRMC,055210,A,5333.7863,N,11326.3742,W,0.0000,0.000,040709,,*3F
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -617,7 +617,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,46,11,67,211,50,29,55,029,38,03,41,063,39*75
$GPGSV,3,2,12,28,22,023,40,09,18,156,00,30,16,073,29,23,15,223,00*7B
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":46,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":29,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":46,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":29,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055211,5333.7863,N,11326.3742,W,1,05,3.10,632.72,M,,,*21
$GPRMC,055211,A,5333.7863,N,11326.3742,W,0.0000,0.000,040709,,*3E
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -625,7 +625,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,47,11,67,211,50,29,55,029,38,03,41,063,39*74
$GPGSV,3,2,12,28,22,023,41,09,18,156,00,30,16,073,28,23,15,223,00*7B
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":47,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":41,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":47,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":41,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":28,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055212,5333.7864,N,11326.3742,W,1,05,3.10,632.83,M,,,*2B
$GPRMC,055212,A,5333.7864,N,11326.3742,W,0.0000,0.000,040709,,*3A
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -633,7 +633,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,47,11,67,211,50,29,55,029,38,03,41,063,39*74
$GPGSV,3,2,12,28,22,023,40,09,18,156,00,30,16,073,29,23,15,223,00*7B
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":47,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":29,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":47,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":29,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055213,5333.7864,N,11326.3742,W,1,05,3.10,632.94,M,,,*2C
$GPRMC,055213,A,5333.7864,N,11326.3742,W,0.0000,0.000,040709,,*3B
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -641,7 +641,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,47,11,67,211,50,29,55,029,38,03,41,063,39*74
$GPGSV,3,2,12,28,22,023,40,09,18,156,00,30,16,073,29,23,15,223,00*7B
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":47,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":29,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":47,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":39,"used":true},{"PRN":28,"el":22,"az":23,"ss":40,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":29,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055214,5333.7865,N,11326.3741,W,1,05,3.10,633.04,M,,,*21
$GPRMC,055214,A,5333.7865,N,11326.3741,W,0.0000,0.000,040709,,*3E
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -649,7 +649,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,109,47,11,67,211,50,29,55,029,38,03,41,063,38*75
$GPGSV,3,2,12,28,22,023,41,09,18,156,00,30,16,073,29,23,15,223,00*7A
$GPGSV,3,3,12,22,06,031,00,08,00,208,00,137,28,172,00,134,26,203,33*74
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":109,"ss":47,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":41,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":29,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.08,"ydop":2.32,"vdop":3.40,"tdop":3.56,"hdop":3.10,"gdop":6.27,"pdop":5.16,"satellites":[{"PRN":1,"el":75,"az":109,"ss":47,"used":true},{"PRN":11,"el":67,"az":211,"ss":50,"used":true},{"PRN":29,"el":55,"az":29,"ss":38,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":41,"used":true},{"PRN":9,"el":18,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":29,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":8,"el":0,"az":208,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055215,5333.7865,N,11326.3741,W,1,05,3.10,633.12,M,,,*27
$GPRMC,055215,A,5333.7865,N,11326.3741,W,0.0000,0.000,040709,,*3F
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -657,7 +657,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,108,47,11,67,210,50,29,56,029,37,03,41,063,38*79
$GPGSV,3,2,12,28,22,023,41,09,19,156,00,30,16,073,29,23,15,223,00*7B
$GPGSV,3,3,12,22,06,031,00,12,00,063,00,137,28,172,00,134,26,203,33*70
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":108,"ss":47,"used":true},{"PRN":11,"el":67,"az":210,"ss":50,"used":true},{"PRN":29,"el":56,"az":29,"ss":37,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":41,"used":true},{"PRN":9,"el":19,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":29,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":12,"el":0,"az":63,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.29,"vdop":3.40,"tdop":3.51,"hdop":3.10,"gdop":6.18,"pdop":5.09,"satellites":[{"PRN":1,"el":75,"az":108,"ss":47,"used":true},{"PRN":11,"el":67,"az":210,"ss":50,"used":true},{"PRN":29,"el":56,"az":29,"ss":37,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":41,"used":true},{"PRN":9,"el":19,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":29,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":12,"el":0,"az":63,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":33,"used":false}]}
$GPGGA,055216,5333.7865,N,11326.3741,W,1,05,3.10,633.20,M,,,*25
$GPRMC,055216,A,5333.7865,N,11326.3741,W,0.0000,0.000,040709,,*3C
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
@@ -665,7 +665,7 @@ $GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
$GPGSV,3,1,12,01,75,108,47,11,67,210,50,29,56,029,37,03,41,063,38*79
$GPGSV,3,2,12,28,22,023,41,09,19,156,00,30,16,073,30,23,15,223,00*73
$GPGSV,3,3,12,22,06,031,00,12,00,063,00,137,28,172,00,134,26,203,32*71
-{"class":"SKY","tag":"SS2-33","vdop":3.40,"hdop":3.10,"satellites":[{"PRN":1,"el":75,"az":108,"ss":47,"used":true},{"PRN":11,"el":67,"az":210,"ss":50,"used":true},{"PRN":29,"el":56,"az":29,"ss":37,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":41,"used":true},{"PRN":9,"el":19,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":30,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":12,"el":0,"az":63,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
+{"class":"SKY","tag":"SS2-33","xdop":2.09,"ydop":2.29,"vdop":3.40,"tdop":3.51,"hdop":3.10,"gdop":6.18,"pdop":5.09,"satellites":[{"PRN":1,"el":75,"az":108,"ss":47,"used":true},{"PRN":11,"el":67,"az":210,"ss":50,"used":true},{"PRN":29,"el":56,"az":29,"ss":37,"used":true},{"PRN":3,"el":41,"az":63,"ss":38,"used":true},{"PRN":28,"el":22,"az":23,"ss":41,"used":true},{"PRN":9,"el":19,"az":156,"ss":0,"used":false},{"PRN":30,"el":16,"az":73,"ss":30,"used":false},{"PRN":23,"el":15,"az":223,"ss":0,"used":false},{"PRN":22,"el":6,"az":31,"ss":0,"used":false},{"PRN":12,"el":0,"az":63,"ss":0,"used":false},{"PRN":137,"el":28,"az":172,"ss":0,"used":false},{"PRN":134,"el":26,"az":203,"ss":32,"used":false}]}
$GPGGA,055217,5333.7866,N,11326.3740,W,1,05,3.10,633.29,M,,,*2F
$GPRMC,055217,A,5333.7866,N,11326.3740,W,0.0000,0.000,040709,,*3F
$GPGSA,A,3,01,11,29,03,28,30,,,,,,,0.0,3.1,3.4*37
diff --git a/test/daemon/tn204.log.chk b/test/daemon/tn204.log.chk
index 1f681e5c..f69ecece 100644
--- a/test/daemon/tn204.log.chk
+++ b/test/daemon/tn204.log.chk
@@ -5,7 +5,7 @@ $GPGGA,230149,3348.605,N,11821.126,W,1,05,1.7,49.4,M,-32.4,M,,*4E
$GPGSA,A,3,07,08,,,27,28,29,,,,,,4.2,1.7,3.8*32
$GPGSV,2,1,08,07,43,197,44,08,68,062,43,11,18,089,00,26,24,314,43*73
$GPGSV,2,2,08,27,48,103,46,28,66,323,42,29,33,306,43,31,10,040,00*78
-{"class":"SKY","tag":"GSV","vdop":3.80,"hdop":1.70,"pdop":4.20,"satellites":[{"PRN":7,"el":43,"az":197,"ss":44,"used":true},{"PRN":8,"el":68,"az":62,"ss":43,"used":true},{"PRN":11,"el":18,"az":89,"ss":0,"used":false},{"PRN":26,"el":24,"az":314,"ss":43,"used":false},{"PRN":27,"el":48,"az":103,"ss":46,"used":true},{"PRN":28,"el":66,"az":323,"ss":42,"used":true},{"PRN":29,"el":33,"az":306,"ss":43,"used":true},{"PRN":31,"el":10,"az":40,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.79,"ydop":1.11,"vdop":3.80,"tdop":1.37,"hdop":1.70,"gdop":2.83,"pdop":4.20,"satellites":[{"PRN":7,"el":43,"az":197,"ss":44,"used":true},{"PRN":8,"el":68,"az":62,"ss":43,"used":true},{"PRN":11,"el":18,"az":89,"ss":0,"used":false},{"PRN":26,"el":24,"az":314,"ss":43,"used":false},{"PRN":27,"el":48,"az":103,"ss":46,"used":true},{"PRN":28,"el":66,"az":323,"ss":42,"used":true},{"PRN":29,"el":33,"az":306,"ss":43,"used":true},{"PRN":31,"el":10,"az":40,"ss":0,"used":false}]}
$PGRME,17.4,M,40.3,M,43.9,M*15
$GPGLL,3348.605,N,11821.126,W,230149,A*34
$PGRMZ,162,f,3*1E
@@ -13,22 +13,22 @@ $PGRMM,NAD83*29
$GPBOD,,T,,M,,*47
$GPRTE,1,1,c,0*07
$GPRMC,230150,A,3348.606,N,11821.125,W,000.0,209.4,261002,013.8,E*62
-{"class":"TPV","tag":"RMC","time":1035673310.000,"ept":0.005,"lat":33.810100000,"lon":-118.352083333,"track":209.4000,"speed":0.000,"mode":2}
+{"class":"TPV","tag":"RMC","time":1035673310.000,"ept":0.005,"lat":33.810100000,"lon":-118.352083333,"epx":11.856,"epy":16.622,"track":209.4000,"speed":0.000,"eps":42.17,"mode":2}
$GPRMB,A,,,,,,,,,,,,V*71
$GPGGA,230151,3348.607,N,11821.124,W,1,05,1.7,49.2,M,-32.4,M,,*41
$GPGSA,A,3,07,08,,,27,28,29,,,,,,4.2,1.7,3.8*32
$GPGSV,2,1,08,07,43,197,45,08,68,062,42,11,18,089,00,26,24,314,43*73
$GPGSV,2,2,08,27,48,103,46,28,66,323,42,29,33,306,44,31,10,040,00*7F
-{"class":"SKY","tag":"GSV","vdop":3.80,"hdop":1.70,"pdop":4.20,"satellites":[{"PRN":7,"el":43,"az":197,"ss":45,"used":true},{"PRN":8,"el":68,"az":62,"ss":42,"used":true},{"PRN":11,"el":18,"az":89,"ss":0,"used":false},{"PRN":26,"el":24,"az":314,"ss":43,"used":false},{"PRN":27,"el":48,"az":103,"ss":46,"used":true},{"PRN":28,"el":66,"az":323,"ss":42,"used":true},{"PRN":29,"el":33,"az":306,"ss":44,"used":true},{"PRN":31,"el":10,"az":40,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.79,"ydop":1.11,"vdop":3.80,"tdop":1.37,"hdop":1.70,"gdop":2.83,"pdop":4.20,"satellites":[{"PRN":7,"el":43,"az":197,"ss":45,"used":true},{"PRN":8,"el":68,"az":62,"ss":42,"used":true},{"PRN":11,"el":18,"az":89,"ss":0,"used":false},{"PRN":26,"el":24,"az":314,"ss":43,"used":false},{"PRN":27,"el":48,"az":103,"ss":46,"used":true},{"PRN":28,"el":66,"az":323,"ss":42,"used":true},{"PRN":29,"el":33,"az":306,"ss":44,"used":true},{"PRN":31,"el":10,"az":40,"ss":0,"used":false}]}
$PGRME,17.4,M,40.3,M,43.9,M*15
$GPGLL,3348.607,N,11821.124,W,230151,A*3D
-{"class":"TPV","tag":"GLL","time":1035673311.000,"ept":0.005,"lat":33.810116667,"lon":-118.352066667,"alt":49.200,"epx":25.546,"epy":25.546,"epv":83.674,"climb":0.000,"mode":3}
+{"class":"TPV","tag":"GLL","time":1035673311.000,"ept":0.005,"lat":33.810116667,"lon":-118.352066667,"alt":49.200,"epx":25.546,"epy":25.546,"epv":83.674,"climb":0.000,"eps":33.24,"mode":3}
$PGRMZ,161,f,3*1D
$PGRMM,NAD83*29
$GPBOD,,T,,M,,*47
$GPRTE,1,1,c,0*07
$GPRMC,230152,A,3348.607,N,11821.124,W,000.0,209.4,261002,013.8,E*60
-{"class":"TPV","tag":"RMC","time":1035673312.000,"ept":0.005,"lat":33.810116667,"lon":-118.352066667,"track":209.4000,"speed":0.000,"mode":2}
+{"class":"TPV","tag":"RMC","time":1035673312.000,"ept":0.005,"lat":33.810116667,"lon":-118.352066667,"epx":11.856,"epy":16.622,"track":209.4000,"speed":0.000,"eps":42.17,"mode":2}
$GPRMB,A,,,,,,,,,,,,V*71
$GPGGA,230153,3348.607,N,11821.124,W,1,05,1.7,49.1,M,-32.4,M,,*40
$GPGSA,A,3,,08,,,,,29,,,,,,4.2,1.7,3.8*3A
@@ -37,7 +37,7 @@ $GPGSV,2,2,08,27,48,103,46,28,66,323,42,29,33,306,44,31,10,040,00*7F
{"class":"SKY","tag":"GSV","vdop":3.80,"hdop":1.70,"pdop":4.20,"satellites":[{"PRN":7,"el":43,"az":197,"ss":45,"used":false},{"PRN":8,"el":68,"az":62,"ss":42,"used":true},{"PRN":11,"el":18,"az":89,"ss":0,"used":false},{"PRN":26,"el":24,"az":314,"ss":41,"used":false},{"PRN":27,"el":48,"az":103,"ss":46,"used":false},{"PRN":28,"el":66,"az":323,"ss":42,"used":false},{"PRN":29,"el":33,"az":306,"ss":44,"used":true},{"PRN":31,"el":10,"az":40,"ss":0,"used":false}]}
$PGRME,17.4,M,40.3,M,43.9,M*15
$GPGLL,3348.607,N,11821.124,W,230153,A*3F
-{"class":"TPV","tag":"GLL","time":1035673313.000,"ept":0.005,"lat":33.810116667,"lon":-118.352066667,"alt":49.100,"epx":25.546,"epy":25.546,"epv":83.674,"climb":0.000,"mode":3}
+{"class":"TPV","tag":"GLL","time":1035673313.000,"ept":0.005,"lat":33.810116667,"lon":-118.352066667,"alt":49.100,"epx":25.546,"epy":25.546,"epv":83.674,"climb":0.000,"eps":33.24,"mode":3}
$PGRMZ,161,f,3*1D
$PGRMM,NAD83*29
$GPBOD,,T,,M,,*47
@@ -49,7 +49,7 @@ $GPGGA,230155,3348.608,N,11821.124,W,1,02,1.9,49.0,M,-32.4,M,,*41
$GPGSA,A,3,07,08,,,27,28,,,,,,,1.9,1.9,1.0*33
$GPGSV,2,1,08,07,43,197,45,08,68,062,43,11,18,089,00,26,24,314,41*70
$GPGSV,2,2,08,27,48,103,46,28,66,323,43,29,33,306,44,31,10,040,00*7E
-{"class":"SKY","tag":"GSV","vdop":1.00,"hdop":1.90,"pdop":1.90,"satellites":[{"PRN":7,"el":43,"az":197,"ss":45,"used":true},{"PRN":8,"el":68,"az":62,"ss":43,"used":true},{"PRN":11,"el":18,"az":89,"ss":0,"used":false},{"PRN":26,"el":24,"az":314,"ss":41,"used":false},{"PRN":27,"el":48,"az":103,"ss":46,"used":true},{"PRN":28,"el":66,"az":323,"ss":43,"used":true},{"PRN":29,"el":33,"az":306,"ss":44,"used":false},{"PRN":31,"el":10,"az":40,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.85,"ydop":1.11,"vdop":1.00,"tdop":1.38,"hdop":1.90,"gdop":2.93,"pdop":1.90,"satellites":[{"PRN":7,"el":43,"az":197,"ss":45,"used":true},{"PRN":8,"el":68,"az":62,"ss":43,"used":true},{"PRN":11,"el":18,"az":89,"ss":0,"used":false},{"PRN":26,"el":24,"az":314,"ss":41,"used":false},{"PRN":27,"el":48,"az":103,"ss":46,"used":true},{"PRN":28,"el":66,"az":323,"ss":43,"used":true},{"PRN":29,"el":33,"az":306,"ss":44,"used":false},{"PRN":31,"el":10,"az":40,"ss":0,"used":false}]}
$PGRME,19.2,M,150.0,M,151.2,M*17
$GPGLL,3348.608,N,11821.124,W,230155,A*36
{"class":"TPV","tag":"GLL","time":1035673315.000,"ept":0.005,"lat":33.810133333,"lon":-118.352066667,"alt":49.000,"epx":28.188,"epy":28.188,"epv":311.441,"climb":0.000,"mode":3}
diff --git a/test/daemon/tnt-revolution.log b/test/daemon/tnt-revolution.log
new file mode 100644
index 00000000..9ac79138
--- /dev/null
+++ b/test/daemon/tnt-revolution.log
@@ -0,0 +1,71 @@
+# Name: TNT Revolution
+# Chipset: TNT
+# Submitted-by: Eric S. Raymond <esr@thyrsus.com>
+# Date: 10 Apr 2010
+# Location: Unknown
+# Notes: Collected remotely from jon Schleuter's nog.yazug.com
+# Can't be transmitting angles in degrees, heading figures are too large.
+#
+# This file is Copyright (c) 2010 by the GPSD project
+# BSD terms apply: see the file COPYING in the distribution root for details.
+#
+$PTNTHTM,14223,N,169,N,-43,N,13641,2454*15
+$PTNTHTM,14091,N,171,N,-43,N,13599,2454*11
+$PTNTHTM,14287,N,172,N,-39,N,13652,2452*18
+$PTNTHTM,14150,N,171,N,-40,N,13605,2452*1E
+$PTNTHTM,14199,N,171,N,-40,N,13614,2452*1B
+$HCXDR,A,171,D,PITCH,A,-37,D,ROLL,G,367,,MAGX,G,2420,,MAGY,G,-8984,,MAGZ*41
+$PTNTHTM,14168,N,171,N,-37,N,13615,2451*17
+$PTNTHTM,14359,N,172,N,-33,N,13647,2450*16
+$PTNTHTM,14243,N,172,N,-33,N,13608,2450*17
+$PTNTHTM,14340,N,176,N,-37,N,13616,2451*1B
+$PTNTHTM,14230,N,175,N,-37,N,13597,2451*14
+$HCXDR,A,180,D,PITCH,A,-39,D,ROLL,G,389,,MAGX,G,2473,,MAGY,G,-9007,,MAGZ*44
+$PTNTHTM,14224,N,178,N,-42,N,13599,2452*13
+$PTNTHTM,14156,N,179,N,-42,N,13600,2452*17
+$PTNTHTM,14157,N,175,N,-42,N,13585,2454*12
+$PTNTHTM,14159,N,175,N,-42,N,13598,2454*10
+$PTNTHTM,14159,N,170,N,-40,N,13569,2455*18
+$HCXDR,A,170,D,PITCH,A,-40,D,ROLL,G,360,,MAGX,G,2419,,MAGY,G,-8947,,MAGZ*42
+$PTNTHTM,14199,N,170,N,-40,N,13610,2454*18
+$PTNTHTM,14094,N,167,N,-40,N,13571,2455*17
+$PTNTHTM,14185,N,167,N,-43,N,13626,2454*15
+$PTNTHTM,14043,N,169,N,-42,N,13592,2454*1D
+$PTNTHTM,14236,N,169,N,-45,N,13644,2453*15
+$HCXDR,A,169,D,PITCH,A,-45,D,ROLL,G,352,,MAGX,G,2382,,MAGY,G,-8909,,MAGZ*41
+$PTNTHTM,14061,N,172,N,-45,N,13599,2452*1D
+$PTNTHTM,14299,N,171,N,-42,N,13652,2450*1A
+$PTNTHTM,14149,N,170,N,-43,N,13605,2450*16
+$PTNTHTM,14243,N,170,N,-39,N,13622,2450*17
+$PTNTHTM,14155,N,172,N,-35,N,13611,2449*15
+$HCXDR,A,172,D,PITCH,A,-37,D,ROLL,G,359,,MAGX,G,2433,,MAGY,G,-9009,,MAGZ*40
+$PTNTHTM,14330,N,172,N,-32,N,13647,2448*11
+$PTNTHTM,14239,N,171,N,-33,N,13612,2448*1B
+$PTNTHTM,14182,N,174,N,-34,N,13581,2449*12
+$PTNTHTM,14256,N,174,N,-37,N,13602,2449*13
+$PTNTHTM,14139,N,178,N,-38,N,13568,2450*1D
+$HCXDR,A,177,D,PITCH,A,-40,D,ROLL,G,358,,MAGX,G,2432,,MAGY,G,-8974,,MAGZ*47
+$PTNTHTM,14193,N,177,N,-40,N,13604,2450*14
+$PTNTHTM,14186,N,174,N,-42,N,13590,2451*1E
+$PTNTHTM,14174,N,174,N,-40,N,13602,2451*19
+$PTNTHTM,14094,N,172,N,-40,N,13570,2452*15
+$PTNTHTM,14232,N,169,N,-42,N,13609,2452*1E
+$HCXDR,A,169,D,PITCH,A,-42,D,ROLL,G,371,,MAGX,G,2430,,MAGY,G,-8925,,MAGZ*47
+$PTNTHTM,14134,N,165,N,-42,N,13570,2452*1A
+$PTNTHTM,14225,N,165,N,-43,N,13632,2452*1D
+$PTNTHTM,14042,N,169,N,-43,N,13588,2451*13
+$PTNTHTM,14222,N,170,N,-45,N,13646,2451*18
+$PTNTHTM,14174,N,170,N,-45,N,13640,2450*1F
+$HCXDR,A,170,D,PITCH,A,-42,D,ROLL,G,341,,MAGX,G,2404,,MAGY,G,-8961,,MAGZ*4B
+$PTNTHTM,14264,N,170,N,-42,N,13636,2449*13
+$PTNTHTM,14132,N,171,N,-42,N,13604,2448*12
+$PTNTHTM,14265,N,171,N,-38,N,13629,2448*11
+$PTNTHTM,14145,N,171,N,-38,N,13612,2447*17
+$PTNTHTM,14198,N,172,N,-38,N,13614,2447*12
+$HCXDR,A,172,D,PITCH,A,-34,D,ROLL,G,327,,MAGX,G,2389,,MAGY,G,-8997,,MAGZ*43
+$PTNTHTM,14184,N,172,N,-35,N,13612,2446*15
+$PTNTHTM,14187,N,174,N,-35,N,13589,2447*10
+$PTNTHTM,14257,N,174,N,-35,N,13603,2447*1F
+$PTNTHTM,14161,N,178,N,-37,N,13575,2448*1A
+$PTNTHTM,14302,N,177,N,-40,N,13608,2448*1B
+$HCXDR,A,176,D,PITCH,A,-40,D,ROLL,G,388,,MAGX,G,2468,,MAGY,G,-9006,,MAGZ*49
diff --git a/test/daemon/tnt-revolution.log.chk b/test/daemon/tnt-revolution.log.chk
new file mode 100644
index 00000000..5f0c15fb
--- /dev/null
+++ b/test/daemon/tnt-revolution.log.chk
@@ -0,0 +1,100 @@
+$PTNTHTM,14223,N,169,N,-43,N,13641,2454*15
+{"class":"ATT","tag":"PTNTHTM","heading":14223.00,"mag_st":"N","pitch":169.00,"pitch_st":"N","roll":-43.00,"roll_st":"N","dip":13641.000,"mag_x":2454.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14091,N,171,N,-43,N,13599,2454*11
+{"class":"ATT","tag":"PTNTHTM","heading":14091.00,"mag_st":"N","pitch":171.00,"pitch_st":"N","roll":-43.00,"roll_st":"N","dip":13599.000,"mag_x":2454.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14287,N,172,N,-39,N,13652,2452*18
+{"class":"ATT","tag":"PTNTHTM","heading":14287.00,"mag_st":"N","pitch":172.00,"pitch_st":"N","roll":-39.00,"roll_st":"N","dip":13652.000,"mag_x":2452.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14150,N,171,N,-40,N,13605,2452*1E
+{"class":"ATT","tag":"PTNTHTM","heading":14150.00,"mag_st":"N","pitch":171.00,"pitch_st":"N","roll":-40.00,"roll_st":"N","dip":13605.000,"mag_x":2452.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14199,N,171,N,-40,N,13614,2452*1B
+{"class":"ATT","tag":"PTNTHTM","heading":14199.00,"mag_st":"N","pitch":171.00,"pitch_st":"N","roll":-40.00,"roll_st":"N","dip":13614.000,"mag_x":2452.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14168,N,171,N,-37,N,13615,2451*17
+{"class":"ATT","tag":"PTNTHTM","heading":14168.00,"mag_st":"N","pitch":171.00,"pitch_st":"N","roll":-37.00,"roll_st":"N","dip":13615.000,"mag_x":2451.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14359,N,172,N,-33,N,13647,2450*16
+{"class":"ATT","tag":"PTNTHTM","heading":14359.00,"mag_st":"N","pitch":172.00,"pitch_st":"N","roll":-33.00,"roll_st":"N","dip":13647.000,"mag_x":2450.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14243,N,172,N,-33,N,13608,2450*17
+{"class":"ATT","tag":"PTNTHTM","heading":14243.00,"mag_st":"N","pitch":172.00,"pitch_st":"N","roll":-33.00,"roll_st":"N","dip":13608.000,"mag_x":2450.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14340,N,176,N,-37,N,13616,2451*1B
+{"class":"ATT","tag":"PTNTHTM","heading":14340.00,"mag_st":"N","pitch":176.00,"pitch_st":"N","roll":-37.00,"roll_st":"N","dip":13616.000,"mag_x":2451.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14230,N,175,N,-37,N,13597,2451*14
+{"class":"ATT","tag":"PTNTHTM","heading":14230.00,"mag_st":"N","pitch":175.00,"pitch_st":"N","roll":-37.00,"roll_st":"N","dip":13597.000,"mag_x":2451.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14224,N,178,N,-42,N,13599,2452*13
+{"class":"ATT","tag":"PTNTHTM","heading":14224.00,"mag_st":"N","pitch":178.00,"pitch_st":"N","roll":-42.00,"roll_st":"N","dip":13599.000,"mag_x":2452.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14156,N,179,N,-42,N,13600,2452*17
+{"class":"ATT","tag":"PTNTHTM","heading":14156.00,"mag_st":"N","pitch":179.00,"pitch_st":"N","roll":-42.00,"roll_st":"N","dip":13600.000,"mag_x":2452.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14157,N,175,N,-42,N,13585,2454*12
+{"class":"ATT","tag":"PTNTHTM","heading":14157.00,"mag_st":"N","pitch":175.00,"pitch_st":"N","roll":-42.00,"roll_st":"N","dip":13585.000,"mag_x":2454.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14159,N,175,N,-42,N,13598,2454*10
+{"class":"ATT","tag":"PTNTHTM","heading":14159.00,"mag_st":"N","pitch":175.00,"pitch_st":"N","roll":-42.00,"roll_st":"N","dip":13598.000,"mag_x":2454.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14159,N,170,N,-40,N,13569,2455*18
+{"class":"ATT","tag":"PTNTHTM","heading":14159.00,"mag_st":"N","pitch":170.00,"pitch_st":"N","roll":-40.00,"roll_st":"N","dip":13569.000,"mag_x":2455.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14199,N,170,N,-40,N,13610,2454*18
+{"class":"ATT","tag":"PTNTHTM","heading":14199.00,"mag_st":"N","pitch":170.00,"pitch_st":"N","roll":-40.00,"roll_st":"N","dip":13610.000,"mag_x":2454.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14094,N,167,N,-40,N,13571,2455*17
+{"class":"ATT","tag":"PTNTHTM","heading":14094.00,"mag_st":"N","pitch":167.00,"pitch_st":"N","roll":-40.00,"roll_st":"N","dip":13571.000,"mag_x":2455.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14185,N,167,N,-43,N,13626,2454*15
+{"class":"ATT","tag":"PTNTHTM","heading":14185.00,"mag_st":"N","pitch":167.00,"pitch_st":"N","roll":-43.00,"roll_st":"N","dip":13626.000,"mag_x":2454.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14043,N,169,N,-42,N,13592,2454*1D
+{"class":"ATT","tag":"PTNTHTM","heading":14043.00,"mag_st":"N","pitch":169.00,"pitch_st":"N","roll":-42.00,"roll_st":"N","dip":13592.000,"mag_x":2454.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14236,N,169,N,-45,N,13644,2453*15
+{"class":"ATT","tag":"PTNTHTM","heading":14236.00,"mag_st":"N","pitch":169.00,"pitch_st":"N","roll":-45.00,"roll_st":"N","dip":13644.000,"mag_x":2453.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14061,N,172,N,-45,N,13599,2452*1D
+{"class":"ATT","tag":"PTNTHTM","heading":14061.00,"mag_st":"N","pitch":172.00,"pitch_st":"N","roll":-45.00,"roll_st":"N","dip":13599.000,"mag_x":2452.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14299,N,171,N,-42,N,13652,2450*1A
+{"class":"ATT","tag":"PTNTHTM","heading":14299.00,"mag_st":"N","pitch":171.00,"pitch_st":"N","roll":-42.00,"roll_st":"N","dip":13652.000,"mag_x":2450.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14149,N,170,N,-43,N,13605,2450*16
+{"class":"ATT","tag":"PTNTHTM","heading":14149.00,"mag_st":"N","pitch":170.00,"pitch_st":"N","roll":-43.00,"roll_st":"N","dip":13605.000,"mag_x":2450.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14243,N,170,N,-39,N,13622,2450*17
+{"class":"ATT","tag":"PTNTHTM","heading":14243.00,"mag_st":"N","pitch":170.00,"pitch_st":"N","roll":-39.00,"roll_st":"N","dip":13622.000,"mag_x":2450.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14155,N,172,N,-35,N,13611,2449*15
+{"class":"ATT","tag":"PTNTHTM","heading":14155.00,"mag_st":"N","pitch":172.00,"pitch_st":"N","roll":-35.00,"roll_st":"N","dip":13611.000,"mag_x":2449.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14330,N,172,N,-32,N,13647,2448*11
+{"class":"ATT","tag":"PTNTHTM","heading":14330.00,"mag_st":"N","pitch":172.00,"pitch_st":"N","roll":-32.00,"roll_st":"N","dip":13647.000,"mag_x":2448.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14239,N,171,N,-33,N,13612,2448*1B
+{"class":"ATT","tag":"PTNTHTM","heading":14239.00,"mag_st":"N","pitch":171.00,"pitch_st":"N","roll":-33.00,"roll_st":"N","dip":13612.000,"mag_x":2448.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14182,N,174,N,-34,N,13581,2449*12
+{"class":"ATT","tag":"PTNTHTM","heading":14182.00,"mag_st":"N","pitch":174.00,"pitch_st":"N","roll":-34.00,"roll_st":"N","dip":13581.000,"mag_x":2449.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14256,N,174,N,-37,N,13602,2449*13
+{"class":"ATT","tag":"PTNTHTM","heading":14256.00,"mag_st":"N","pitch":174.00,"pitch_st":"N","roll":-37.00,"roll_st":"N","dip":13602.000,"mag_x":2449.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14139,N,178,N,-38,N,13568,2450*1D
+{"class":"ATT","tag":"PTNTHTM","heading":14139.00,"mag_st":"N","pitch":178.00,"pitch_st":"N","roll":-38.00,"roll_st":"N","dip":13568.000,"mag_x":2450.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14193,N,177,N,-40,N,13604,2450*14
+{"class":"ATT","tag":"PTNTHTM","heading":14193.00,"mag_st":"N","pitch":177.00,"pitch_st":"N","roll":-40.00,"roll_st":"N","dip":13604.000,"mag_x":2450.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14186,N,174,N,-42,N,13590,2451*1E
+{"class":"ATT","tag":"PTNTHTM","heading":14186.00,"mag_st":"N","pitch":174.00,"pitch_st":"N","roll":-42.00,"roll_st":"N","dip":13590.000,"mag_x":2451.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14174,N,174,N,-40,N,13602,2451*19
+{"class":"ATT","tag":"PTNTHTM","heading":14174.00,"mag_st":"N","pitch":174.00,"pitch_st":"N","roll":-40.00,"roll_st":"N","dip":13602.000,"mag_x":2451.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14094,N,172,N,-40,N,13570,2452*15
+{"class":"ATT","tag":"PTNTHTM","heading":14094.00,"mag_st":"N","pitch":172.00,"pitch_st":"N","roll":-40.00,"roll_st":"N","dip":13570.000,"mag_x":2452.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14232,N,169,N,-42,N,13609,2452*1E
+{"class":"ATT","tag":"PTNTHTM","heading":14232.00,"mag_st":"N","pitch":169.00,"pitch_st":"N","roll":-42.00,"roll_st":"N","dip":13609.000,"mag_x":2452.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14134,N,165,N,-42,N,13570,2452*1A
+{"class":"ATT","tag":"PTNTHTM","heading":14134.00,"mag_st":"N","pitch":165.00,"pitch_st":"N","roll":-42.00,"roll_st":"N","dip":13570.000,"mag_x":2452.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14225,N,165,N,-43,N,13632,2452*1D
+{"class":"ATT","tag":"PTNTHTM","heading":14225.00,"mag_st":"N","pitch":165.00,"pitch_st":"N","roll":-43.00,"roll_st":"N","dip":13632.000,"mag_x":2452.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14042,N,169,N,-43,N,13588,2451*13
+{"class":"ATT","tag":"PTNTHTM","heading":14042.00,"mag_st":"N","pitch":169.00,"pitch_st":"N","roll":-43.00,"roll_st":"N","dip":13588.000,"mag_x":2451.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14222,N,170,N,-45,N,13646,2451*18
+{"class":"ATT","tag":"PTNTHTM","heading":14222.00,"mag_st":"N","pitch":170.00,"pitch_st":"N","roll":-45.00,"roll_st":"N","dip":13646.000,"mag_x":2451.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14174,N,170,N,-45,N,13640,2450*1F
+{"class":"ATT","tag":"PTNTHTM","heading":14174.00,"mag_st":"N","pitch":170.00,"pitch_st":"N","roll":-45.00,"roll_st":"N","dip":13640.000,"mag_x":2450.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14264,N,170,N,-42,N,13636,2449*13
+{"class":"ATT","tag":"PTNTHTM","heading":14264.00,"mag_st":"N","pitch":170.00,"pitch_st":"N","roll":-42.00,"roll_st":"N","dip":13636.000,"mag_x":2449.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14132,N,171,N,-42,N,13604,2448*12
+{"class":"ATT","tag":"PTNTHTM","heading":14132.00,"mag_st":"N","pitch":171.00,"pitch_st":"N","roll":-42.00,"roll_st":"N","dip":13604.000,"mag_x":2448.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14265,N,171,N,-38,N,13629,2448*11
+{"class":"ATT","tag":"PTNTHTM","heading":14265.00,"mag_st":"N","pitch":171.00,"pitch_st":"N","roll":-38.00,"roll_st":"N","dip":13629.000,"mag_x":2448.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14145,N,171,N,-38,N,13612,2447*17
+{"class":"ATT","tag":"PTNTHTM","heading":14145.00,"mag_st":"N","pitch":171.00,"pitch_st":"N","roll":-38.00,"roll_st":"N","dip":13612.000,"mag_x":2447.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14198,N,172,N,-38,N,13614,2447*12
+{"class":"ATT","tag":"PTNTHTM","heading":14198.00,"mag_st":"N","pitch":172.00,"pitch_st":"N","roll":-38.00,"roll_st":"N","dip":13614.000,"mag_x":2447.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14184,N,172,N,-35,N,13612,2446*15
+{"class":"ATT","tag":"PTNTHTM","heading":14184.00,"mag_st":"N","pitch":172.00,"pitch_st":"N","roll":-35.00,"roll_st":"N","dip":13612.000,"mag_x":2446.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14187,N,174,N,-35,N,13589,2447*10
+{"class":"ATT","tag":"PTNTHTM","heading":14187.00,"mag_st":"N","pitch":174.00,"pitch_st":"N","roll":-35.00,"roll_st":"N","dip":13589.000,"mag_x":2447.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14257,N,174,N,-35,N,13603,2447*1F
+{"class":"ATT","tag":"PTNTHTM","heading":14257.00,"mag_st":"N","pitch":174.00,"pitch_st":"N","roll":-35.00,"roll_st":"N","dip":13603.000,"mag_x":2447.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14161,N,178,N,-37,N,13575,2448*1A
+{"class":"ATT","tag":"PTNTHTM","heading":14161.00,"mag_st":"N","pitch":178.00,"pitch_st":"N","roll":-37.00,"roll_st":"N","dip":13575.000,"mag_x":2448.000,"temp":0.000,"depth":0.000}
+$PTNTHTM,14302,N,177,N,-40,N,13608,2448*1B
+{"class":"ATT","tag":"PTNTHTM","heading":14302.00,"mag_st":"N","pitch":177.00,"pitch_st":"N","roll":-40.00,"roll_st":"N","dip":13608.000,"mag_x":2448.000,"temp":0.000,"depth":0.000}
diff --git a/test/daemon/uBlox-aek-4t.log.chk b/test/daemon/uBlox-aek-4t.log.chk
index 0d498618..9fdf2daf 100644
--- a/test/daemon/uBlox-aek-4t.log.chk
+++ b/test/daemon/uBlox-aek-4t.log.chk
@@ -4,67 +4,67 @@ $GPGSA,A,3,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0.0,0.0
{"class":"TPV","tag":"0x0106","time":1198451482.999,"ept":0.005,"lat":20.629282026,"lon":-87.068075525,"alt":75.777,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGSV,2,1,08,15,67,141,32,02,21,089,31,30,21,234,50,05,18,217,40*7C
$GPGSV,2,2,08,12,16,201,41,18,25,255,41,135,33,251,45,06,54,308,24*40
-{"class":"SKY","tag":"0x0130","vdop":2.00,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":32,"used":true},{"PRN":2,"el":21,"az":89,"ss":31,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":40,"used":true},{"PRN":12,"el":16,"az":201,"ss":41,"used":true},{"PRN":18,"el":25,"az":255,"ss":41,"used":true},{"PRN":135,"el":33,"az":251,"ss":45,"used":true},{"PRN":6,"el":54,"az":308,"ss":24,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.69,"ydop":1.52,"vdop":2.00,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":32,"used":true},{"PRN":2,"el":21,"az":89,"ss":31,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":40,"used":true},{"PRN":12,"el":16,"az":201,"ss":41,"used":true},{"PRN":18,"el":25,"az":255,"ss":41,"used":true},{"PRN":135,"el":33,"az":251,"ss":45,"used":true},{"PRN":6,"el":54,"az":308,"ss":24,"used":false}]}
$GPGGA,231124,2037.7569,N,08704.0845,W,2,07,1.67,75.76,M,-13.865,M,,*4D
$GPRMC,231124,A,2037.7569,N,08704.0845,W,0.0000,0.000,231207,,*34
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
-{"class":"TPV","tag":"0x0106","time":1198451484.999,"ept":0.005,"lat":20.629281973,"lon":-87.068075520,"alt":75.764,"epv":11.500,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
+{"class":"TPV","tag":"0x0106","time":1198451484.999,"ept":0.005,"lat":20.629281973,"lon":-87.068075520,"alt":75.764,"epx":2.588,"epy":5.690,"epv":11.500,"track":0.0000,"speed":0.000,"climb":0.000,"eps":11.38,"mode":3}
$GPGSV,2,1,08,15,67,141,32,02,21,089,32,30,21,234,50,05,18,217,40*7F
$GPGSV,2,2,08,12,16,201,41,18,25,255,41,135,33,251,45,06,54,308,25*41
-{"class":"SKY","tag":"0x0130","vdop":1.99,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":32,"used":true},{"PRN":2,"el":21,"az":89,"ss":32,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":40,"used":true},{"PRN":12,"el":16,"az":201,"ss":41,"used":true},{"PRN":18,"el":25,"az":255,"ss":41,"used":true},{"PRN":135,"el":33,"az":251,"ss":45,"used":true},{"PRN":6,"el":54,"az":308,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.63,"ydop":1.19,"vdop":1.99,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":32,"used":true},{"PRN":2,"el":21,"az":89,"ss":32,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":40,"used":true},{"PRN":12,"el":16,"az":201,"ss":41,"used":true},{"PRN":18,"el":25,"az":255,"ss":41,"used":true},{"PRN":135,"el":33,"az":251,"ss":45,"used":true},{"PRN":6,"el":54,"az":308,"ss":25,"used":false}]}
$GPGGA,231125,2037.7569,N,08704.0845,W,2,07,1.67,75.76,M,-13.865,M,,*4C
$GPRMC,231125,A,2037.7569,N,08704.0845,W,0.0000,0.000,231207,,*35
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
-{"class":"TPV","tag":"0x0106","time":1198451485.999,"ept":0.005,"lat":20.629281802,"lon":-87.068075424,"alt":75.757,"epv":11.443,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
+{"class":"TPV","tag":"0x0106","time":1198451485.999,"ept":0.005,"lat":20.629281802,"lon":-87.068075424,"alt":75.757,"epx":2.375,"epy":4.455,"epv":11.443,"track":0.0000,"speed":0.000,"climb":0.000,"eps":10.14,"mode":3}
$GPGSV,2,1,08,15,67,141,33,02,21,089,33,30,21,234,50,05,18,217,40*7F
$GPGSV,2,2,08,12,16,201,41,18,25,255,41,135,33,251,45,06,54,308,24*40
-{"class":"SKY","tag":"0x0130","vdop":1.99,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":33,"used":true},{"PRN":2,"el":21,"az":89,"ss":33,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":40,"used":true},{"PRN":12,"el":16,"az":201,"ss":41,"used":true},{"PRN":18,"el":25,"az":255,"ss":41,"used":true},{"PRN":135,"el":33,"az":251,"ss":45,"used":true},{"PRN":6,"el":54,"az":308,"ss":24,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.63,"ydop":1.19,"vdop":1.99,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":33,"used":true},{"PRN":2,"el":21,"az":89,"ss":33,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":40,"used":true},{"PRN":12,"el":16,"az":201,"ss":41,"used":true},{"PRN":18,"el":25,"az":255,"ss":41,"used":true},{"PRN":135,"el":33,"az":251,"ss":45,"used":true},{"PRN":6,"el":54,"az":308,"ss":24,"used":false}]}
$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,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
-{"class":"TPV","tag":"0x0106","time":1198451486.999,"ept":0.005,"lat":20.629281718,"lon":-87.068075424,"alt":75.754,"epv":11.443,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
+{"class":"TPV","tag":"0x0106","time":1198451486.999,"ept":0.005,"lat":20.629281718,"lon":-87.068075424,"alt":75.754,"epx":2.375,"epy":4.455,"epv":11.443,"track":0.0000,"speed":0.000,"climb":0.000,"eps":8.91,"mode":3}
$GPGSV,2,1,08,15,67,141,32,02,21,089,32,30,21,234,50,05,18,217,40*7F
$GPGSV,2,2,08,12,16,201,42,18,25,255,42,135,33,251,44,06,54,308,24*41
-{"class":"SKY","tag":"0x0130","vdop":2.00,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":32,"used":true},{"PRN":2,"el":21,"az":89,"ss":32,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":40,"used":true},{"PRN":12,"el":16,"az":201,"ss":42,"used":true},{"PRN":18,"el":25,"az":255,"ss":42,"used":true},{"PRN":135,"el":33,"az":251,"ss":44,"used":true},{"PRN":6,"el":54,"az":308,"ss":24,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.63,"ydop":1.19,"vdop":2.00,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":32,"used":true},{"PRN":2,"el":21,"az":89,"ss":32,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":40,"used":true},{"PRN":12,"el":16,"az":201,"ss":42,"used":true},{"PRN":18,"el":25,"az":255,"ss":42,"used":true},{"PRN":135,"el":33,"az":251,"ss":44,"used":true},{"PRN":6,"el":54,"az":308,"ss":24,"used":false}]}
$GPGGA,231127,2037.7569,N,08704.0845,W,2,07,1.67,75.74,M,-13.865,M,,*4C
$GPRMC,231127,A,2037.7569,N,08704.0845,W,0.0000,0.000,231207,,*37
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
-{"class":"TPV","tag":"0x0106","time":1198451487.999,"ept":0.005,"lat":20.629281663,"lon":-87.068075323,"alt":75.741,"epv":11.500,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
+{"class":"TPV","tag":"0x0106","time":1198451487.999,"ept":0.005,"lat":20.629281663,"lon":-87.068075323,"alt":75.741,"epx":2.375,"epy":4.455,"epv":11.500,"track":0.0000,"speed":0.000,"climb":0.000,"eps":8.91,"mode":3}
$GPGSV,2,1,08,15,67,141,31,02,21,089,32,30,21,234,50,05,18,217,39*72
$GPGSV,2,2,08,12,16,201,41,18,25,255,41,135,33,251,45,06,54,308,25*41
-{"class":"SKY","tag":"0x0130","vdop":1.99,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":31,"used":true},{"PRN":2,"el":21,"az":89,"ss":32,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":39,"used":true},{"PRN":12,"el":16,"az":201,"ss":41,"used":true},{"PRN":18,"el":25,"az":255,"ss":41,"used":true},{"PRN":135,"el":33,"az":251,"ss":45,"used":true},{"PRN":6,"el":54,"az":308,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.63,"ydop":1.19,"vdop":1.99,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":31,"used":true},{"PRN":2,"el":21,"az":89,"ss":32,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":39,"used":true},{"PRN":12,"el":16,"az":201,"ss":41,"used":true},{"PRN":18,"el":25,"az":255,"ss":41,"used":true},{"PRN":135,"el":33,"az":251,"ss":45,"used":true},{"PRN":6,"el":54,"az":308,"ss":25,"used":false}]}
$GPGGA,231128,2037.7569,N,08704.0845,W,2,07,1.67,75.73,M,-13.865,M,,*44
$GPRMC,231128,A,2037.7569,N,08704.0845,W,0.0000,0.000,231207,,*38
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
-{"class":"TPV","tag":"0x0106","time":1198451488.999,"ept":0.005,"lat":20.629281494,"lon":-87.068075323,"alt":75.734,"epv":11.443,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
+{"class":"TPV","tag":"0x0106","time":1198451488.999,"ept":0.005,"lat":20.629281494,"lon":-87.068075323,"alt":75.734,"epx":2.375,"epy":4.455,"epv":11.443,"track":0.0000,"speed":0.000,"climb":0.000,"eps":8.91,"mode":3}
$GPGSV,2,1,08,15,67,141,30,02,21,089,31,30,21,234,50,05,18,217,39*70
$GPGSV,2,2,08,12,16,201,41,18,25,255,40,135,33,251,44,06,54,308,25*41
-{"class":"SKY","tag":"0x0130","vdop":1.99,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":30,"used":true},{"PRN":2,"el":21,"az":89,"ss":31,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":39,"used":true},{"PRN":12,"el":16,"az":201,"ss":41,"used":true},{"PRN":18,"el":25,"az":255,"ss":40,"used":true},{"PRN":135,"el":33,"az":251,"ss":44,"used":true},{"PRN":6,"el":54,"az":308,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.63,"ydop":1.19,"vdop":1.99,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":30,"used":true},{"PRN":2,"el":21,"az":89,"ss":31,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":39,"used":true},{"PRN":12,"el":16,"az":201,"ss":41,"used":true},{"PRN":18,"el":25,"az":255,"ss":40,"used":true},{"PRN":135,"el":33,"az":251,"ss":44,"used":true},{"PRN":6,"el":54,"az":308,"ss":25,"used":false}]}
$GPGGA,231129,2037.7569,N,08704.0845,W,2,07,1.67,75.72,M,-13.865,M,,*44
$GPRMC,231129,A,2037.7569,N,08704.0845,W,0.0000,0.000,231207,,*39
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
-{"class":"TPV","tag":"0x0106","time":1198451489.999,"ept":0.005,"lat":20.629281440,"lon":-87.068075223,"alt":75.722,"epv":11.443,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
+{"class":"TPV","tag":"0x0106","time":1198451489.999,"ept":0.005,"lat":20.629281440,"lon":-87.068075223,"alt":75.722,"epx":2.375,"epy":4.455,"epv":11.443,"track":0.0000,"speed":0.000,"climb":0.000,"eps":8.91,"mode":3}
$GPGSV,2,1,08,15,67,141,29,02,21,089,30,30,21,234,50,05,18,217,39*79
$GPGSV,2,2,08,12,16,201,42,18,25,255,40,135,33,251,44,06,54,308,25*42
-{"class":"SKY","tag":"0x0130","vdop":1.99,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":29,"used":true},{"PRN":2,"el":21,"az":89,"ss":30,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":39,"used":true},{"PRN":12,"el":16,"az":201,"ss":42,"used":true},{"PRN":18,"el":25,"az":255,"ss":40,"used":true},{"PRN":135,"el":33,"az":251,"ss":44,"used":true},{"PRN":6,"el":54,"az":308,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.63,"ydop":1.19,"vdop":1.99,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":29,"used":true},{"PRN":2,"el":21,"az":89,"ss":30,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":39,"used":true},{"PRN":12,"el":16,"az":201,"ss":42,"used":true},{"PRN":18,"el":25,"az":255,"ss":40,"used":true},{"PRN":135,"el":33,"az":251,"ss":44,"used":true},{"PRN":6,"el":54,"az":308,"ss":25,"used":false}]}
$GPGGA,231130,2037.7569,N,08704.0845,W,2,07,1.67,75.72,M,-13.865,M,,*4C
$GPRMC,231130,A,2037.7569,N,08704.0845,W,0.0000,0.000,231207,,*31
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
-{"class":"TPV","tag":"0x0106","time":1198451490.999,"ept":0.005,"lat":20.629281354,"lon":-87.068075127,"alt":75.719,"epv":11.443,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
+{"class":"TPV","tag":"0x0106","time":1198451490.999,"ept":0.005,"lat":20.629281354,"lon":-87.068075127,"alt":75.719,"epx":2.375,"epy":4.455,"epv":11.443,"track":0.0000,"speed":0.000,"climb":0.000,"eps":8.91,"mode":3}
$GPGSV,2,1,08,15,67,141,29,02,21,089,29,30,21,234,50,05,18,217,39*71
$GPGSV,2,2,08,12,16,201,42,18,25,255,39,135,33,251,44,06,54,308,25*4C
-{"class":"SKY","tag":"0x0130","vdop":2.00,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":29,"used":true},{"PRN":2,"el":21,"az":89,"ss":29,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":39,"used":true},{"PRN":12,"el":16,"az":201,"ss":42,"used":true},{"PRN":18,"el":25,"az":255,"ss":39,"used":true},{"PRN":135,"el":33,"az":251,"ss":44,"used":true},{"PRN":6,"el":54,"az":308,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.63,"ydop":1.19,"vdop":2.00,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":29,"used":true},{"PRN":2,"el":21,"az":89,"ss":29,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":39,"used":true},{"PRN":12,"el":16,"az":201,"ss":42,"used":true},{"PRN":18,"el":25,"az":255,"ss":39,"used":true},{"PRN":135,"el":33,"az":251,"ss":44,"used":true},{"PRN":6,"el":54,"az":308,"ss":25,"used":false}]}
$GPGGA,231131,2037.7569,N,08704.0845,W,2,07,1.67,75.72,M,-13.865,M,,*4D
$GPRMC,231131,A,2037.7569,N,08704.0845,W,0.0000,0.000,231207,,*30
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
-{"class":"TPV","tag":"0x0106","time":1198451491.999,"ept":0.005,"lat":20.629281269,"lon":-87.068075127,"alt":75.715,"epv":11.500,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
+{"class":"TPV","tag":"0x0106","time":1198451491.999,"ept":0.005,"lat":20.629281269,"lon":-87.068075127,"alt":75.715,"epx":2.375,"epy":4.455,"epv":11.500,"track":0.0000,"speed":0.000,"climb":0.000,"eps":8.91,"mode":3}
$GPGSV,2,1,08,15,67,141,28,02,21,089,29,30,21,234,50,05,18,217,39*70
$GPGSV,2,2,08,12,16,201,42,18,25,255,39,135,33,251,45,06,54,308,25*4D
-{"class":"SKY","tag":"0x0130","vdop":1.99,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":28,"used":true},{"PRN":2,"el":21,"az":89,"ss":29,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":39,"used":true},{"PRN":12,"el":16,"az":201,"ss":42,"used":true},{"PRN":18,"el":25,"az":255,"ss":39,"used":true},{"PRN":135,"el":33,"az":251,"ss":45,"used":true},{"PRN":6,"el":54,"az":308,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.63,"ydop":1.19,"vdop":1.99,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":28,"used":true},{"PRN":2,"el":21,"az":89,"ss":29,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":39,"used":true},{"PRN":12,"el":16,"az":201,"ss":42,"used":true},{"PRN":18,"el":25,"az":255,"ss":39,"used":true},{"PRN":135,"el":33,"az":251,"ss":45,"used":true},{"PRN":6,"el":54,"az":308,"ss":25,"used":false}]}
$GPGGA,231132,2037.7569,N,08704.0845,W,2,07,1.67,75.70,M,-13.865,M,,*4C
$GPRMC,231132,A,2037.7569,N,08704.0845,W,0.0000,0.000,231207,,*33
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
-{"class":"TPV","tag":"0x0106","time":1198451492.999,"ept":0.005,"lat":20.629281215,"lon":-87.068075026,"alt":75.703,"epv":11.443,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,2.6,1.7,2.0*32
+{"class":"TPV","tag":"0x0106","time":1198451492.999,"ept":0.005,"lat":20.629281215,"lon":-87.068075026,"alt":75.703,"epx":2.375,"epy":4.455,"epv":11.443,"track":0.0000,"speed":0.000,"climb":0.000,"eps":8.91,"mode":3}
$GPGSV,2,1,08,15,67,141,27,02,21,089,28,30,21,234,50,05,18,217,39*7E
$GPGSV,2,2,08,12,16,201,42,18,25,255,39,135,33,251,44,06,54,308,26*4F
-{"class":"SKY","tag":"0x0130","vdop":2.00,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":27,"used":true},{"PRN":2,"el":21,"az":89,"ss":28,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":39,"used":true},{"PRN":12,"el":16,"az":201,"ss":42,"used":true},{"PRN":18,"el":25,"az":255,"ss":39,"used":true},{"PRN":135,"el":33,"az":251,"ss":44,"used":true},{"PRN":6,"el":54,"az":308,"ss":26,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.63,"ydop":1.19,"vdop":2.00,"tdop":1.33,"hdop":1.67,"gdop":2.92,"pdop":2.60,"satellites":[{"PRN":15,"el":67,"az":141,"ss":27,"used":true},{"PRN":2,"el":21,"az":89,"ss":28,"used":true},{"PRN":30,"el":21,"az":234,"ss":50,"used":true},{"PRN":5,"el":18,"az":217,"ss":39,"used":true},{"PRN":12,"el":16,"az":201,"ss":42,"used":true},{"PRN":18,"el":25,"az":255,"ss":39,"used":true},{"PRN":135,"el":33,"az":251,"ss":44,"used":true},{"PRN":6,"el":54,"az":308,"ss":26,"used":false}]}
diff --git a/test/daemon/uBlox-lea-4h.log.chk b/test/daemon/uBlox-lea-4h.log.chk
index afd8890a..40386dc1 100644
--- a/test/daemon/uBlox-lea-4h.log.chk
+++ b/test/daemon/uBlox-lea-4h.log.chk
@@ -133,7 +133,7 @@ $GPGGA,031007.00,,,,,0,05,2.22,,,,,,*54
$GPGSA,A,1,28,17,09,04,02,,,,,,,,4.62,2.22,4.05*00
$GPGSV,2,1,06,28,28,095,26,17,64,064,27,09,55,289,37,04,31,150,43*7C
$GPGSV,2,2,06,02,07,178,32,24,40,121,35*73
-{"class":"SKY","tag":"GSV","vdop":4.05,"hdop":2.22,"pdop":4.62,"satellites":[{"PRN":28,"el":28,"az":95,"ss":26,"used":true},{"PRN":17,"el":64,"az":64,"ss":27,"used":true},{"PRN":9,"el":55,"az":289,"ss":37,"used":true},{"PRN":4,"el":31,"az":150,"ss":43,"used":true},{"PRN":2,"el":7,"az":178,"ss":32,"used":true},{"PRN":24,"el":40,"az":121,"ss":35,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.98,"ydop":1.92,"vdop":4.05,"tdop":2.55,"hdop":2.22,"gdop":4.80,"pdop":4.62,"satellites":[{"PRN":28,"el":28,"az":95,"ss":26,"used":true},{"PRN":17,"el":64,"az":64,"ss":27,"used":true},{"PRN":9,"el":55,"az":289,"ss":37,"used":true},{"PRN":4,"el":31,"az":150,"ss":43,"used":true},{"PRN":2,"el":7,"az":178,"ss":32,"used":true},{"PRN":24,"el":40,"az":121,"ss":35,"used":false}]}
$GPGLL,,,,,031007.00,V,N*4F
{"class":"TPV","tag":"GLL","time":1155179407.000,"ept":0.005,"mode":0}
$GPZDA,031007.00,10,08,2006,00,00*6E
@@ -143,9 +143,9 @@ $GPGGA,031008.00,4907.58133,N,12242.60088,W,1,05,2.15,70.7,M,-16.7,M,,*5D
$GPGSA,A,3,28,17,09,04,02,,,,,,,,4.07,2.15,3.45*06
$GPGSV,2,1,06,28,28,095,26,17,64,064,27,09,55,289,36,04,31,150,43*7D
$GPGSV,2,2,06,02,07,178,32,24,40,121,35*73
-{"class":"SKY","tag":"GSV","vdop":3.45,"hdop":2.15,"pdop":4.07,"satellites":[{"PRN":28,"el":28,"az":95,"ss":26,"used":true},{"PRN":17,"el":64,"az":64,"ss":27,"used":true},{"PRN":9,"el":55,"az":289,"ss":36,"used":true},{"PRN":4,"el":31,"az":150,"ss":43,"used":true},{"PRN":2,"el":7,"az":178,"ss":32,"used":true},{"PRN":24,"el":40,"az":121,"ss":35,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.98,"ydop":1.92,"vdop":3.45,"tdop":2.55,"hdop":2.15,"gdop":4.80,"pdop":4.07,"satellites":[{"PRN":28,"el":28,"az":95,"ss":26,"used":true},{"PRN":17,"el":64,"az":64,"ss":27,"used":true},{"PRN":9,"el":55,"az":289,"ss":36,"used":true},{"PRN":4,"el":31,"az":150,"ss":43,"used":true},{"PRN":2,"el":7,"az":178,"ss":32,"used":true},{"PRN":24,"el":40,"az":121,"ss":35,"used":false}]}
$GPGLL,4907.58133,N,12242.60088,W,031008.00,A,A*76
-{"class":"TPV","tag":"GLL","time":1155179408.000,"ept":0.005,"lat":49.126355500,"lon":-122.710014667,"alt":70.700,"epx":14.642,"epy":28.806,"epv":93.150,"track":220.8600,"speed":1.312,"climb":0.000,"mode":3}
+{"class":"TPV","tag":"GLL","time":1155179408.000,"ept":0.005,"lat":49.126355500,"lon":-122.710014667,"alt":70.700,"epx":14.642,"epy":28.806,"epv":93.150,"track":220.8600,"speed":1.312,"climb":0.000,"eps":0.86,"mode":3}
$GPZDA,031008.00,10,08,2006,00,00*61
$GPRMC,031009.00,A,4907.58122,N,12242.60101,W,0.138,220.93,100806,,,A*7F
$GPVTG,220.93,T,,M,0.138,N,0.255,K,A*3F
@@ -153,7 +153,7 @@ $GPGGA,031009.00,4907.58122,N,12242.60101,W,1,05,2.15,70.1,M,-16.7,M,,*5A
$GPGSA,A,3,28,17,09,04,02,,,,,,,,4.06,2.15,3.45*07
$GPGSV,2,1,06,28,28,095,25,17,64,064,27,09,55,289,36,04,31,150,43*7E
$GPGSV,2,2,06,02,07,178,32,24,40,121,35*73
-{"class":"SKY","tag":"GSV","vdop":3.45,"hdop":2.15,"pdop":4.06,"satellites":[{"PRN":28,"el":28,"az":95,"ss":25,"used":true},{"PRN":17,"el":64,"az":64,"ss":27,"used":true},{"PRN":9,"el":55,"az":289,"ss":36,"used":true},{"PRN":4,"el":31,"az":150,"ss":43,"used":true},{"PRN":2,"el":7,"az":178,"ss":32,"used":true},{"PRN":24,"el":40,"az":121,"ss":35,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":0.98,"ydop":1.92,"vdop":3.45,"tdop":2.55,"hdop":2.15,"gdop":4.80,"pdop":4.06,"satellites":[{"PRN":28,"el":28,"az":95,"ss":25,"used":true},{"PRN":17,"el":64,"az":64,"ss":27,"used":true},{"PRN":9,"el":55,"az":289,"ss":36,"used":true},{"PRN":4,"el":31,"az":150,"ss":43,"used":true},{"PRN":2,"el":7,"az":178,"ss":32,"used":true},{"PRN":24,"el":40,"az":121,"ss":35,"used":false}]}
$GPGLL,4907.58122,N,12242.60101,W,031009.00,A,A*77
{"class":"TPV","tag":"GLL","time":1155179409.000,"ept":0.005,"lat":49.126353667,"lon":-122.710016833,"alt":70.100,"epx":14.642,"epy":28.806,"epv":79.350,"track":220.9300,"speed":0.071,"climb":0.000,"eps":57.61,"mode":3}
$GPZDA,031009.00,10,08,2006,00,00*60
@@ -164,7 +164,7 @@ $GPGSA,A,3,28,17,09,04,02,24,26,35,05,,,,2.20,1.13,1.89*03
$GPGSV,3,1,12,28,25,097,26,17,62,063,34,09,56,285,30,04,33,148,43*77
$GPGSV,3,2,12,02,09,178,33,24,42,118,35,51,32,160,46,26,11,222,28*7C
$GPGSV,3,3,12,48,33,194,42,29,07,218,23,35,31,205,42,05,22,288,30*7B
-{"class":"SKY","tag":"GSV","vdop":1.89,"hdop":1.13,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":35,"used":true},{"PRN":51,"el":32,"az":160,"ss":46,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":23,"used":false},{"PRN":35,"el":31,"az":205,"ss":42,"used":true},{"PRN":5,"el":22,"az":288,"ss":30,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.68,"ydop":1.21,"vdop":1.89,"tdop":1.64,"hdop":1.13,"gdop":3.04,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":35,"used":true},{"PRN":51,"el":32,"az":160,"ss":46,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":23,"used":false},{"PRN":35,"el":31,"az":205,"ss":42,"used":true},{"PRN":5,"el":22,"az":288,"ss":30,"used":true}]}
$GPGLL,4907.56801,N,12242.61073,W,031516.00,A,A*7F
{"class":"TPV","tag":"GLL","time":1155179716.000,"ept":0.005,"lat":49.126133500,"lon":-122.710178833,"alt":99.100,"epx":14.642,"epy":28.806,"epv":79.350,"track":39.1400,"speed":0.043,"climb":0.000,"eps":0.19,"mode":3}
$GPZDA,031516.00,10,08,2006,00,00*6B
@@ -175,7 +175,7 @@ $GPGSA,A,3,28,17,09,04,02,24,26,35,05,,,,2.20,1.13,1.89*03
$GPGSV,3,1,12,28,25,097,26,17,62,063,35,09,56,285,30,04,33,148,43*76
$GPGSV,3,2,12,02,09,178,33,24,42,118,35,51,32,160,45,26,11,222,28*7F
$GPGSV,3,3,12,48,33,194,42,29,07,218,23,35,31,205,41,05,22,288,30*78
-{"class":"SKY","tag":"GSV","vdop":1.89,"hdop":1.13,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":35,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":35,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":23,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":30,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.68,"ydop":1.21,"vdop":1.89,"tdop":1.64,"hdop":1.13,"gdop":3.04,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":35,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":35,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":23,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":30,"used":true}]}
$GPGLL,4907.56809,N,12242.61069,W,031517.00,A,A*7D
{"class":"TPV","tag":"GLL","time":1155179717.000,"ept":0.005,"lat":49.126134833,"lon":-122.710178167,"alt":98.800,"epx":10.180,"epy":18.094,"epv":43.470,"track":39.3700,"speed":0.043,"climb":0.000,"eps":46.90,"mode":3}
$GPZDA,031517.00,10,08,2006,00,00*6A
@@ -187,7 +187,7 @@ $GPGSV,4,1,13,28,25,097,26,17,62,063,35,09,56,285,29,04,33,148,43*78
$GPGSV,4,2,13,02,09,178,33,24,42,118,35,51,32,160,46,47,11,246,*75
$GPGSV,4,3,13,26,11,222,28,48,33,194,41,29,07,218,23,35,31,205,41*75
$GPGSV,4,4,13,05,22,288,30*4F
-{"class":"SKY","tag":"GSV","vdop":1.89,"hdop":1.13,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":35,"used":true},{"PRN":9,"el":56,"az":285,"ss":29,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":35,"used":true},{"PRN":51,"el":32,"az":160,"ss":46,"used":false},{"PRN":47,"el":11,"az":246,"ss":0,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":48,"el":33,"az":194,"ss":41,"used":false},{"PRN":29,"el":7,"az":218,"ss":23,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":30,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.63,"ydop":1.24,"vdop":1.89,"tdop":1.47,"hdop":1.13,"gdop":2.91,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":35,"used":true},{"PRN":9,"el":56,"az":285,"ss":29,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":35,"used":true},{"PRN":51,"el":32,"az":160,"ss":46,"used":false},{"PRN":47,"el":11,"az":246,"ss":0,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":48,"el":33,"az":194,"ss":41,"used":false},{"PRN":29,"el":7,"az":218,"ss":23,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":30,"used":true}]}
$GPGLL,4907.56818,N,12242.61064,W,031518.00,A,A*7F
{"class":"TPV","tag":"GLL","time":1155179718.000,"ept":0.005,"lat":49.126136333,"lon":-122.710177333,"alt":98.500,"epx":10.180,"epy":18.094,"epv":43.470,"track":39.5800,"speed":0.043,"climb":0.000,"eps":36.19,"mode":3}
$GPZDA,031518.00,10,08,2006,00,00*65
@@ -199,7 +199,7 @@ $GPGSV,4,1,13,28,25,097,26,17,62,063,35,09,56,285,29,04,33,148,43*78
$GPGSV,4,2,13,02,09,178,33,24,42,118,35,51,32,160,46,47,11,246,*75
$GPGSV,4,3,13,26,11,222,28,48,33,194,42,29,07,218,23,35,31,205,42*75
$GPGSV,4,4,13,05,22,288,31*4E
-{"class":"SKY","tag":"GSV","vdop":1.89,"hdop":1.13,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":35,"used":true},{"PRN":9,"el":56,"az":285,"ss":29,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":35,"used":true},{"PRN":51,"el":32,"az":160,"ss":46,"used":false},{"PRN":47,"el":11,"az":246,"ss":0,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":23,"used":false},{"PRN":35,"el":31,"az":205,"ss":42,"used":true},{"PRN":5,"el":22,"az":288,"ss":31,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.63,"ydop":1.24,"vdop":1.89,"tdop":1.47,"hdop":1.13,"gdop":2.91,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":35,"used":true},{"PRN":9,"el":56,"az":285,"ss":29,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":35,"used":true},{"PRN":51,"el":32,"az":160,"ss":46,"used":false},{"PRN":47,"el":11,"az":246,"ss":0,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":23,"used":false},{"PRN":35,"el":31,"az":205,"ss":42,"used":true},{"PRN":5,"el":22,"az":288,"ss":31,"used":true}]}
$GPGLL,4907.56826,N,12242.61066,W,031519.00,A,A*71
{"class":"TPV","tag":"GLL","time":1155179719.000,"ept":0.005,"lat":49.126137667,"lon":-122.710177667,"alt":98.200,"epx":9.479,"epy":18.633,"epv":43.470,"track":40.0300,"speed":0.043,"climb":0.000,"eps":36.73,"mode":3}
$GPZDA,031519.00,10,08,2006,00,00*64
@@ -211,7 +211,7 @@ $GPGSV,4,1,13,28,25,097,26,17,62,063,35,09,56,285,30,04,33,148,43*70
$GPGSV,4,2,13,02,09,178,33,24,42,118,35,51,32,160,45,47,11,246,*76
$GPGSV,4,3,13,26,11,222,28,48,33,194,42,29,07,218,23,35,31,205,41*76
$GPGSV,4,4,13,05,22,288,31*4E
-{"class":"SKY","tag":"GSV","vdop":1.89,"hdop":1.13,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":35,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":35,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":47,"el":11,"az":246,"ss":0,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":23,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":31,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.63,"ydop":1.24,"vdop":1.89,"tdop":1.47,"hdop":1.13,"gdop":2.91,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":35,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":35,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":47,"el":11,"az":246,"ss":0,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":23,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":31,"used":true}]}
$GPGLL,4907.56836,N,12242.61071,W,031520.00,A,A*7C
{"class":"TPV","tag":"GLL","time":1155179720.000,"ept":0.005,"lat":49.126139333,"lon":-122.710178500,"alt":98.000,"epx":9.479,"epy":18.633,"epv":43.470,"track":39.2400,"speed":0.037,"climb":0.000,"eps":37.27,"mode":3}
$GPZDA,031520.00,10,08,2006,00,00*6E
@@ -223,7 +223,7 @@ $GPGSV,4,1,13,28,25,097,27,17,62,063,35,09,56,285,29,04,33,148,43*79
$GPGSV,4,2,13,02,09,178,33,24,42,118,35,51,32,160,45,47,11,246,*76
$GPGSV,4,3,13,26,11,222,28,48,33,194,42,29,07,218,23,35,31,205,41*76
$GPGSV,4,4,13,05,22,288,31*4E
-{"class":"SKY","tag":"GSV","vdop":1.89,"hdop":1.13,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":35,"used":true},{"PRN":9,"el":56,"az":285,"ss":29,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":35,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":47,"el":11,"az":246,"ss":0,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":23,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":31,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.63,"ydop":1.24,"vdop":1.89,"tdop":1.47,"hdop":1.13,"gdop":2.91,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":35,"used":true},{"PRN":9,"el":56,"az":285,"ss":29,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":35,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":47,"el":11,"az":246,"ss":0,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":23,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":31,"used":true}]}
$GPGLL,4907.56847,N,12242.61076,W,031521.00,A,A*7C
{"class":"TPV","tag":"GLL","time":1155179721.000,"ept":0.005,"lat":49.126141167,"lon":-122.710179333,"alt":97.700,"epx":9.479,"epy":18.633,"epv":43.470,"track":39.8200,"speed":0.045,"climb":0.000,"eps":37.27,"mode":3}
$GPZDA,031521.00,10,08,2006,00,00*6F
@@ -235,7 +235,7 @@ $GPGSV,4,1,13,28,25,097,27,17,62,063,35,09,56,285,29,04,33,148,43*79
$GPGSV,4,2,13,02,09,178,33,24,42,118,35,51,32,160,45,47,11,246,*76
$GPGSV,4,3,13,26,11,222,28,48,33,194,43,29,07,218,22,35,31,205,41*76
$GPGSV,4,4,13,05,22,288,32*4D
-{"class":"SKY","tag":"GSV","vdop":1.89,"hdop":1.13,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":35,"used":true},{"PRN":9,"el":56,"az":285,"ss":29,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":35,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":47,"el":11,"az":246,"ss":0,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":48,"el":33,"az":194,"ss":43,"used":false},{"PRN":29,"el":7,"az":218,"ss":22,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.63,"ydop":1.24,"vdop":1.89,"tdop":1.47,"hdop":1.13,"gdop":2.91,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":35,"used":true},{"PRN":9,"el":56,"az":285,"ss":29,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":35,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":47,"el":11,"az":246,"ss":0,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":48,"el":33,"az":194,"ss":43,"used":false},{"PRN":29,"el":7,"az":218,"ss":22,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
$GPGLL,4907.56858,N,12242.61089,W,031522.00,A,A*71
{"class":"TPV","tag":"GLL","time":1155179722.000,"ept":0.005,"lat":49.126143000,"lon":-122.710181500,"alt":97.400,"epx":9.479,"epy":18.633,"epv":43.470,"track":38.9100,"speed":0.038,"climb":0.000,"eps":37.27,"mode":3}
$GPZDA,031522.00,10,08,2006,00,00*6C
@@ -246,7 +246,7 @@ $GPGSA,A,3,28,17,09,04,02,24,26,35,05,,,,2.20,1.13,1.89*03
$GPGSV,3,1,12,28,25,097,27,17,62,063,34,09,56,285,30,04,33,148,43*76
$GPGSV,3,2,12,02,09,178,34,24,42,118,36,51,32,160,46,26,11,222,28*78
$GPGSV,3,3,12,48,33,194,43,29,07,218,21,35,31,205,42,05,22,288,32*7A
-{"class":"SKY","tag":"GSV","vdop":1.89,"hdop":1.13,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":34,"used":true},{"PRN":24,"el":42,"az":118,"ss":36,"used":true},{"PRN":51,"el":32,"az":160,"ss":46,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":48,"el":33,"az":194,"ss":43,"used":false},{"PRN":29,"el":7,"az":218,"ss":21,"used":false},{"PRN":35,"el":31,"az":205,"ss":42,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.68,"ydop":1.21,"vdop":1.89,"tdop":1.64,"hdop":1.13,"gdop":3.04,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":34,"used":true},{"PRN":24,"el":42,"az":118,"ss":36,"used":true},{"PRN":51,"el":32,"az":160,"ss":46,"used":false},{"PRN":26,"el":11,"az":222,"ss":28,"used":true},{"PRN":48,"el":33,"az":194,"ss":43,"used":false},{"PRN":29,"el":7,"az":218,"ss":21,"used":false},{"PRN":35,"el":31,"az":205,"ss":42,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
$GPGLL,4907.56865,N,12242.61104,W,031523.00,A,A*7A
{"class":"TPV","tag":"GLL","time":1155179723.000,"ept":0.005,"lat":49.126144167,"lon":-122.710184000,"alt":97.300,"epx":9.479,"epy":18.633,"epv":43.470,"track":40.0100,"speed":0.053,"climb":0.000,"eps":37.27,"mode":3}
$GPZDA,031523.00,10,08,2006,00,00*6D
@@ -257,7 +257,7 @@ $GPGSA,A,3,28,17,09,04,02,24,26,35,05,,,,2.20,1.13,1.89*03
$GPGSV,3,1,12,28,25,097,26,17,62,063,34,09,56,285,30,04,33,148,43*77
$GPGSV,3,2,12,02,09,178,33,24,42,118,36,51,32,160,46,26,11,222,27*70
$GPGSV,3,3,12,48,33,194,42,29,07,218,20,35,31,205,42,05,22,288,32*7A
-{"class":"SKY","tag":"GSV","vdop":1.89,"hdop":1.13,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":36,"used":true},{"PRN":51,"el":32,"az":160,"ss":46,"used":false},{"PRN":26,"el":11,"az":222,"ss":27,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":20,"used":false},{"PRN":35,"el":31,"az":205,"ss":42,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.68,"ydop":1.21,"vdop":1.89,"tdop":1.64,"hdop":1.13,"gdop":3.04,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":36,"used":true},{"PRN":51,"el":32,"az":160,"ss":46,"used":false},{"PRN":26,"el":11,"az":222,"ss":27,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":20,"used":false},{"PRN":35,"el":31,"az":205,"ss":42,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
$GPGLL,4907.56869,N,12242.61118,W,031524.00,A,A*7C
{"class":"TPV","tag":"GLL","time":1155179724.000,"ept":0.005,"lat":49.126144833,"lon":-122.710186333,"alt":97.100,"epx":10.180,"epy":18.094,"epv":43.470,"track":38.2100,"speed":0.041,"climb":0.000,"eps":36.73,"mode":3}
$GPZDA,031524.00,10,08,2006,00,00*6A
@@ -268,7 +268,7 @@ $GPGSA,A,3,28,17,09,04,02,24,26,35,05,,,,2.20,1.13,1.89*03
$GPGSV,3,1,12,28,25,097,26,17,62,063,34,09,56,285,30,04,33,148,43*77
$GPGSV,3,2,12,02,09,178,33,24,42,118,37,51,32,160,46,26,11,222,27*71
$GPGSV,3,3,12,48,33,194,42,29,07,218,17,35,31,205,41,05,22,288,32*7D
-{"class":"SKY","tag":"GSV","vdop":1.89,"hdop":1.13,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":37,"used":true},{"PRN":51,"el":32,"az":160,"ss":46,"used":false},{"PRN":26,"el":11,"az":222,"ss":27,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":17,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.68,"ydop":1.21,"vdop":1.89,"tdop":1.64,"hdop":1.13,"gdop":3.04,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":37,"used":true},{"PRN":51,"el":32,"az":160,"ss":46,"used":false},{"PRN":26,"el":11,"az":222,"ss":27,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":17,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
$GPGLL,4907.56874,N,12242.61134,W,031525.00,A,A*7F
{"class":"TPV","tag":"GLL","time":1155179725.000,"ept":0.005,"lat":49.126145667,"lon":-122.710189000,"alt":97.000,"epx":10.180,"epy":18.094,"epv":43.470,"track":37.4900,"speed":0.028,"climb":0.000,"eps":36.19,"mode":3}
$GPZDA,031525.00,10,08,2006,00,00*6B
@@ -279,7 +279,7 @@ $GPGSA,A,3,28,17,09,04,02,24,26,35,05,,,,2.20,1.13,1.89*03
$GPGSV,3,1,12,28,25,097,26,17,62,063,34,09,56,285,30,04,33,148,43*77
$GPGSV,3,2,12,02,09,178,34,24,42,118,37,51,32,160,45,26,11,222,26*74
$GPGSV,3,3,12,48,33,194,42,29,07,218,18,35,31,205,41,05,22,288,32*72
-{"class":"SKY","tag":"GSV","vdop":1.89,"hdop":1.13,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":34,"used":true},{"PRN":24,"el":42,"az":118,"ss":37,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":26,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":18,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.68,"ydop":1.21,"vdop":1.89,"tdop":1.64,"hdop":1.13,"gdop":3.04,"pdop":2.20,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":34,"used":true},{"PRN":24,"el":42,"az":118,"ss":37,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":26,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":18,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
$GPGLL,4907.56881,N,12242.61152,W,031526.00,A,A*76
{"class":"TPV","tag":"GLL","time":1155179726.000,"ept":0.005,"lat":49.126146833,"lon":-122.710192000,"alt":96.900,"epx":10.180,"epy":18.094,"epv":43.470,"track":36.2300,"speed":0.038,"climb":0.000,"eps":36.19,"mode":3}
$GPZDA,031526.00,10,08,2006,00,00*68
@@ -290,7 +290,7 @@ $GPGSA,A,3,28,17,09,04,02,24,26,35,05,,,,3.72,1.77,3.27*01
$GPGSV,3,1,12,28,25,097,26,17,62,063,34,09,56,285,30,04,33,148,43*77
$GPGSV,3,2,12,02,09,178,34,24,42,118,38,51,32,160,45,26,11,222,26*7B
$GPGSV,3,3,12,48,33,194,42,29,07,218,18,35,31,205,41,05,22,288,32*72
-{"class":"SKY","tag":"GSV","vdop":3.27,"hdop":1.77,"pdop":3.72,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":34,"used":true},{"PRN":24,"el":42,"az":118,"ss":38,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":26,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":18,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.68,"ydop":1.21,"vdop":3.27,"tdop":1.64,"hdop":1.77,"gdop":3.04,"pdop":3.72,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":34,"used":true},{"PRN":24,"el":42,"az":118,"ss":38,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":26,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":18,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
$GPGLL,4907.56880,N,12242.61161,W,031527.00,A,A*76
{"class":"TPV","tag":"GLL","time":1155179727.000,"ept":0.005,"lat":49.126146667,"lon":-122.710193500,"alt":96.900,"epx":10.180,"epy":18.094,"epv":43.470,"track":36.0900,"speed":0.033,"climb":0.000,"eps":36.19,"mode":3}
$GPZDA,031527.00,10,08,2006,00,00*69
@@ -301,7 +301,7 @@ $GPGSA,A,3,28,17,09,04,02,24,26,35,05,,,,3.72,1.77,3.27*01
$GPGSV,3,1,12,28,25,097,26,17,62,063,34,09,56,285,30,04,33,148,43*77
$GPGSV,3,2,12,02,09,178,34,24,42,118,38,51,32,160,45,26,11,222,26*7B
$GPGSV,3,3,12,48,33,194,43,29,07,218,19,35,31,205,41,05,22,288,31*71
-{"class":"SKY","tag":"GSV","vdop":3.27,"hdop":1.77,"pdop":3.72,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":34,"used":true},{"PRN":24,"el":42,"az":118,"ss":38,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":26,"used":true},{"PRN":48,"el":33,"az":194,"ss":43,"used":false},{"PRN":29,"el":7,"az":218,"ss":19,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":31,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.68,"ydop":1.21,"vdop":3.27,"tdop":1.64,"hdop":1.77,"gdop":3.04,"pdop":3.72,"satellites":[{"PRN":28,"el":25,"az":97,"ss":26,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":34,"used":true},{"PRN":24,"el":42,"az":118,"ss":38,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":26,"used":true},{"PRN":48,"el":33,"az":194,"ss":43,"used":false},{"PRN":29,"el":7,"az":218,"ss":19,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":31,"used":true}]}
$GPGLL,4907.56877,N,12242.61171,W,031528.00,A,A*70
{"class":"TPV","tag":"GLL","time":1155179728.000,"ept":0.005,"lat":49.126146167,"lon":-122.710195167,"alt":97.000,"epx":10.180,"epy":18.094,"epv":75.210,"track":35.6600,"speed":0.032,"climb":0.000,"eps":36.19,"mode":3}
$GPZDA,031528.00,10,08,2006,00,00*66
@@ -312,7 +312,7 @@ $GPGSA,A,3,28,17,09,04,02,24,26,35,05,,,,3.72,1.78,3.27*0E
$GPGSV,3,1,12,28,25,097,27,17,62,063,34,09,56,285,30,04,33,148,43*76
$GPGSV,3,2,12,02,09,178,33,24,42,118,38,51,32,160,45,26,11,222,26*7C
$GPGSV,3,3,12,48,33,194,42,29,07,218,19,35,31,205,41,05,22,288,31*70
-{"class":"SKY","tag":"GSV","vdop":3.27,"hdop":1.78,"pdop":3.72,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":38,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":26,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":19,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":31,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.68,"ydop":1.21,"vdop":3.27,"tdop":1.64,"hdop":1.78,"gdop":3.04,"pdop":3.72,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":38,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":26,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":19,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":31,"used":true}]}
$GPGLL,4907.56879,N,12242.61185,W,031529.00,A,A*74
{"class":"TPV","tag":"GLL","time":1155179729.000,"ept":0.005,"lat":49.126146500,"lon":-122.710197500,"alt":96.900,"epx":10.180,"epy":18.094,"epv":75.210,"track":35.6400,"speed":0.034,"climb":0.000,"eps":36.19,"mode":3}
$GPZDA,031529.00,10,08,2006,00,00*67
@@ -323,7 +323,7 @@ $GPGSA,A,3,28,17,09,04,02,24,26,35,05,,,,3.72,1.78,3.27*0E
$GPGSV,3,1,12,28,25,097,27,17,62,063,34,09,56,285,30,04,33,148,43*76
$GPGSV,3,2,12,02,09,178,34,24,42,118,39,51,32,160,45,26,11,222,26*7A
$GPGSV,3,3,12,48,33,194,43,29,07,218,20,35,31,205,41,05,22,288,32*78
-{"class":"SKY","tag":"GSV","vdop":3.27,"hdop":1.78,"pdop":3.72,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":34,"used":true},{"PRN":24,"el":42,"az":118,"ss":39,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":26,"used":true},{"PRN":48,"el":33,"az":194,"ss":43,"used":false},{"PRN":29,"el":7,"az":218,"ss":20,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.68,"ydop":1.21,"vdop":3.27,"tdop":1.64,"hdop":1.78,"gdop":3.04,"pdop":3.72,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":30,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":34,"used":true},{"PRN":24,"el":42,"az":118,"ss":39,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":26,"used":true},{"PRN":48,"el":33,"az":194,"ss":43,"used":false},{"PRN":29,"el":7,"az":218,"ss":20,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
$GPGLL,4907.56881,N,12242.61206,W,031530.00,A,A*73
{"class":"TPV","tag":"GLL","time":1155179730.000,"ept":0.005,"lat":49.126146833,"lon":-122.710201000,"alt":97.000,"epx":10.180,"epy":18.094,"epv":75.210,"track":36.7100,"speed":0.038,"climb":0.000,"eps":36.19,"mode":3}
$GPZDA,031530.00,10,08,2006,00,00*6F
@@ -334,7 +334,7 @@ $GPGSA,A,3,28,17,09,04,02,24,26,35,05,,,,3.73,1.78,3.28*00
$GPGSV,3,1,12,28,25,097,27,17,62,063,34,09,56,285,31,04,33,148,43*77
$GPGSV,3,2,12,02,09,178,33,24,42,118,39,51,32,160,45,26,11,222,26*7D
$GPGSV,3,3,12,48,33,194,42,29,07,218,20,35,31,205,41,05,22,288,33*78
-{"class":"SKY","tag":"GSV","vdop":3.28,"hdop":1.78,"pdop":3.73,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":31,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":39,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":26,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":20,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":33,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.68,"ydop":1.21,"vdop":3.28,"tdop":1.64,"hdop":1.78,"gdop":3.04,"pdop":3.73,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":31,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":39,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":26,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":20,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":33,"used":true}]}
$GPGLL,4907.56898,N,12242.61248,W,031531.00,A,A*70
{"class":"TPV","tag":"GLL","time":1155179731.000,"ept":0.005,"lat":49.126149667,"lon":-122.710208000,"alt":96.700,"epx":10.180,"epy":18.094,"epv":75.210,"track":35.1400,"speed":0.042,"climb":0.000,"eps":36.19,"mode":3}
$GPZDA,031531.00,10,08,2006,00,00*6E
@@ -345,7 +345,7 @@ $GPGSA,A,3,28,17,09,04,02,24,26,35,05,,,,3.73,1.78,3.28*00
$GPGSV,3,1,12,28,25,097,27,17,62,063,34,09,56,285,31,04,33,148,43*77
$GPGSV,3,2,12,02,09,178,33,24,42,118,39,51,32,160,45,26,11,222,25*7E
$GPGSV,3,3,12,48,33,194,42,29,07,218,20,35,31,205,41,05,22,288,33*78
-{"class":"SKY","tag":"GSV","vdop":3.28,"hdop":1.78,"pdop":3.73,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":31,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":39,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":25,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":20,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":33,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.68,"ydop":1.21,"vdop":3.28,"tdop":1.64,"hdop":1.78,"gdop":3.04,"pdop":3.73,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":31,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":33,"used":true},{"PRN":24,"el":42,"az":118,"ss":39,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":26,"el":11,"az":222,"ss":25,"used":true},{"PRN":48,"el":33,"az":194,"ss":42,"used":false},{"PRN":29,"el":7,"az":218,"ss":20,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":33,"used":true}]}
$GPGLL,4907.56911,N,12242.61285,W,031532.00,A,A*72
{"class":"TPV","tag":"GLL","time":1155179732.000,"ept":0.005,"lat":49.126151833,"lon":-122.710214167,"alt":96.500,"epx":10.180,"epy":18.094,"epv":75.440,"track":33.1900,"speed":0.034,"climb":0.000,"eps":36.19,"mode":3}
$GPZDA,031532.00,10,08,2006,00,00*6D
@@ -357,7 +357,7 @@ $GPGSV,4,1,13,28,25,097,27,17,62,063,34,09,56,285,31,04,33,148,43*71
$GPGSV,4,2,13,02,09,178,34,24,42,118,39,51,32,160,45,11,04,035,*7C
$GPGSV,4,3,13,26,11,222,25,48,33,194,43,29,07,218,21,35,31,205,41*78
$GPGSV,4,4,13,05,22,288,32*4D
-{"class":"SKY","tag":"GSV","vdop":3.28,"hdop":1.78,"pdop":3.73,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":31,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":34,"used":true},{"PRN":24,"el":42,"az":118,"ss":39,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":11,"el":4,"az":35,"ss":0,"used":false},{"PRN":26,"el":11,"az":222,"ss":25,"used":true},{"PRN":48,"el":33,"az":194,"ss":43,"used":false},{"PRN":29,"el":7,"az":218,"ss":21,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.69,"ydop":0.62,"vdop":3.28,"tdop":0.74,"hdop":1.78,"gdop":1.70,"pdop":3.73,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":34,"used":true},{"PRN":9,"el":56,"az":285,"ss":31,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":34,"used":true},{"PRN":24,"el":42,"az":118,"ss":39,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":11,"el":4,"az":35,"ss":0,"used":false},{"PRN":26,"el":11,"az":222,"ss":25,"used":true},{"PRN":48,"el":33,"az":194,"ss":43,"used":false},{"PRN":29,"el":7,"az":218,"ss":21,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
$GPGLL,4907.56922,N,12242.61319,W,031533.00,A,A*77
{"class":"TPV","tag":"GLL","time":1155179733.000,"ept":0.005,"lat":49.126153667,"lon":-122.710219833,"alt":96.300,"epx":10.180,"epy":18.094,"epv":75.440,"track":31.6300,"speed":0.044,"climb":0.000,"eps":36.19,"mode":3}
$GPZDA,031533.00,10,08,2006,00,00*6C
@@ -369,7 +369,7 @@ $GPGSV,4,1,13,28,25,097,27,17,62,063,33,09,56,285,32,04,33,148,43*75
$GPGSV,4,2,13,02,09,178,34,24,42,118,39,51,32,160,45,11,04,035,*7C
$GPGSV,4,3,13,26,11,222,25,48,33,194,43,29,07,218,21,35,31,205,41*78
$GPGSV,4,4,13,05,22,288,32*4D
-{"class":"SKY","tag":"GSV","vdop":3.28,"hdop":1.78,"pdop":3.73,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":33,"used":true},{"PRN":9,"el":56,"az":285,"ss":32,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":34,"used":true},{"PRN":24,"el":42,"az":118,"ss":39,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":11,"el":4,"az":35,"ss":0,"used":false},{"PRN":26,"el":11,"az":222,"ss":25,"used":true},{"PRN":48,"el":33,"az":194,"ss":43,"used":false},{"PRN":29,"el":7,"az":218,"ss":21,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.69,"ydop":0.62,"vdop":3.28,"tdop":0.74,"hdop":1.78,"gdop":1.70,"pdop":3.73,"satellites":[{"PRN":28,"el":25,"az":97,"ss":27,"used":true},{"PRN":17,"el":62,"az":63,"ss":33,"used":true},{"PRN":9,"el":56,"az":285,"ss":32,"used":true},{"PRN":4,"el":33,"az":148,"ss":43,"used":true},{"PRN":2,"el":9,"az":178,"ss":34,"used":true},{"PRN":24,"el":42,"az":118,"ss":39,"used":true},{"PRN":51,"el":32,"az":160,"ss":45,"used":false},{"PRN":11,"el":4,"az":35,"ss":0,"used":false},{"PRN":26,"el":11,"az":222,"ss":25,"used":true},{"PRN":48,"el":33,"az":194,"ss":43,"used":false},{"PRN":29,"el":7,"az":218,"ss":21,"used":false},{"PRN":35,"el":31,"az":205,"ss":41,"used":true},{"PRN":5,"el":22,"az":288,"ss":32,"used":true}]}
$GPGLL,4907.56930,N,12242.61352,W,031534.00,A,A*7C
{"class":"TPV","tag":"GLL","time":1155179734.000,"ept":0.005,"lat":49.126155000,"lon":-122.710225333,"alt":96.300,"epx":10.339,"epy":9.313,"epv":75.440,"track":31.8000,"speed":0.034,"climb":0.000,"eps":28.43,"mode":3}
$GPZDA,031534.00,10,08,2006,00,00*6B
@@ -380,7 +380,7 @@ $GPGSA,A,3,17,09,04,02,,,,,,,,,7.53,3.84,6.48*0F
$GPGSV,3,1,11,28,25,097,,17,61,062,17,09,57,284,17,04,34,148,16*71
$GPGSV,3,2,11,02,10,178,14,24,42,117,16,05,23,288,,29,06,218,13*72
$GPGSV,3,3,11,26,10,222,,11,03,035,12,51,32,160,*4A
-{"class":"SKY","tag":"GSV","vdop":6.48,"hdop":3.84,"pdop":7.53,"satellites":[{"PRN":28,"el":25,"az":97,"ss":0,"used":false},{"PRN":17,"el":61,"az":62,"ss":17,"used":true},{"PRN":9,"el":57,"az":284,"ss":17,"used":true},{"PRN":4,"el":34,"az":148,"ss":16,"used":true},{"PRN":2,"el":10,"az":178,"ss":14,"used":true},{"PRN":24,"el":42,"az":117,"ss":16,"used":false},{"PRN":5,"el":23,"az":288,"ss":0,"used":false},{"PRN":29,"el":6,"az":218,"ss":13,"used":false},{"PRN":26,"el":10,"az":222,"ss":0,"used":false},{"PRN":11,"el":3,"az":35,"ss":12,"used":false},{"PRN":51,"el":32,"az":160,"ss":0,"used":false}]}
+{"class":"SKY","tag":"GSV","xdop":1.40,"ydop":1.85,"vdop":6.48,"tdop":3.66,"hdop":3.84,"gdop":6.41,"pdop":7.53,"satellites":[{"PRN":28,"el":25,"az":97,"ss":0,"used":false},{"PRN":17,"el":61,"az":62,"ss":17,"used":true},{"PRN":9,"el":57,"az":284,"ss":17,"used":true},{"PRN":4,"el":34,"az":148,"ss":16,"used":true},{"PRN":2,"el":10,"az":178,"ss":14,"used":true},{"PRN":24,"el":42,"az":117,"ss":16,"used":false},{"PRN":5,"el":23,"az":288,"ss":0,"used":false},{"PRN":29,"el":6,"az":218,"ss":13,"used":false},{"PRN":26,"el":10,"az":222,"ss":0,"used":false},{"PRN":11,"el":3,"az":35,"ss":12,"used":false},{"PRN":51,"el":32,"az":160,"ss":0,"used":false}]}
$GPGLL,4907.57916,N,12242.60479,W,031657.00,A,A*70
{"class":"TPV","tag":"GLL","time":1155179817.000,"ept":0.005,"lat":49.126319333,"lon":-122.710079833,"alt":72.800,"epx":10.339,"epy":9.313,"epv":75.440,"track":74.3400,"speed":2.334,"climb":0.000,"eps":0.25,"mode":3}
$GPZDA,031657.00,10,08,2006,00,00*6D
diff --git a/test/daemon/uBlox-lea-4s.log.chk b/test/daemon/uBlox-lea-4s.log.chk
index 2dc9f46a..6fa7ac8e 100644
--- a/test/daemon/uBlox-lea-4s.log.chk
+++ b/test/daemon/uBlox-lea-4s.log.chk
@@ -9,7 +9,7 @@ $GPGSA,A,3,19,11,25,14,01,31,22,,,,,,1.99,1.24,1.55*0C
$GPGSV,3,1,10,19,62,212,26,11,40,306,25,03,35,184,,20,16,253,*7C
$GPGSV,3,2,10,28,05,310,,25,06,146,43,14,54,071,44,01,53,162,44*71
$GPGSV,3,3,10,31,05,137,41,22,28,055,35*73
-{"class":"SKY","tag":"GSV","vdop":1.55,"hdop":1.24,"pdop":1.99,"satellites":[{"PRN":19,"el":62,"az":212,"ss":26,"used":true},{"PRN":11,"el":40,"az":306,"ss":25,"used":true},{"PRN":3,"el":35,"az":184,"ss":0,"used":false},{"PRN":20,"el":16,"az":253,"ss":0,"used":false},{"PRN":28,"el":5,"az":310,"ss":0,"used":false},{"PRN":25,"el":6,"az":146,"ss":43,"used":true},{"PRN":14,"el":54,"az":71,"ss":44,"used":true},{"PRN":1,"el":53,"az":162,"ss":44,"used":true},{"PRN":31,"el":5,"az":137,"ss":41,"used":true},{"PRN":22,"el":28,"az":55,"ss":35,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.78,"ydop":0.78,"vdop":1.55,"tdop":0.81,"hdop":1.24,"gdop":1.88,"pdop":1.99,"satellites":[{"PRN":19,"el":62,"az":212,"ss":26,"used":true},{"PRN":11,"el":40,"az":306,"ss":25,"used":true},{"PRN":3,"el":35,"az":184,"ss":0,"used":false},{"PRN":20,"el":16,"az":253,"ss":0,"used":false},{"PRN":28,"el":5,"az":310,"ss":0,"used":false},{"PRN":25,"el":6,"az":146,"ss":43,"used":true},{"PRN":14,"el":54,"az":71,"ss":44,"used":true},{"PRN":1,"el":53,"az":162,"ss":44,"used":true},{"PRN":31,"el":5,"az":137,"ss":41,"used":true},{"PRN":22,"el":28,"az":55,"ss":35,"used":true}]}
$GPGLL,3825.60966,N,02708.53787,E,175504.00,A,A*6B
{"class":"TPV","tag":"GLL","time":1165859704.000,"ept":0.005,"lat":38.426827667,"lon":27.142297833,"alt":58.100,"epx":11.706,"epy":11.682,"epv":35.650,"track":113.0200,"speed":0.073,"climb":0.000,"mode":3}
$GPZDA,175504.00,11,12,2006,00,00*63
@@ -20,7 +20,7 @@ $GPGSA,A,3,19,11,25,14,01,31,22,,,,,,1.99,1.24,1.55*0C
$GPGSV,3,1,10,19,62,212,26,11,40,306,24,03,35,184,,20,16,253,*7D
$GPGSV,3,2,10,28,05,310,,25,06,146,43,14,54,071,44,01,53,162,44*71
$GPGSV,3,3,10,31,05,137,41,22,28,055,36*70
-{"class":"SKY","tag":"GSV","vdop":1.55,"hdop":1.24,"pdop":1.99,"satellites":[{"PRN":19,"el":62,"az":212,"ss":26,"used":true},{"PRN":11,"el":40,"az":306,"ss":24,"used":true},{"PRN":3,"el":35,"az":184,"ss":0,"used":false},{"PRN":20,"el":16,"az":253,"ss":0,"used":false},{"PRN":28,"el":5,"az":310,"ss":0,"used":false},{"PRN":25,"el":6,"az":146,"ss":43,"used":true},{"PRN":14,"el":54,"az":71,"ss":44,"used":true},{"PRN":1,"el":53,"az":162,"ss":44,"used":true},{"PRN":31,"el":5,"az":137,"ss":41,"used":true},{"PRN":22,"el":28,"az":55,"ss":36,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.78,"ydop":0.78,"vdop":1.55,"tdop":0.81,"hdop":1.24,"gdop":1.88,"pdop":1.99,"satellites":[{"PRN":19,"el":62,"az":212,"ss":26,"used":true},{"PRN":11,"el":40,"az":306,"ss":24,"used":true},{"PRN":3,"el":35,"az":184,"ss":0,"used":false},{"PRN":20,"el":16,"az":253,"ss":0,"used":false},{"PRN":28,"el":5,"az":310,"ss":0,"used":false},{"PRN":25,"el":6,"az":146,"ss":43,"used":true},{"PRN":14,"el":54,"az":71,"ss":44,"used":true},{"PRN":1,"el":53,"az":162,"ss":44,"used":true},{"PRN":31,"el":5,"az":137,"ss":41,"used":true},{"PRN":22,"el":28,"az":55,"ss":36,"used":true}]}
$GPGLL,3825.60968,N,02708.53789,E,175505.00,A,A*6A
{"class":"TPV","tag":"GLL","time":1165859705.000,"ept":0.005,"lat":38.426828000,"lon":27.142298167,"alt":58.100,"epx":11.706,"epy":11.682,"epv":35.650,"track":112.8800,"speed":0.055,"climb":0.000,"eps":23.41,"mode":3}
$GPZDA,175505.00,11,12,2006,00,00*62
@@ -31,6 +31,6 @@ $GPGSA,A,3,19,11,25,14,01,31,22,,,,,,1.99,1.24,1.55*0C
$GPGSV,3,1,10,19,62,212,27,11,40,306,22,03,35,184,,20,16,253,*7A
$GPGSV,3,2,10,28,05,310,,25,06,146,43,14,54,071,44,01,53,162,44*71
$GPGSV,3,3,10,31,05,137,42,22,28,055,36*73
-{"class":"SKY","tag":"GSV","vdop":1.55,"hdop":1.24,"pdop":1.99,"satellites":[{"PRN":19,"el":62,"az":212,"ss":27,"used":true},{"PRN":11,"el":40,"az":306,"ss":22,"used":true},{"PRN":3,"el":35,"az":184,"ss":0,"used":false},{"PRN":20,"el":16,"az":253,"ss":0,"used":false},{"PRN":28,"el":5,"az":310,"ss":0,"used":false},{"PRN":25,"el":6,"az":146,"ss":43,"used":true},{"PRN":14,"el":54,"az":71,"ss":44,"used":true},{"PRN":1,"el":53,"az":162,"ss":44,"used":true},{"PRN":31,"el":5,"az":137,"ss":42,"used":true},{"PRN":22,"el":28,"az":55,"ss":36,"used":true}]}
+{"class":"SKY","tag":"GSV","xdop":0.78,"ydop":0.78,"vdop":1.55,"tdop":0.81,"hdop":1.24,"gdop":1.88,"pdop":1.99,"satellites":[{"PRN":19,"el":62,"az":212,"ss":27,"used":true},{"PRN":11,"el":40,"az":306,"ss":22,"used":true},{"PRN":3,"el":35,"az":184,"ss":0,"used":false},{"PRN":20,"el":16,"az":253,"ss":0,"used":false},{"PRN":28,"el":5,"az":310,"ss":0,"used":false},{"PRN":25,"el":6,"az":146,"ss":43,"used":true},{"PRN":14,"el":54,"az":71,"ss":44,"used":true},{"PRN":1,"el":53,"az":162,"ss":44,"used":true},{"PRN":31,"el":5,"az":137,"ss":42,"used":true},{"PRN":22,"el":28,"az":55,"ss":36,"used":true}]}
$GPGLL,3825.60969,N,02708.53794,E,175506.00,A,A*64
{"class":"TPV","tag":"GLL","time":1165859706.000,"ept":0.005,"lat":38.426828167,"lon":27.142299000,"alt":58.200,"epx":11.706,"epy":11.682,"epv":35.650,"track":112.9300,"speed":0.038,"climb":0.000,"eps":23.41,"mode":3}
diff --git a/test/daemon/uBlox-lea-4t.log.chk b/test/daemon/uBlox-lea-4t.log.chk
index ea45fccb..1bbb1a6f 100644
--- a/test/daemon/uBlox-lea-4t.log.chk
+++ b/test/daemon/uBlox-lea-4t.log.chk
@@ -5,199 +5,221 @@ $GPGSA,A,3,00,00,00,00,00,00,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0.0,0.0
$GPGSV,3,1,11,21,73,276,33,24,56,094,46,15,40,113,30,18,40,217,43*7B
$GPGSV,3,2,11,26,40,087,45,29,40,164,34,16,28,280,33,10,21,056,38*70
$GPGSV,3,3,11,22,09,225,29,27,06,055,24,07,05,000,25*4E
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.40,"hdop":1.15,"gdop":2.80,"pdop":2.42,"satellites":[{"PRN":21,"el":73,"az":276,"ss":33,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":30,"used":true},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":34,"used":true},{"PRN":16,"el":28,"az":280,"ss":33,"used":true},{"PRN":10,"el":21,"az":56,"ss":38,"used":true},{"PRN":22,"el":9,"az":225,"ss":29,"used":false},{"PRN":27,"el":6,"az":55,"ss":24,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.60,"ydop":0.98,"vdop":2.13,"tdop":1.40,"hdop":1.15,"gdop":2.80,"pdop":2.42,"satellites":[{"PRN":21,"el":73,"az":276,"ss":33,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":30,"used":true},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":34,"used":true},{"PRN":16,"el":28,"az":280,"ss":33,"used":true},{"PRN":10,"el":21,"az":56,"ss":38,"used":true},{"PRN":22,"el":9,"az":225,"ss":29,"used":false},{"PRN":27,"el":6,"az":55,"ss":24,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
$GPGGA,203544,5333.7952,N,11326.3727,W,1,08,1.15,655.35,M,-19.872,M,,*78
$GPRMC,203544,A,5333.7952,N,11326.3727,W,0.0000,0.000,280109,,*30
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,2.4,1.1,2.1*37
-{"class":"TPV","tag":"0x0106","time":1233174944.001,"ept":0.005,"lat":53.563254093,"lon":-113.439545157,"alt":655.348,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.4,1.1,2.1*37
+$GPGBS,203544,9.05,M,14.66,M,48.99,M*3F
+{"class":"TPV","tag":"0x0106","time":1233174944.001,"ept":0.005,"lat":53.563254093,"lon":-113.439545157,"alt":655.348,"epx":9.054,"epy":14.659,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":29.32,"mode":3}
$GPGSV,3,1,11,21,73,276,32,24,56,094,46,15,40,113,30,18,40,217,43*7A
$GPGSV,3,2,11,26,40,087,45,29,40,164,34,16,28,280,33,10,21,056,39*71
$GPGSV,3,3,11,22,09,225,29,27,06,055,24,07,05,000,26*4D
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.40,"hdop":1.15,"gdop":2.80,"pdop":2.42,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":30,"used":true},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":34,"used":true},{"PRN":16,"el":28,"az":280,"ss":33,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":22,"el":9,"az":225,"ss":29,"used":false},{"PRN":27,"el":6,"az":55,"ss":24,"used":false},{"PRN":7,"el":5,"az":0,"ss":26,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.60,"ydop":0.98,"vdop":2.13,"tdop":1.40,"hdop":1.15,"gdop":2.80,"pdop":2.42,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":30,"used":true},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":34,"used":true},{"PRN":16,"el":28,"az":280,"ss":33,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":22,"el":9,"az":225,"ss":29,"used":false},{"PRN":27,"el":6,"az":55,"ss":24,"used":false},{"PRN":7,"el":5,"az":0,"ss":26,"used":false}]}
$GPGGA,203545,5333.7951,N,11326.3728,W,1,08,1.15,655.25,M,-19.872,M,,*74
$GPRMC,203545,A,5333.7951,N,11326.3728,W,0.0000,0.000,280109,,*3D
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,,2.4,1.1,2.1*37
-{"class":"TPV","tag":"0x0106","time":1233174945.001,"ept":0.005,"lat":53.563252365,"lon":-113.439546320,"alt":655.254,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.4,1.1,2.1*37
+$GPGBS,203545,9.05,M,14.66,M,48.99,M*3E
+{"class":"TPV","tag":"0x0106","time":1233174945.001,"ept":0.005,"lat":53.563252365,"lon":-113.439546320,"alt":655.254,"epx":9.054,"epy":14.659,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":29.32,"mode":3}
$GPGSV,3,1,11,21,73,276,32,24,56,094,46,15,40,113,31,18,40,217,43*7B
$GPGSV,3,2,11,26,40,087,45,29,40,164,34,16,28,280,32,10,21,056,39*70
$GPGSV,3,3,11,22,09,225,29,27,06,055,24,07,05,000,25*4E
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.40,"hdop":1.15,"gdop":2.80,"pdop":2.42,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":31,"used":true},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":34,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":22,"el":9,"az":225,"ss":29,"used":false},{"PRN":27,"el":6,"az":55,"ss":24,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.60,"ydop":0.98,"vdop":2.13,"tdop":1.40,"hdop":1.15,"gdop":2.80,"pdop":2.42,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":31,"used":true},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":34,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":22,"el":9,"az":225,"ss":29,"used":false},{"PRN":27,"el":6,"az":55,"ss":24,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
$GPGGA,203546,5333.7950,N,11326.3728,W,1,07,1.15,655.18,M,-19.872,M,,*77
$GPRMC,203546,A,5333.7950,N,11326.3728,W,0.0000,0.000,280109,,*3F
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.4,1.1,2.1*37
-{"class":"TPV","tag":"0x0106","time":1233174946.001,"ept":0.005,"lat":53.563250640,"lon":-113.439547224,"alt":655.184,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,2.4,1.1,2.1*37
+{"class":"TPV","tag":"0x0106","time":1233174946.001,"ept":0.005,"lat":53.563250640,"lon":-113.439547224,"alt":655.184,"epx":9.054,"epy":14.659,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":29.32,"mode":3}
$GPGSV,3,1,11,21,73,276,33,24,56,094,46,15,40,113,30,18,40,217,43*7B
$GPGSV,3,2,11,26,40,087,45,29,40,164,34,16,28,280,32,10,21,056,39*70
$GPGSV,3,3,11,22,09,225,30,27,06,055,24,07,05,000,25*46
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":33,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":30,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":34,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":24,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":33,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":30,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":34,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":24,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
$GPGGA,203547,5333.7949,N,11326.3729,W,1,07,1.21,655.14,M,-19.872,M,,*74
$GPRMC,203547,A,5333.7949,N,11326.3729,W,0.0000,0.000,280109,,*37
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174947.001,"ept":0.005,"lat":53.563249046,"lon":-113.439548267,"alt":655.141,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203547,9.91,M,17.83,M,48.99,M*39
+{"class":"TPV","tag":"0x0106","time":1233174947.001,"ept":0.005,"lat":53.563249046,"lon":-113.439548267,"alt":655.141,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":32.49,"mode":3}
$GPGSV,3,1,11,21,73,276,33,24,56,094,46,15,40,113,29,18,40,217,43*73
$GPGSV,3,2,11,26,40,087,45,29,40,164,33,16,28,280,32,10,21,056,39*77
$GPGSV,3,3,11,22,09,225,30,27,06,055,25,07,05,000,25*47
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":33,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":29,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":25,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":33,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":29,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":25,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
$GPGGA,203548,5333.7948,N,11326.3730,W,1,07,1.21,655.09,M,-19.872,M,,*7E
$GPRMC,203548,A,5333.7948,N,11326.3730,W,0.0000,0.000,280109,,*31
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174948.001,"ept":0.005,"lat":53.563247427,"lon":-113.439549171,"alt":655.088,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203548,9.91,M,17.83,M,48.99,M*36
+{"class":"TPV","tag":"0x0106","time":1233174948.001,"ept":0.005,"lat":53.563247427,"lon":-113.439549171,"alt":655.088,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,3,1,11,21,73,276,32,24,56,094,46,15,40,113,29,18,40,217,43*72
$GPGSV,3,2,11,26,40,087,45,29,40,164,33,16,28,280,32,10,21,056,39*77
$GPGSV,3,3,11,22,09,225,29,27,06,055,24,07,05,000,25*4E
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":29,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":22,"el":9,"az":225,"ss":29,"used":false},{"PRN":27,"el":6,"az":55,"ss":24,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":29,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":22,"el":9,"az":225,"ss":29,"used":false},{"PRN":27,"el":6,"az":55,"ss":24,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
$GPGGA,203549,5333.7947,N,11326.3730,W,1,07,1.21,655.02,M,-19.872,M,,*7B
$GPRMC,203549,A,5333.7947,N,11326.3730,W,0.0000,0.000,280109,,*3F
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174949.001,"ept":0.005,"lat":53.563245784,"lon":-113.439549937,"alt":655.024,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203549,9.91,M,17.83,M,48.99,M*37
+{"class":"TPV","tag":"0x0106","time":1233174949.001,"ept":0.005,"lat":53.563245784,"lon":-113.439549937,"alt":655.024,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,3,1,12,21,73,276,32,24,56,094,46,15,40,113,26,18,40,217,43*7E
$GPGSV,3,2,12,26,40,087,45,29,40,164,33,16,28,280,32,10,21,056,39*74
$GPGSV,3,3,12,03,10,317,25,22,09,225,30,27,06,055,25,07,05,000,25*74
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":26,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":25,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":26,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":25,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
$GPGGA,203550,5333.7947,N,11326.3731,W,1,07,1.21,654.88,M,-19.872,M,,*71
$GPRMC,203550,A,5333.7947,N,11326.3731,W,0.0000,0.000,280109,,*36
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174950.001,"ept":0.005,"lat":53.563244339,"lon":-113.439551123,"alt":654.882,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203550,9.91,M,17.83,M,48.99,M*3F
+{"class":"TPV","tag":"0x0106","time":1233174950.001,"ept":0.005,"lat":53.563244339,"lon":-113.439551123,"alt":654.882,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,3,1,12,21,73,276,31,24,56,094,46,15,40,113,23,18,40,217,43*78
$GPGSV,3,2,12,26,40,087,45,29,40,164,33,16,28,280,31,10,21,056,39*77
$GPGSV,3,3,12,03,10,317,24,22,09,225,30,27,06,055,25,07,05,000,26*76
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":23,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":31,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":3,"el":10,"az":317,"ss":24,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":25,"used":false},{"PRN":7,"el":5,"az":0,"ss":26,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":23,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":31,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":3,"el":10,"az":317,"ss":24,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":25,"used":false},{"PRN":7,"el":5,"az":0,"ss":26,"used":false}]}
$GPGGA,203551,5333.7946,N,11326.3731,W,1,07,1.21,654.80,M,-19.872,M,,*79
$GPRMC,203551,A,5333.7946,N,11326.3731,W,0.0000,0.000,280109,,*36
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174951.001,"ept":0.005,"lat":53.563242857,"lon":-113.439551871,"alt":654.805,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203551,9.91,M,17.83,M,48.99,M*3E
+{"class":"TPV","tag":"0x0106","time":1233174951.001,"ept":0.005,"lat":53.563242857,"lon":-113.439551871,"alt":654.805,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,3,1,12,21,73,276,31,24,56,094,46,15,40,113,25,18,40,217,43*7E
$GPGSV,3,2,12,26,40,087,45,29,40,164,33,16,28,280,32,10,21,056,39*74
$GPGSV,3,3,12,03,10,317,24,22,09,225,30,27,06,055,25,07,05,000,26*76
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":25,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":3,"el":10,"az":317,"ss":24,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":25,"used":false},{"PRN":7,"el":5,"az":0,"ss":26,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":46,"used":true},{"PRN":15,"el":40,"az":113,"ss":25,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":3,"el":10,"az":317,"ss":24,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":25,"used":false},{"PRN":7,"el":5,"az":0,"ss":26,"used":false}]}
$GPGGA,203552,5333.7945,N,11326.3731,W,1,07,1.21,654.84,M,-19.872,M,,*7D
$GPRMC,203552,A,5333.7945,N,11326.3731,W,0.0000,0.000,280109,,*36
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174952.001,"ept":0.005,"lat":53.563241243,"lon":-113.439552276,"alt":654.838,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203552,9.91,M,17.83,M,48.99,M*3D
+{"class":"TPV","tag":"0x0106","time":1233174952.001,"ept":0.005,"lat":53.563241243,"lon":-113.439552276,"alt":654.838,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,3,1,12,21,73,276,31,24,56,094,45,15,40,113,25,18,40,217,43*7D
$GPGSV,3,2,12,26,40,087,45,29,40,164,33,16,28,280,32,10,21,056,39*74
$GPGSV,3,3,12,03,10,317,25,22,09,225,30,27,06,055,25,07,05,000,25*74
-{"class":"SKY","tag":"0x0130","vdop":2.14,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":25,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":25,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.14,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":25,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":25,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
$GPGGA,203553,5333.7944,N,11326.3731,W,1,07,1.21,654.89,M,-19.872,M,,*70
$GPRMC,203553,A,5333.7944,N,11326.3731,W,0.0000,0.000,280109,,*36
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174953.001,"ept":0.005,"lat":53.563239698,"lon":-113.439552484,"alt":654.890,"epv":49.220,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203553,9.91,M,17.83,M,49.22,M*3D
+{"class":"TPV","tag":"0x0106","time":1233174953.001,"ept":0.005,"lat":53.563239698,"lon":-113.439552484,"alt":654.890,"epx":9.910,"epy":17.828,"epv":49.220,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,3,1,12,21,73,276,31,24,56,094,45,15,40,113,25,18,40,217,43*7D
$GPGSV,3,2,12,26,40,087,45,29,40,164,33,16,28,280,32,10,21,056,40*7A
$GPGSV,3,3,12,03,10,317,25,22,09,225,30,27,06,055,24,07,05,000,25*75
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":25,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":24,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":25,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":24,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
$GPGGA,203554,5333.7943,N,11326.3732,W,1,07,1.21,654.98,M,-19.872,M,,*73
$GPRMC,203554,A,5333.7943,N,11326.3732,W,0.0000,0.000,280109,,*35
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174954.001,"ept":0.005,"lat":53.563238309,"lon":-113.439552968,"alt":654.979,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203554,9.91,M,17.83,M,48.99,M*3B
+{"class":"TPV","tag":"0x0106","time":1233174954.001,"ept":0.005,"lat":53.563238309,"lon":-113.439552968,"alt":654.979,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,3,1,12,21,73,276,32,24,56,094,45,15,40,113,24,18,40,217,43*7F
$GPGSV,3,2,12,26,40,087,45,29,40,164,34,16,28,280,32,10,21,056,39*73
$GPGSV,3,3,12,03,10,317,25,22,09,225,30,27,06,055,24,07,05,000,25*75
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":24,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":34,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":24,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":24,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":34,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":24,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
$GPGGA,203555,5333.7942,N,11326.3732,W,1,07,1.21,655.09,M,-19.872,M,,*7A
$GPRMC,203555,A,5333.7942,N,11326.3732,W,0.0000,0.000,280109,,*35
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174955.001,"ept":0.005,"lat":53.563236952,"lon":-113.439553055,"alt":655.091,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203555,9.91,M,17.83,M,48.99,M*3A
+{"class":"TPV","tag":"0x0106","time":1233174955.001,"ept":0.005,"lat":53.563236952,"lon":-113.439553055,"alt":655.091,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,3,1,12,21,73,276,32,24,56,094,45,15,40,113,23,18,40,217,43*78
$GPGSV,3,2,12,26,40,087,45,29,40,164,33,16,28,280,33,10,21,056,39*75
$GPGSV,3,3,12,03,10,317,25,22,09,225,30,27,06,055,27,07,05,000,25*76
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":23,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":33,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":27,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":23,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":33,"used":true},{"PRN":10,"el":21,"az":56,"ss":39,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":27,"el":6,"az":55,"ss":27,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
$GPGGA,203556,5333.7941,N,11326.3732,W,1,07,1.21,655.13,M,-19.872,M,,*71
$GPRMC,203556,A,5333.7941,N,11326.3732,W,0.0000,0.000,280109,,*35
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174956.001,"ept":0.005,"lat":53.563235688,"lon":-113.439553304,"alt":655.133,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203556,9.91,M,17.83,M,48.99,M*39
+{"class":"TPV","tag":"0x0106","time":1233174956.001,"ept":0.005,"lat":53.563235688,"lon":-113.439553304,"alt":655.133,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,4,1,13,21,73,276,31,24,56,094,45,15,40,113,24,18,40,217,43*7A
$GPGSV,4,2,13,26,40,087,45,29,40,164,33,16,28,280,32,06,21,311,21*7C
$GPGSV,4,3,13,10,21,056,40,03,10,317,27,22,09,225,31,27,06,055,27*73
$GPGSV,4,4,13,07,05,000,25*4E
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":24,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":6,"el":21,"az":311,"ss":21,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":27,"used":false},{"PRN":22,"el":9,"az":225,"ss":31,"used":false},{"PRN":27,"el":6,"az":55,"ss":27,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":24,"used":false},{"PRN":18,"el":40,"az":217,"ss":43,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":32,"used":true},{"PRN":6,"el":21,"az":311,"ss":21,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":27,"used":false},{"PRN":22,"el":9,"az":225,"ss":31,"used":false},{"PRN":27,"el":6,"az":55,"ss":27,"used":false},{"PRN":7,"el":5,"az":0,"ss":25,"used":false}]}
$GPGGA,203557,5333.7941,N,11326.3732,W,1,07,1.21,655.18,M,-19.872,M,,*7B
$GPRMC,203557,A,5333.7941,N,11326.3732,W,0.0000,0.000,280109,,*34
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174957.001,"ept":0.005,"lat":53.563234506,"lon":-113.439553414,"alt":655.180,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203557,9.91,M,17.83,M,48.99,M*38
+{"class":"TPV","tag":"0x0106","time":1233174957.001,"ept":0.005,"lat":53.563234506,"lon":-113.439553414,"alt":655.180,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,4,1,14,21,73,276,31,24,56,094,45,15,40,113,24,18,40,217,44*7A
$GPGSV,4,2,14,26,40,087,45,29,40,164,33,16,28,280,33,06,21,311,23*78
$GPGSV,4,3,14,10,21,056,40,03,10,317,27,22,09,225,31,08,06,036,18*70
$GPGSV,4,4,14,27,06,055,27,07,05,000,24*7E
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":24,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":33,"used":true},{"PRN":6,"el":21,"az":311,"ss":23,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":27,"used":false},{"PRN":22,"el":9,"az":225,"ss":31,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":27,"used":false},{"PRN":7,"el":5,"az":0,"ss":24,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":24,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":33,"used":true},{"PRN":6,"el":21,"az":311,"ss":23,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":27,"used":false},{"PRN":22,"el":9,"az":225,"ss":31,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":27,"used":false},{"PRN":7,"el":5,"az":0,"ss":24,"used":false}]}
$GPGGA,203558,5333.7940,N,11326.3732,W,1,07,1.21,655.22,M,-19.872,M,,*7C
$GPRMC,203558,A,5333.7940,N,11326.3732,W,0.0000,0.000,280109,,*3A
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174958.001,"ept":0.005,"lat":53.563233539,"lon":-113.439553506,"alt":655.222,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203558,9.91,M,17.83,M,48.99,M*37
+{"class":"TPV","tag":"0x0106","time":1233174958.001,"ept":0.005,"lat":53.563233539,"lon":-113.439553506,"alt":655.222,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,4,1,14,21,73,276,31,24,56,094,45,15,40,113,24,18,40,217,44*7A
$GPGSV,4,2,14,26,40,087,45,29,40,164,33,16,28,280,33,06,21,311,25*7E
$GPGSV,4,3,14,10,21,056,40,03,10,317,26,22,09,225,31,08,06,036,18*71
$GPGSV,4,4,14,27,06,055,26,07,05,000,24*7F
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.82,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":24,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":33,"used":true},{"PRN":6,"el":21,"az":311,"ss":25,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":26,"used":false},{"PRN":22,"el":9,"az":225,"ss":31,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":26,"used":false},{"PRN":7,"el":5,"az":0,"ss":24,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.82,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":24,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":45,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":33,"used":true},{"PRN":6,"el":21,"az":311,"ss":25,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":26,"used":false},{"PRN":22,"el":9,"az":225,"ss":31,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":26,"used":false},{"PRN":7,"el":5,"az":0,"ss":24,"used":false}]}
$GPGGA,203559,5333.7940,N,11326.3733,W,1,07,1.21,655.22,M,-19.872,M,,*7C
$GPRMC,203559,A,5333.7940,N,11326.3733,W,0.0000,0.000,280109,,*3A
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174959.001,"ept":0.005,"lat":53.563232686,"lon":-113.439554175,"alt":655.218,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203559,9.91,M,17.83,M,48.99,M*36
+{"class":"TPV","tag":"0x0106","time":1233174959.001,"ept":0.005,"lat":53.563232686,"lon":-113.439554175,"alt":655.218,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,4,1,14,21,73,276,31,24,56,094,45,15,40,113,24,18,40,217,44*7A
$GPGSV,4,2,14,26,40,087,44,29,40,164,34,16,28,280,31,06,21,311,25*7A
$GPGSV,4,3,14,10,21,056,40,03,10,317,25,22,09,225,30,08,06,036,15*7E
$GPGSV,4,4,14,27,06,055,27,07,05,000,24*7E
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":24,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":44,"used":true},{"PRN":29,"el":40,"az":164,"ss":34,"used":true},{"PRN":16,"el":28,"az":280,"ss":31,"used":true},{"PRN":6,"el":21,"az":311,"ss":25,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":8,"el":6,"az":36,"ss":15,"used":false},{"PRN":27,"el":6,"az":55,"ss":27,"used":false},{"PRN":7,"el":5,"az":0,"ss":24,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":24,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":44,"used":true},{"PRN":29,"el":40,"az":164,"ss":34,"used":true},{"PRN":16,"el":28,"az":280,"ss":31,"used":true},{"PRN":6,"el":21,"az":311,"ss":25,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":8,"el":6,"az":36,"ss":15,"used":false},{"PRN":27,"el":6,"az":55,"ss":27,"used":false},{"PRN":7,"el":5,"az":0,"ss":24,"used":false}]}
$GPGGA,203600,5333.7939,N,11326.3733,W,1,07,1.21,655.26,M,-19.872,M,,*79
$GPRMC,203600,A,5333.7939,N,11326.3733,W,0.0000,0.000,280109,,*3B
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174960.001,"ept":0.005,"lat":53.563232220,"lon":-113.439554904,"alt":655.256,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203600,9.91,M,17.83,M,48.99,M*39
+{"class":"TPV","tag":"0x0106","time":1233174960.001,"ept":0.005,"lat":53.563232220,"lon":-113.439554904,"alt":655.256,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,4,1,14,21,73,276,32,24,56,094,45,15,40,113,23,18,40,217,44*7E
$GPGSV,4,2,14,26,40,087,44,29,40,164,34,16,28,280,31,06,21,311,25*7A
$GPGSV,4,3,14,10,21,056,40,03,10,317,25,22,09,225,30,08,06,036,18*73
$GPGSV,4,4,14,27,06,055,27,07,05,000,24*7E
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.82,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":23,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":44,"used":true},{"PRN":29,"el":40,"az":164,"ss":34,"used":true},{"PRN":16,"el":28,"az":280,"ss":31,"used":true},{"PRN":6,"el":21,"az":311,"ss":25,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":27,"used":false},{"PRN":7,"el":5,"az":0,"ss":24,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.82,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":23,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":44,"used":true},{"PRN":29,"el":40,"az":164,"ss":34,"used":true},{"PRN":16,"el":28,"az":280,"ss":31,"used":true},{"PRN":6,"el":21,"az":311,"ss":25,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":27,"used":false},{"PRN":7,"el":5,"az":0,"ss":24,"used":false}]}
$GPGGA,203601,5333.7939,N,11326.3733,W,1,06,1.21,655.20,M,-19.872,M,,*7F
$GPRMC,203601,A,5333.7939,N,11326.3733,W,0.0000,0.000,280109,,*3A
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174961.001,"ept":0.005,"lat":53.563231439,"lon":-113.439555338,"alt":655.196,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203601,9.91,M,17.83,M,48.99,M*38
+{"class":"TPV","tag":"0x0106","time":1233174961.001,"ept":0.005,"lat":53.563231439,"lon":-113.439555338,"alt":655.196,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,4,1,14,21,73,276,32,24,56,094,45,15,40,113,24,18,40,217,44*79
$GPGSV,4,2,14,26,40,087,44,29,40,164,34,16,28,280,31,06,21,311,28*77
$GPGSV,4,3,14,10,21,056,40,03,10,317,25,22,09,225,30,08,06,036,18*73
$GPGSV,4,4,14,27,06,055,27,07,05,000,24*7E
-{"class":"SKY","tag":"0x0130","vdop":3.55,"tdop":2.03,"hdop":1.47,"gdop":4.34,"pdop":3.84,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":false},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":24,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":44,"used":true},{"PRN":29,"el":40,"az":164,"ss":34,"used":true},{"PRN":16,"el":28,"az":280,"ss":31,"used":true},{"PRN":6,"el":21,"az":311,"ss":28,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":27,"used":false},{"PRN":7,"el":5,"az":0,"ss":24,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":1.29,"ydop":2.35,"vdop":3.55,"tdop":2.03,"hdop":1.47,"gdop":4.34,"pdop":3.84,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":false},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":24,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":44,"used":true},{"PRN":29,"el":40,"az":164,"ss":34,"used":true},{"PRN":16,"el":28,"az":280,"ss":31,"used":true},{"PRN":6,"el":21,"az":311,"ss":28,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":27,"used":false},{"PRN":7,"el":5,"az":0,"ss":24,"used":false}]}
$GPGGA,203602,5333.7939,N,11326.3734,W,1,07,1.47,655.19,M,-19.872,M,,*70
$GPRMC,203602,A,5333.7939,N,11326.3734,W,0.0000,0.000,280109,,*3E
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,3.8,1.5,3.5*3B
-{"class":"TPV","tag":"0x0106","time":1233174962.001,"ept":0.005,"lat":53.563230854,"lon":-113.439555989,"alt":655.194,"epv":81.650,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,3.8,1.5,3.5*3B
+$GPGBS,203602,19.34,M,35.29,M,81.65,M*03
+{"class":"TPV","tag":"0x0106","time":1233174962.001,"ept":0.005,"lat":53.563230854,"lon":-113.439555989,"alt":655.194,"epx":19.340,"epy":35.289,"epv":81.650,"track":0.0000,"speed":0.000,"climb":0.000,"eps":53.12,"mode":3}
$GPGSV,4,1,14,21,73,276,31,24,56,094,45,15,40,113,24,18,40,217,44*7A
$GPGSV,4,2,14,26,40,087,44,29,40,164,33,16,28,280,31,06,21,311,27*7F
$GPGSV,4,3,14,10,21,056,40,03,10,317,25,22,09,225,30,08,06,036,18*73
$GPGSV,4,4,14,27,06,055,28,07,05,000,21*74
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.82,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":24,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":44,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":31,"used":true},{"PRN":6,"el":21,"az":311,"ss":27,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":28,"used":false},{"PRN":7,"el":5,"az":0,"ss":21,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.82,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":24,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":44,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":31,"used":true},{"PRN":6,"el":21,"az":311,"ss":27,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":28,"used":false},{"PRN":7,"el":5,"az":0,"ss":21,"used":false}]}
$GPGGA,203603,5333.7938,N,11326.3734,W,1,07,1.21,655.18,M,-19.872,M,,*71
$GPRMC,203603,A,5333.7938,N,11326.3734,W,0.0000,0.000,280109,,*3E
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174963.001,"ept":0.005,"lat":53.563230468,"lon":-113.439556819,"alt":655.176,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203603,9.91,M,17.83,M,48.99,M*3A
+{"class":"TPV","tag":"0x0106","time":1233174963.001,"ept":0.005,"lat":53.563230468,"lon":-113.439556819,"alt":655.176,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":53.12,"mode":3}
$GPGSV,4,1,14,21,73,276,31,24,56,094,45,15,40,113,25,18,40,217,44*7B
$GPGSV,4,2,14,26,40,087,44,29,40,164,33,16,28,280,30,06,21,311,27*7E
$GPGSV,4,3,14,10,21,056,40,03,10,317,25,22,09,225,30,08,06,036,18*73
$GPGSV,4,4,14,27,06,055,28,07,05,000,21*74
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":25,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":44,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":30,"used":true},{"PRN":6,"el":21,"az":311,"ss":27,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":28,"used":false},{"PRN":7,"el":5,"az":0,"ss":21,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.83,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":25,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":44,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":30,"used":true},{"PRN":6,"el":21,"az":311,"ss":27,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":28,"used":false},{"PRN":7,"el":5,"az":0,"ss":21,"used":false}]}
$GPGGA,203604,5333.7938,N,11326.3735,W,1,07,1.21,655.23,M,-19.872,M,,*7F
$GPRMC,203604,A,5333.7938,N,11326.3735,W,0.0000,0.000,280109,,*38
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174964.001,"ept":0.005,"lat":53.563230108,"lon":-113.439557548,"alt":655.231,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203604,9.91,M,17.83,M,48.99,M*3D
+{"class":"TPV","tag":"0x0106","time":1233174964.001,"ept":0.005,"lat":53.563230108,"lon":-113.439557548,"alt":655.231,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,4,1,14,21,73,276,32,24,56,094,45,15,40,113,27,18,40,217,44*7A
$GPGSV,4,2,14,26,40,087,44,29,40,164,32,16,28,280,31,06,21,311,27*7E
$GPGSV,4,3,14,10,21,056,40,03,10,317,25,22,09,225,30,08,06,036,18*73
$GPGSV,4,4,14,27,06,055,28,07,05,000,22*77
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.82,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":27,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":44,"used":true},{"PRN":29,"el":40,"az":164,"ss":32,"used":true},{"PRN":16,"el":28,"az":280,"ss":31,"used":true},{"PRN":6,"el":21,"az":311,"ss":27,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":28,"used":false},{"PRN":7,"el":5,"az":0,"ss":22,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.82,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":27,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":44,"used":true},{"PRN":29,"el":40,"az":164,"ss":32,"used":true},{"PRN":16,"el":28,"az":280,"ss":31,"used":true},{"PRN":6,"el":21,"az":311,"ss":27,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":28,"used":false},{"PRN":7,"el":5,"az":0,"ss":22,"used":false}]}
$GPGGA,203605,5333.7938,N,11326.3735,W,1,07,1.21,655.29,M,-19.872,M,,*74
$GPRMC,203605,A,5333.7938,N,11326.3735,W,0.0000,0.000,280109,,*39
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174965.001,"ept":0.005,"lat":53.563229839,"lon":-113.439558476,"alt":655.290,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203605,9.91,M,17.83,M,48.99,M*3C
+{"class":"TPV","tag":"0x0106","time":1233174965.001,"ept":0.005,"lat":53.563229839,"lon":-113.439558476,"alt":655.290,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,4,1,14,21,73,276,32,24,56,094,45,15,40,113,27,18,40,217,44*7A
$GPGSV,4,2,14,26,40,087,44,29,40,164,33,16,28,280,30,06,21,311,28*71
$GPGSV,4,3,14,10,21,056,40,03,10,317,25,22,09,225,30,08,06,036,18*73
$GPGSV,4,4,14,27,06,055,28,07,05,000,23*76
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.82,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":27,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":44,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":30,"used":true},{"PRN":6,"el":21,"az":311,"ss":28,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":28,"used":false},{"PRN":7,"el":5,"az":0,"ss":23,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.82,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":32,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":27,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":44,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":30,"used":true},{"PRN":6,"el":21,"az":311,"ss":28,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":28,"used":false},{"PRN":7,"el":5,"az":0,"ss":23,"used":false}]}
$GPGGA,203606,5333.7938,N,11326.3735,W,1,07,1.21,655.31,M,-19.872,M,,*7E
$GPRMC,203606,A,5333.7938,N,11326.3735,W,0.0000,0.000,280109,,*3A
-$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,,,2.5,1.2,2.1*35
-{"class":"TPV","tag":"0x0106","time":1233174966.001,"ept":0.005,"lat":53.563229443,"lon":-113.439558988,"alt":655.310,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,,,,,,,,,,,,,,2.5,1.2,2.1*35
+$GPGBS,203606,9.91,M,17.83,M,48.99,M*3F
+{"class":"TPV","tag":"0x0106","time":1233174966.001,"ept":0.005,"lat":53.563229443,"lon":-113.439558988,"alt":655.310,"epx":9.910,"epy":17.828,"epv":48.990,"track":0.0000,"speed":0.000,"climb":0.000,"eps":35.66,"mode":3}
$GPGSV,4,1,14,21,73,276,31,24,56,094,45,15,40,113,27,18,40,217,44*79
$GPGSV,4,2,14,26,40,087,44,29,40,164,33,16,28,280,31,06,22,310,27*7D
$GPGSV,4,3,14,10,21,056,40,03,10,317,25,22,09,225,30,08,06,036,18*73
$GPGSV,4,4,14,27,06,055,28,07,05,000,23*76
-{"class":"SKY","tag":"0x0130","vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.82,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":27,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":44,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":31,"used":true},{"PRN":6,"el":22,"az":310,"ss":27,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":28,"used":false},{"PRN":7,"el":5,"az":0,"ss":23,"used":false}]}
+{"class":"SKY","tag":"0x0130","xdop":0.66,"ydop":1.19,"vdop":2.13,"tdop":1.41,"hdop":1.21,"gdop":2.82,"pdop":2.45,"satellites":[{"PRN":21,"el":73,"az":276,"ss":31,"used":true},{"PRN":24,"el":56,"az":94,"ss":45,"used":true},{"PRN":15,"el":40,"az":113,"ss":27,"used":false},{"PRN":18,"el":40,"az":217,"ss":44,"used":true},{"PRN":26,"el":40,"az":87,"ss":44,"used":true},{"PRN":29,"el":40,"az":164,"ss":33,"used":true},{"PRN":16,"el":28,"az":280,"ss":31,"used":true},{"PRN":6,"el":22,"az":310,"ss":27,"used":false},{"PRN":10,"el":21,"az":56,"ss":40,"used":true},{"PRN":3,"el":10,"az":317,"ss":25,"used":false},{"PRN":22,"el":9,"az":225,"ss":30,"used":false},{"PRN":8,"el":6,"az":36,"ss":18,"used":false},{"PRN":27,"el":6,"az":55,"ss":28,"used":false},{"PRN":7,"el":5,"az":0,"ss":23,"used":false}]}
diff --git a/test/daemon/uBlox-sirf1.log.chk b/test/daemon/uBlox-sirf1.log.chk
index a1faec90..02c074cd 100644
--- a/test/daemon/uBlox-sirf1.log.chk
+++ b/test/daemon/uBlox-sirf1.log.chk
@@ -4,9 +4,8 @@ $GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,45,24,43,294,47*77
{"class":"SKY","tag":"MID4","time":1118480771.990,"xdop":0.00,"ydop":0.00,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":46,"used":false},{"PRN":23,"el":22,"az":187,"ss":45,"used":false},{"PRN":20,"el":69,"az":250,"ss":45,"used":false},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":false},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":46,"used":false},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":false},{"PRN":25,"el":18,"az":90,"ss":45,"used":false},{"PRN":24,"el":43,"az":294,"ss":47,"used":false}]}
$GPGGA,090611,5203.7606,N,00508.3161,E,1,08,1.80,33.30,M,46.772,M,,*74
$GPRMC,090611,A,5203.7606,N,00508.3161,E,0.0000,0.000,110605,,*2A
-$GPGSA,A,3,11,23,20,07,01,14,25,24,,,,,2.1,1.8,1.8*30
-$GPGBS,090611,13.82,M,10.61,M,41.03,M*09
-{"class":"TPV","tag":"MID2","time":1118480771.990,"ept":0.005,"lat":52.062675884,"lon":5.138600900,"alt":33.299,"epx":13.815,"epy":10.613,"epv":41.027,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
+$GPGSA,A,3,11,23,20,07,01,14,25,24,,,,,0.0,1.8,0.0*3A
+{"class":"TPV","tag":"MID2","time":1118480771.990,"ept":0.005,"lat":52.062675884,"lon":5.138600900,"alt":33.299,"track":0.0000,"speed":0.000,"climb":0.000,"mode":3}
$GPGGA,090613,5203.7605,N,00508.3168,E,1,08,1.80,34.43,M,46.772,M,,*7F
$GPRMC,090613,A,5203.7605,N,00508.3168,E,0.0447,54.442,110605,,*16
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -14,7 +13,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,46,23,22,187,44,20,69,250,45*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,46*71
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,47*76
-{"class":"SKY","tag":"MID4","time":1118480772.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":46,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":46,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480772.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":46,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":46,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090614,5203.7605,N,00508.3168,E,1,08,1.80,34.44,M,46.772,M,,*7F
$GPRMC,090614,A,5203.7605,N,00508.3168,E,0.0525,55.231,110605,,*17
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -22,7 +21,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,45*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,45,24,43,294,48*78
-{"class":"SKY","tag":"MID4","time":1118480773.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480773.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090615,5203.7605,N,00508.3168,E,1,08,1.80,34.46,M,46.772,M,,*7C
$GPRMC,090615,A,5203.7605,N,00508.3168,E,0.0467,53.664,110605,,*13
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -30,7 +29,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,44,20,69,250,44*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,46,25,18,090,44,24,43,294,48*78
-{"class":"SKY","tag":"MID4","time":1118480774.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480774.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090616,5203.7605,N,00508.3168,E,1,08,1.80,34.47,M,46.772,M,,*7E
$GPRMC,090616,A,5203.7605,N,00508.3168,E,0.0525,57.361,110605,,*13
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -38,7 +37,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,44,20,69,250,45*7D
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,46,25,18,090,45,24,43,294,47*76
-{"class":"SKY","tag":"MID4","time":1118480775.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480775.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090617,5203.7605,N,00508.3168,E,1,08,1.80,34.49,M,46.772,M,,*71
$GPRMC,090617,A,5203.7605,N,00508.3168,E,0.0467,50.658,110605,,*1D
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -46,7 +45,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,44,20,69,250,44*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,46,25,18,090,44,24,43,294,48*78
-{"class":"SKY","tag":"MID4","time":1118480776.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480776.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090618,5203.7605,N,00508.3168,E,1,08,1.80,34.50,M,46.772,M,,*76
$GPRMC,090618,A,5203.7605,N,00508.3168,E,0.0583,58.520,110605,,*1D
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -54,7 +53,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,44,20,69,250,44*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,46,25,18,090,44,24,43,294,47*77
-{"class":"SKY","tag":"MID4","time":1118480777.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480777.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090619,5203.7605,N,00508.3168,E,1,08,1.80,34.53,M,46.772,M,,*74
$GPRMC,090619,A,5203.7605,N,00508.3168,E,0.0525,52.550,110605,,*1D
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -62,7 +61,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,44,20,69,250,44*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,46,25,18,090,45,24,43,294,48*79
-{"class":"SKY","tag":"MID4","time":1118480778.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480778.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090620,5203.7604,N,00508.3168,E,1,08,1.80,34.55,M,46.772,M,,*79
$GPRMC,090620,A,5203.7604,N,00508.3168,E,0.0544,52.048,110605,,*1D
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -70,7 +69,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,44,20,69,250,45*7D
$GPGSV,3,2,12,13,34,231,00,07,35,297,42,02,13,316,00,01,49,069,47*71
$GPGSV,3,3,12,27,46,082,00,14,18,040,46,25,18,090,44,24,43,294,47*77
-{"class":"SKY","tag":"MID4","time":1118480779.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":42,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480779.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":42,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090621,5203.7604,N,00508.3168,E,1,08,1.80,34.56,M,46.772,M,,*7B
$GPRMC,090621,A,5203.7604,N,00508.3168,E,0.0505,57.303,110605,,*10
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -78,7 +77,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,44,20,69,250,44*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,46,25,18,090,44,24,43,294,47*77
-{"class":"SKY","tag":"MID4","time":1118480780.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480780.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090622,5203.7604,N,00508.3168,E,1,08,1.80,34.58,M,46.772,M,,*76
$GPRMC,090622,A,5203.7604,N,00508.3168,E,0.0544,50.157,110605,,*12
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -86,7 +85,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,44,20,69,250,45*7D
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,46,25,18,090,44,24,43,294,48*78
-{"class":"SKY","tag":"MID4","time":1118480781.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480781.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090623,5203.7604,N,00508.3168,E,1,08,1.80,34.60,M,46.772,M,,*7C
$GPRMC,090623,A,5203.7604,N,00508.3168,E,0.0544,53.626,110605,,*11
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -94,7 +93,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,44*7D
$GPGSV,3,2,12,13,34,231,00,07,35,297,42,02,13,316,00,01,49,069,46*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,48*79
-{"class":"SKY","tag":"MID4","time":1118480782.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":42,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":46,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480782.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":42,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":46,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090624,5203.7604,N,00508.3168,E,1,08,1.80,34.61,M,46.772,M,,*7A
$GPRMC,090624,A,5203.7604,N,00508.3168,E,0.0505,52.472,110605,,*11
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -102,7 +101,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,44*7D
$GPGSV,3,2,12,13,34,231,00,07,35,297,42,02,13,316,00,01,49,069,46*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,48*79
-{"class":"SKY","tag":"MID4","time":1118480783.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":42,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":46,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480783.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":42,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":46,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090625,5203.7604,N,00508.3168,E,1,08,1.80,34.63,M,46.772,M,,*79
$GPRMC,090625,A,5203.7604,N,00508.3168,E,0.0544,46.638,110605,,*1C
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -110,7 +109,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,46,20,69,250,44*7E
$GPGSV,3,2,12,13,34,231,00,07,35,297,42,02,13,316,00,01,49,069,47*71
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,48*79
-{"class":"SKY","tag":"MID4","time":1118480784.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":46,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":42,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480784.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":46,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":42,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090626,5203.7604,N,00508.3168,E,1,08,1.80,34.65,M,46.772,M,,*7C
$GPRMC,090626,A,5203.7604,N,00508.3168,E,0.0525,52.472,110605,,*11
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -118,7 +117,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,44*7D
$GPGSV,3,2,12,13,34,231,00,07,35,297,42,02,13,316,00,01,49,069,47*71
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,48*79
-{"class":"SKY","tag":"MID4","time":1118480785.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":42,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480785.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":42,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090627,5203.7604,N,00508.3168,E,1,08,1.80,34.66,M,46.772,M,,*7E
$GPRMC,090627,A,5203.7604,N,00508.3168,E,0.0467,55.803,110605,,*1A
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -126,7 +125,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,44*7D
$GPGSV,3,2,12,13,34,231,00,07,35,297,42,02,13,316,00,01,49,069,47*71
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,48*79
-{"class":"SKY","tag":"MID4","time":1118480786.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":42,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480786.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":42,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090628,5203.7604,N,00508.3168,E,1,08,1.80,34.68,M,46.772,M,,*7F
$GPRMC,090628,A,5203.7604,N,00508.3168,E,0.0544,57.676,110605,,*1B
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -134,7 +133,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,44*7D
$GPGSV,3,2,12,13,34,231,00,07,35,297,42,02,13,316,00,01,49,069,47*71
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,48*79
-{"class":"SKY","tag":"MID4","time":1118480787.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":42,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480787.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":42,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090629,5203.7604,N,00508.3168,E,1,08,1.80,34.69,M,46.772,M,,*7F
$GPRMC,090629,A,5203.7604,N,00508.3168,E,0.0505,47.992,110605,,*1B
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -142,7 +141,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,44*7D
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,47*76
-{"class":"SKY","tag":"MID4","time":1118480788.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480788.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090630,5203.7604,N,00508.3168,E,1,08,1.80,34.71,M,46.772,M,,*7E
$GPRMC,090630,A,5203.7604,N,00508.3168,E,0.0525,54.404,110605,,*11
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -150,7 +149,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,45*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,46,25,18,090,44,24,43,294,47*77
-{"class":"SKY","tag":"MID4","time":1118480789.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480789.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090631,5203.7604,N,00508.3168,E,1,08,1.80,34.73,M,46.772,M,,*7D
$GPRMC,090631,A,5203.7604,N,00508.3168,E,0.0544,57.430,110605,,*13
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -158,7 +157,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,44,20,69,250,44*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,44,02,13,316,00,01,49,069,47*77
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,47*76
-{"class":"SKY","tag":"MID4","time":1118480790.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480790.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":44,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090632,5203.7604,N,00508.3168,E,1,08,1.80,34.75,M,46.772,M,,*78
$GPRMC,090632,A,5203.7604,N,00508.3168,E,0.0505,50.753,110605,,*14
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -166,7 +165,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,44*7D
$GPGSV,3,2,12,13,34,231,00,07,35,297,44,02,13,316,00,01,49,069,47*77
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,47*76
-{"class":"SKY","tag":"MID4","time":1118480791.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480791.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090633,5203.7604,N,00508.3168,E,1,08,1.80,34.77,M,46.772,M,,*7B
$GPRMC,090633,A,5203.7604,N,00508.3168,E,0.0525,55.771,110605,,*12
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -174,7 +173,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,44*7D
$GPGSV,3,2,12,13,34,231,00,07,35,297,44,02,13,316,00,01,49,069,47*77
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,48*79
-{"class":"SKY","tag":"MID4","time":1118480792.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480792.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090634,5203.7604,N,00508.3168,E,1,08,1.80,34.79,M,46.772,M,,*72
$GPRMC,090634,A,5203.7604,N,00508.3168,E,0.0525,56.120,110605,,*14
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -182,7 +181,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,45*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,44,02,13,316,00,01,49,069,47*77
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,48*79
-{"class":"SKY","tag":"MID4","time":1118480793.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480793.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090635,5203.7604,N,00508.3168,E,1,08,1.80,34.81,M,46.772,M,,*74
$GPRMC,090635,A,5203.7604,N,00508.3168,E,0.0505,55.137,110605,,*12
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -190,7 +189,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,45*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,44,02,13,316,00,01,49,069,47*77
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,43,24,43,294,48*7E
-{"class":"SKY","tag":"MID4","time":1118480794.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":43,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480794.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":43,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090636,5203.7604,N,00508.3168,E,1,08,1.80,34.83,M,46.772,M,,*75
$GPRMC,090636,A,5203.7604,N,00508.3168,E,0.0525,56.312,110605,,*15
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -198,7 +197,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,45*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,47*76
-{"class":"SKY","tag":"MID4","time":1118480795.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480795.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090637,5203.7604,N,00508.3168,E,1,08,1.80,34.85,M,46.772,M,,*72
$GPRMC,090637,A,5203.7604,N,00508.3168,E,0.0564,56.963,110605,,*1D
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -206,7 +205,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,45*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,48*79
-{"class":"SKY","tag":"MID4","time":1118480796.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480796.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090638,5203.7604,N,00508.3168,E,1,08,1.80,34.87,M,46.772,M,,*7F
$GPRMC,090638,A,5203.7604,N,00508.3168,E,0.0467,50.169,110605,,*14
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -214,7 +213,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,45*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,48*79
-{"class":"SKY","tag":"MID4","time":1118480797.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480797.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090639,5203.7604,N,00508.3168,E,1,08,1.80,34.89,M,46.772,M,,*70
$GPRMC,090639,A,5203.7604,N,00508.3168,E,0.0583,59.282,110605,,*11
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -222,7 +221,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,44*7D
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,46,25,18,090,45,24,43,294,47*76
-{"class":"SKY","tag":"MID4","time":1118480798.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480798.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090640,5203.7604,N,00508.3168,E,1,08,1.80,34.91,M,46.772,M,,*77
$GPRMC,090640,A,5203.7604,N,00508.3168,E,0.0583,50.788,110605,,*19
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -230,7 +229,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,45*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,45,24,43,294,47*77
-{"class":"SKY","tag":"MID4","time":1118480799.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480799.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090641,5203.7604,N,00508.3168,E,1,08,1.80,34.93,M,46.772,M,,*74
$GPRMC,090641,A,5203.7604,N,00508.3168,E,0.0544,52.764,110605,,*13
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -238,7 +237,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,45*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,44,02,13,316,00,01,49,069,47*77
$GPGSV,3,3,12,27,46,082,00,14,18,040,46,25,18,090,45,24,43,294,47*76
-{"class":"SKY","tag":"MID4","time":1118480800.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480800.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":46,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090642,5203.7604,N,00508.3168,E,1,08,1.80,34.95,M,46.772,M,,*71
$GPRMC,090642,A,5203.7604,N,00508.3168,E,0.0525,53.233,110605,,*11
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -246,7 +245,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,45*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,44,02,13,316,00,01,49,069,46*76
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,45,24,43,294,47*77
-{"class":"SKY","tag":"MID4","time":1118480801.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":46,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480801.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":46,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090643,5203.7604,N,00508.3168,E,1,08,1.80,34.97,M,46.772,M,,*72
$GPRMC,090643,A,5203.7604,N,00508.3168,E,0.0525,57.787,110605,,*1E
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -254,7 +253,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,45*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,45,24,43,294,48*78
-{"class":"SKY","tag":"MID4","time":1118480802.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480802.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":48,"used":true}]}
$GPGGA,090644,5203.7604,N,00508.3168,E,1,08,1.80,34.98,M,46.772,M,,*7A
$GPRMC,090644,A,5203.7604,N,00508.3168,E,0.0544,53.946,110605,,*19
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -262,7 +261,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,45*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,43,02,13,316,00,01,49,069,47*70
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,47*76
-{"class":"SKY","tag":"MID4","time":1118480803.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480803.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":43,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090645,5203.7604,N,00508.3168,E,1,08,1.80,35.00,M,46.772,M,,*7B
$GPRMC,090645,A,5203.7604,N,00508.3168,E,0.0467,53.835,110605,,*1D
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -270,7 +269,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,44*7D
$GPGSV,3,2,12,13,34,231,00,07,35,297,44,02,13,316,00,01,49,069,47*77
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,47*76
-{"class":"SKY","tag":"MID4","time":1118480804.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480804.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":44,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090646,5203.7604,N,00508.3168,E,1,08,1.80,35.02,M,46.772,M,,*7A
$GPRMC,090646,A,5203.7604,N,00508.3168,E,0.0486,56.661,110605,,*1B
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -278,7 +277,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,45*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,44,02,13,316,00,01,49,069,47*77
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,45,24,43,294,47*77
-{"class":"SKY","tag":"MID4","time":1118480805.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480805.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":45,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090647,5203.7604,N,00508.3168,E,1,08,1.80,35.03,M,46.772,M,,*7A
$GPRMC,090647,A,5203.7604,N,00508.3168,E,0.0583,56.423,110605,,*1A
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -286,7 +285,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,63,142,47,23,22,187,45,20,69,250,45*7C
$GPGSV,3,2,12,13,34,231,00,07,35,297,44,02,13,316,00,01,49,069,47*77
$GPGSV,3,3,12,27,46,082,00,14,18,040,47,25,18,090,44,24,43,294,47*76
-{"class":"SKY","tag":"MID4","time":1118480806.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480806.990,"xdop":0.92,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":63,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":250,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":35,"az":297,"ss":44,"used":true},{"PRN":2,"el":13,"az":316,"ss":0,"used":false},{"PRN":1,"el":49,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":82,"ss":0,"used":false},{"PRN":14,"el":18,"az":40,"ss":47,"used":true},{"PRN":25,"el":18,"az":90,"ss":44,"used":true},{"PRN":24,"el":43,"az":294,"ss":47,"used":true}]}
$GPGGA,090648,5203.7604,N,00508.3168,E,1,08,1.80,35.05,M,46.772,M,,*73
$GPRMC,090648,A,5203.7604,N,00508.3168,E,0.0544,53.197,110605,,*11
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -294,7 +293,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,62,142,47,23,22,187,45,20,69,252,45*7F
$GPGSV,3,2,12,13,34,231,00,07,36,297,44,02,14,316,00,01,48,069,47*72
$GPGSV,3,3,12,27,46,081,00,14,17,039,47,25,19,090,44,24,44,294,47*72
-{"class":"SKY","tag":"MID4","time":1118480807.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":62,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":252,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":36,"az":297,"ss":44,"used":true},{"PRN":2,"el":14,"az":316,"ss":0,"used":false},{"PRN":1,"el":48,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":81,"ss":0,"used":false},{"PRN":14,"el":17,"az":39,"ss":47,"used":true},{"PRN":25,"el":19,"az":90,"ss":44,"used":true},{"PRN":24,"el":44,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480807.990,"xdop":0.90,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":62,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":252,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":36,"az":297,"ss":44,"used":true},{"PRN":2,"el":14,"az":316,"ss":0,"used":false},{"PRN":1,"el":48,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":81,"ss":0,"used":false},{"PRN":14,"el":17,"az":39,"ss":47,"used":true},{"PRN":25,"el":19,"az":90,"ss":44,"used":true},{"PRN":24,"el":44,"az":294,"ss":47,"used":true}]}
$GPGGA,090649,5203.7604,N,00508.3168,E,1,08,1.80,35.07,M,46.772,M,,*70
$GPRMC,090649,A,5203.7604,N,00508.3168,E,0.0525,50.564,110605,,*1C
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -302,7 +301,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,62,142,47,23,22,187,45,20,69,252,45*7F
$GPGSV,3,2,12,13,34,231,00,07,36,297,45,02,14,316,00,01,48,069,47*73
$GPGSV,3,3,12,27,46,081,00,14,17,039,47,25,19,090,44,24,44,294,47*72
-{"class":"SKY","tag":"MID4","time":1118480808.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":62,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":252,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":36,"az":297,"ss":45,"used":true},{"PRN":2,"el":14,"az":316,"ss":0,"used":false},{"PRN":1,"el":48,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":81,"ss":0,"used":false},{"PRN":14,"el":17,"az":39,"ss":47,"used":true},{"PRN":25,"el":19,"az":90,"ss":44,"used":true},{"PRN":24,"el":44,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480808.990,"xdop":0.90,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":62,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":252,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":36,"az":297,"ss":45,"used":true},{"PRN":2,"el":14,"az":316,"ss":0,"used":false},{"PRN":1,"el":48,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":81,"ss":0,"used":false},{"PRN":14,"el":17,"az":39,"ss":47,"used":true},{"PRN":25,"el":19,"az":90,"ss":44,"used":true},{"PRN":24,"el":44,"az":294,"ss":47,"used":true}]}
$GPGGA,090650,5203.7604,N,00508.3168,E,1,08,1.80,35.08,M,46.772,M,,*77
$GPRMC,090650,A,5203.7604,N,00508.3168,E,0.0564,54.515,110605,,*13
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
@@ -310,7 +309,7 @@ $GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
$GPGSV,3,1,12,04,51,189,00,11,62,142,47,23,22,187,45,20,69,252,45*7F
$GPGSV,3,2,12,13,34,231,00,07,36,297,44,02,14,316,00,01,48,069,47*72
$GPGSV,3,3,12,27,46,081,00,14,17,039,47,25,19,090,44,24,44,294,47*72
-{"class":"SKY","tag":"MID4","time":1118480809.990,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":62,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":252,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":36,"az":297,"ss":44,"used":true},{"PRN":2,"el":14,"az":316,"ss":0,"used":false},{"PRN":1,"el":48,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":81,"ss":0,"used":false},{"PRN":14,"el":17,"az":39,"ss":47,"used":true},{"PRN":25,"el":19,"az":90,"ss":44,"used":true},{"PRN":24,"el":44,"az":294,"ss":47,"used":true}]}
+{"class":"SKY","tag":"MID4","time":1118480809.990,"xdop":0.90,"ydop":0.71,"vdop":1.00,"tdop":1.60,"hdop":1.80,"gdop":2.00,"pdop":0.80,"satellites":[{"PRN":4,"el":51,"az":189,"ss":0,"used":false},{"PRN":11,"el":62,"az":142,"ss":47,"used":true},{"PRN":23,"el":22,"az":187,"ss":45,"used":true},{"PRN":20,"el":69,"az":252,"ss":45,"used":true},{"PRN":13,"el":34,"az":231,"ss":0,"used":false},{"PRN":7,"el":36,"az":297,"ss":44,"used":true},{"PRN":2,"el":14,"az":316,"ss":0,"used":false},{"PRN":1,"el":48,"az":69,"ss":47,"used":true},{"PRN":27,"el":46,"az":81,"ss":0,"used":false},{"PRN":14,"el":17,"az":39,"ss":47,"used":true},{"PRN":25,"el":19,"az":90,"ss":44,"used":true},{"PRN":24,"el":44,"az":294,"ss":47,"used":true}]}
$GPGGA,090651,5203.7604,N,00508.3168,E,1,08,1.80,35.10,M,46.772,M,,*7F
$GPRMC,090651,A,5203.7604,N,00508.3168,E,0.0544,53.714,110605,,*14
$GPGSA,A,3,00,00,00,00,00,00,00,00,,,,,0.8,1.8,1.0*32
diff --git a/test_bits.c b/test_bits.c
index a225dfc0..455c4c9c 100644
--- a/test_bits.c
+++ b/test_bits.c
@@ -15,14 +15,14 @@ typedef unsigned long long ubig;
static unsigned char buf[80];
static union int_float i_f;
static union long_double l_d;
-static char sb1,sb2;
-static unsigned char ub1,ub2;
-static short sw1,sw2;
-static unsigned short uw1,uw2;
-static int sl1,sl2;
-static unsigned int ul1,ul2;
-static long long sL1,sL2;
-static unsigned long long uL1,uL2;
+static char sb1, sb2;
+static unsigned char ub1, ub2;
+static short sw1, sw2;
+static unsigned short uw1, uw2;
+static int sl1, sl2;
+static unsigned int ul1, ul2;
+static long long sL1, sL2;
+static unsigned long long uL1, uL2;
static float f1;
static double d1;
@@ -36,40 +36,40 @@ static char /*@ observer @*/ *hexdump(const void *binbuf, size_t len)
/*@ -shiftimplementation @*/
for (i = 0; i < len; i++) {
- hexbuf[j++] = hexchar[ (ibuf[i]&0xf0)>>4 ];
- hexbuf[j++] = hexchar[ ibuf[i]&0x0f ];
+ hexbuf[j++] = hexchar[(ibuf[i] & 0xf0) >> 4];
+ hexbuf[j++] = hexchar[ibuf[i] & 0x0f];
}
/*@ +shiftimplementation @*/
- hexbuf[j] ='\0';
+ hexbuf[j] = '\0';
return hexbuf;
}
static void bedumpall(void)
{
(void)printf("getsb: %016llx %016llx %016llx %016llx\n",
- (ubig)sb1, (ubig)sb2,
- (ubig)getsb(buf, 0), (ubig)getsb(buf, 8));
+ (ubig) sb1, (ubig) sb2,
+ (ubig) getsb(buf, 0), (ubig) getsb(buf, 8));
(void)printf("getub: %016llx %016llx %016llx %016llx\n",
- (ubig)ub1, (ubig)ub2,
- (ubig)getub(buf, 0), (ubig)getub(buf, 8));
+ (ubig) ub1, (ubig) ub2,
+ (ubig) getub(buf, 0), (ubig) getub(buf, 8));
(void)printf("getbesw: %016llx %016llx %016llx %016llx\n",
- (ubig)sw1, (ubig)sw2,
- (ubig)getbesw(buf, 0), (ubig)getbesw(buf, 8));
+ (ubig) sw1, (ubig) sw2,
+ (ubig) getbesw(buf, 0), (ubig) getbesw(buf, 8));
(void)printf("getbeuw: %016llx %016llx %016llx %016llx\n",
- (ubig)uw1, (ubig)uw2,
- (ubig)getbeuw(buf, 0), (ubig)getbeuw(buf, 8));
+ (ubig) uw1, (ubig) uw2,
+ (ubig) getbeuw(buf, 0), (ubig) getbeuw(buf, 8));
(void)printf("getbesl: %016llx %016llx %016llx %016llx\n",
- (ubig)sl1, (ubig)sl2,
- (ubig)getbesl(buf, 0), (ubig)getbesl(buf, 8));
+ (ubig) sl1, (ubig) sl2,
+ (ubig) getbesl(buf, 0), (ubig) getbesl(buf, 8));
(void)printf("getbeul: %016llx %016llx %016llx %016llx\n",
- (ubig)ul1, (ubig)ul2,
- (ubig)getbeul(buf, 0), (ubig)getbeul(buf, 8));
+ (ubig) ul1, (ubig) ul2,
+ (ubig) getbeul(buf, 0), (ubig) getbeul(buf, 8));
(void)printf("getbesL: %016llx %016llx %016llx %016llx\n",
- (ubig)sL1, (ubig)sL2,
- (ubig)getbesL(buf, 0), (ubig)getbesL(buf, 8));
+ (ubig) sL1, (ubig) sL2,
+ (ubig) getbesL(buf, 0), (ubig) getbesL(buf, 8));
(void)printf("getbeuL: %016llx %016llx %016llx %016llx\n",
- (ubig)uL1, (ubig)uL2,
- (ubig)getbeuL(buf, 0), (ubig)getbeuL(buf, 8));
+ (ubig) uL1, (ubig) uL2,
+ (ubig) getbeuL(buf, 0), (ubig) getbeuL(buf, 8));
(void)printf("getbef: %f %f\n", f1, getbef(buf, 24));
(void)printf("getbed: %.16f %.16f\n", d1, getbed(buf, 16));
}
@@ -77,34 +77,35 @@ static void bedumpall(void)
static void ledumpall(void)
{
(void)printf("getsb: %016llx %016llx %016llx %016llx\n",
- (ubig)sb1, (ubig)sb2,
- (ubig)getsb(buf, 0), (ubig)getsb(buf, 8));
+ (ubig) sb1, (ubig) sb2,
+ (ubig) getsb(buf, 0), (ubig) getsb(buf, 8));
(void)printf("getub: %016llx %016llx %016llx %016llx\n",
- (ubig)ub1, (ubig)ub2,
- (ubig)getub(buf, 0), (ubig)getub(buf, 8));
+ (ubig) ub1, (ubig) ub2,
+ (ubig) getub(buf, 0), (ubig) getub(buf, 8));
(void)printf("getlesw: %016llx %016llx %016llx %016llx\n",
- (ubig)sw1, (ubig)sw2,
- (ubig)getlesw(buf, 0), (ubig)getlesw(buf, 8));
+ (ubig) sw1, (ubig) sw2,
+ (ubig) getlesw(buf, 0), (ubig) getlesw(buf, 8));
(void)printf("getleuw: %016llx %016llx %016llx %016llx\n",
- (ubig)uw1, (ubig)uw2,
- (ubig)getleuw(buf, 0), (ubig)getleuw(buf, 8));
+ (ubig) uw1, (ubig) uw2,
+ (ubig) getleuw(buf, 0), (ubig) getleuw(buf, 8));
(void)printf("getlesl: %016llx %016llx %016llx %016llx\n",
- (ubig)sl1, (ubig)sl2,
- (ubig)getlesl(buf, 0), (ubig)getlesl(buf, 8));
+ (ubig) sl1, (ubig) sl2,
+ (ubig) getlesl(buf, 0), (ubig) getlesl(buf, 8));
(void)printf("getleul: %016llx %016llx %016llx %016llx\n",
- (ubig)ul1, (ubig)ul2,
- (ubig)getleul(buf, 0), (ubig)getleul(buf, 8));
+ (ubig) ul1, (ubig) ul2,
+ (ubig) getleul(buf, 0), (ubig) getleul(buf, 8));
(void)printf("getlesL: %016llx %016llx %016llx %016llx\n",
- (ubig)sL1, (ubig)sL2,
- (ubig)getlesL(buf, 0), (ubig)getlesL(buf, 8));
+ (ubig) sL1, (ubig) sL2,
+ (ubig) getlesL(buf, 0), (ubig) getlesL(buf, 8));
(void)printf("getleuL: %016llx %016llx %016llx %016llx\n",
- (ubig)uL1, (ubig)uL2,
- (ubig)getleuL(buf, 0), (ubig)getleuL(buf, 8));
+ (ubig) uL1, (ubig) uL2,
+ (ubig) getleuL(buf, 0), (ubig) getleuL(buf, 8));
(void)printf("getlef: %f %f\n", f1, getlef(buf, 24));
(void)printf("getled: %.16f %.16f\n", d1, getled(buf, 16));
}
-struct unsigned_test {
+struct unsigned_test
+{
unsigned char *buf;
unsigned int start, width;
unsigned long long expected;
@@ -117,22 +118,22 @@ int main(void)
/*@ -observertrans -usereleased @*/
struct unsigned_test *up, unsigned_tests[] = {
/* tests using the big buffer */
- {buf, 0, 1, 0, "first bit of first byte"},
- {buf, 0, 8, 0x01,"first 8 bits"},
- {buf, 32, 7, 2, "first seven bits of fifth byte"},
+ {buf, 0, 1, 0, "first bit of first byte"},
+ {buf, 0, 8, 0x01, "first 8 bits"},
+ {buf, 32, 7, 2, "first seven bits of fifth byte"},
{buf, 56, 12, 0x8f, "12 bits crossing 7th to 8th bytes (0x08ff)"},
- {buf, 78, 4, 11, "2 bits crossing 8th to 9th byte (0xfefd)"},
+ {buf, 78, 4, 11, "2 bits crossing 8th to 9th byte (0xfefd)"},
/* sporadic tests based on found bugs */
- {(unsigned char *)"\x19\x23\f6",
- 7, 2, 2, "2 bits crossing 1st to 2nd byte (0x1923)"},
+ {(unsigned char *)"\x19\x23\f6",
+ 7, 2, 2, "2 bits crossing 1st to 2nd byte (0x1923)"},
};
unsigned char *sp;
- memcpy(buf,"\x01\x02\x03\x04\x05\x06\x07\x08",8);
- memcpy(buf+8,"\xff\xfe\xfd\xfc\xfb\xfa\xf9\xf8",8);
- memcpy(buf+16,"\x40\x09\x21\xfb\x54\x44\x2d\x18",8);
- memcpy(buf+24,"\x40\x49\x0f\xdb",4);
+ memcpy(buf, "\x01\x02\x03\x04\x05\x06\x07\x08", 8);
+ memcpy(buf + 8, "\xff\xfe\xfd\xfc\xfb\xfa\xf9\xf8", 8);
+ memcpy(buf + 16, "\x40\x09\x21\xfb\x54\x44\x2d\x18", 8);
+ memcpy(buf + 24, "\x40\x49\x0f\xdb", 4);
/*@ +observertrans +usereleased @*/
(void)fputs("Test data:", stdout);
@@ -190,10 +191,11 @@ int main(void)
(void)printf("Testing bitfield extraction:\n");
- for (up = unsigned_tests;
- up < unsigned_tests+sizeof(unsigned_tests)/sizeof(unsigned_tests[0]);
+ for (up = unsigned_tests;
+ up <
+ unsigned_tests + sizeof(unsigned_tests) / sizeof(unsigned_tests[0]);
up++) {
- unsigned long long res = ubits((char *)buf, up->start, up->width);
+ unsigned long long res = ubits((char *)buf, up->start, up->width);
(void)printf("ubits(%s, %d, %d) %s should be %llu, is %llu: %s\n",
hexdump(buf, strlen((char *)buf)),
up->start, up->width, up->description, up->expected, res,
diff --git a/test_geoid.c b/test_geoid.c
index 5d428a59..a95bbc52 100644
--- a/test_geoid.c
+++ b/test_geoid.c
@@ -13,25 +13,23 @@
int main(int argc, char **argv)
{
- double lat, lon;
+ double lat, lon;
if (argc != 3) {
- fprintf(stderr,"Usage: %s lat lon\n",argv[0]);
+ fprintf(stderr, "Usage: %s lat lon\n", argv[0]);
return 1;
}
- lat=atof(argv[1]);
- lon=atof(argv[2]);
+ lat = atof(argv[1]);
+ lon = atof(argv[2]);
- if (lat > 90. || lat < -90.)
- {
- fprintf(stderr," -90 <= lat=%s(%.f) <= 90 ?\n",argv[1],lat);
+ if (lat > 90. || lat < -90.) {
+ fprintf(stderr, " -90 <= lat=%s(%.f) <= 90 ?\n", argv[1], lat);
return 1;
}
- if (lon > 180. || lat < -180.)
- {
- fprintf(stderr," -180 <= lon=%s(%.f) <= 180 ?\n",argv[2],lon);
+ if (lon > 180. || lat < -180.) {
+ fprintf(stderr, " -180 <= lon=%s(%.f) <= 180 ?\n", argv[2], lon);
return 1;
}
diff --git a/test_json.c b/test_json.c
index 0f5400e6..b656c4b0 100644
--- a/test_json.c
+++ b/test_json.c
@@ -17,36 +17,39 @@
static void assert_case(int num, int status)
{
- if (status != 0)
- {
- (void)fprintf(stderr, "case %d FAILED, status %d (%s).\n", num, status, json_error_string(status));
+ if (status != 0) {
+ (void)fprintf(stderr, "case %d FAILED, status %d (%s).\n", num,
+ status, json_error_string(status));
exit(1);
}
}
static void assert_string(char *attr, char *fld, char *val)
{
- if (strcmp(fld, val))
- {
- (void)fprintf(stderr, "'%s' string attribute eval failed, value = %s.\n", attr, fld);
+ if (strcmp(fld, val)) {
+ (void)fprintf(stderr,
+ "'%s' string attribute eval failed, value = %s.\n",
+ attr, fld);
exit(1);
}
}
static void assert_integer(char *attr, int fld, int val)
{
- if (fld != val)
- {
- (void)fprintf(stderr, "'%s' integer attribute eval failed, value = %d.\n", attr, fld);
+ if (fld != val) {
+ (void)fprintf(stderr,
+ "'%s' integer attribute eval failed, value = %d.\n",
+ attr, fld);
exit(1);
}
}
static void assert_uinteger(char *attr, uint fld, uint val)
{
- if (fld != val)
- {
- (void)fprintf(stderr, "'%s' integer attribute eval failed, value = %u.\n", attr, fld);
+ if (fld != val) {
+ (void)fprintf(stderr,
+ "'%s' integer attribute eval failed, value = %u.\n",
+ attr, fld);
exit(1);
}
}
@@ -54,9 +57,10 @@ static void assert_uinteger(char *attr, uint fld, uint val)
static void assert_boolean(char *attr, bool fld, bool val)
{
/*@-boolcompare@*/
- if (fld != val)
- {
- (void)fprintf(stderr, "'%s' boolean attribute eval failed, value = %s.\n", attr, fld ? "true" : "false");
+ if (fld != val) {
+ (void)fprintf(stderr,
+ "'%s' boolean attribute eval failed, value = %s.\n",
+ attr, fld ? "true" : "false");
exit(1);
}
/*@+boolcompare@*/
@@ -68,9 +72,10 @@ static void assert_boolean(char *attr, bool fld, bool val)
*/
static void assert_real(char *attr, double fld, double val)
{
- if (fld != val)
- {
- (void)fprintf(stderr, "'%s' real attribute eval failed, value = %f.\n", attr, fld);
+ if (fld != val) {
+ (void)fprintf(stderr,
+ "'%s' real attribute eval failed, value = %f.\n", attr,
+ fld);
exit(1);
}
}
@@ -81,6 +86,7 @@ static struct gps_data_t gpsdata;
/* Case 1: TPV report */
+/* *INDENT-OFF* */
static const char json_str1[] = "{\"class\":\"TPV\",\
\"device\":\"GPS#1\",\"tag\":\"MID2\", \
\"time\":1119197561.890,\"lon\":46.498203637,\"lat\":7.568074350,\
@@ -201,8 +207,9 @@ static const struct json_attr_t json_attrs_8[] = {
{NULL},
};
/*@ +fullinitblock @*/
+/* *INDENT-ON* */
-int main(int argc UNUSED, char *argv[] UNUSED)
+int main(int argc UNUSED, char *argv[]UNUSED)
{
int status = 0;
@@ -250,7 +257,7 @@ int main(int argc UNUSED, char *argv[] UNUSED)
status = libgps_json_unpack(json_str5, &gpsdata, NULL);
assert_case(5, status);
assert_string("path", gpsdata.dev.path, "/dev/ttyUSB0");
- assert_integer("flags",gpsdata.dev.flags, 5);
+ assert_integer("flags", gpsdata.dev.flags, 5);
assert_string("driver", gpsdata.dev.driver, "Foonly");
status = json_read_object(json_str6, json_attrs_6, NULL);
diff --git a/test_mkgmtime.c b/test_mkgmtime.c
index 679d66c4..b4ad4fd0 100644
--- a/test_mkgmtime.c
+++ b/test_mkgmtime.c
@@ -10,10 +10,12 @@
#include "gps.h"
/*@-type@*/
-static struct {
- struct tm t;
- time_t result;
+static struct
+{
+ struct tm t;
+ time_t result;
} tests[] = {
+ /* *INDENT-OFF* */
/* sec, min, h, md, mon, year, wd, yd, isdst, gmtoff, zone timestamp what */
{{ 0, 0, 0, 1, 0, 70, 0, 0, 0, 0, 0, }, 0 },
{{ 0, 0, 0, 1, 0, 70, 0, 0, 0, 0, 0, }, 0 }, /* lower limit */
@@ -76,34 +78,37 @@ static struct {
{{ 0, 0, 0, 1, 11, 115, 0, 0, 0, 0, 0, }, 1448928000 }, /* month wrap */
{{ 59, 59, 23, 31, 11, 115, 0, 0, 0, 0, 0, }, 1451606399 }, /* month wrap */
{{ 0, 0, 0, 1, 0, 116, 0, 0, 0, 0, 0, }, 1451606400 }, /* month wrap */
+ /* *INDENT-ON* */
};
+
/*@-type@*/
/*@+longunsignedintegral*/
int main(int argc, char *argv[])
{
- int i;
- char tbuf[128];
- time_t ts;
- bool failed = false;
+ int i;
+ char tbuf[128];
+ time_t ts;
+ bool failed = false;
- (void)setenv("TZ", "GMT", 1);
+ (void)setenv("TZ", "GMT", 1);
- for (i = 0; i < (int)(sizeof(tests)/sizeof(tests[0])); i++) {
-#if 0 /* use this to calculate with glibc */
- ts = mktime(&tests[i].t);
+ for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i++) {
+#if 0 /* use this to calculate with glibc */
+ ts = mktime(&tests[i].t);
#else
- ts = mkgmtime(&tests[i].t);
+ ts = mkgmtime(&tests[i].t);
#endif
- if (ts != tests[i].result) {
- failed = true;
- (void)strftime(tbuf, sizeof(tbuf), "%F %T", &tests[i].t);
- (void)printf("test %2d failed. " \
- "Time returned from: %s should be %lu (but was: %lu)\n",
- i, tbuf, (unsigned long) tests[i].result, (unsigned long) ts);
- }
+ if (ts != tests[i].result) {
+ failed = true;
+ (void)strftime(tbuf, sizeof(tbuf), "%F %T", &tests[i].t);
+ (void)printf("test %2d failed. "
+ "Time returned from: %s should be %lu (but was: %lu)\n",
+ i, tbuf, (unsigned long)tests[i].result,
+ (unsigned long)ts);
}
- return (int)failed;
+ }
+ return (int)failed;
}
-/*@-longunsignedintegral*/
+/*@-longunsignedintegral*/
diff --git a/test_packet.c b/test_packet.c
index e1fd8cbf..f2b8a64c 100644
--- a/test_packet.c
+++ b/test_packet.c
@@ -16,7 +16,7 @@
static int verbose = 0;
-void gpsd_report(int errlevel, const char *fmt, ... )
+void gpsd_report(int errlevel, const char *fmt, ...)
/* assemble command in printf(3) style, use stderr or syslog */
{
if (errlevel <= verbose) {
@@ -24,22 +24,25 @@ void gpsd_report(int errlevel, const char *fmt, ... )
va_list ap;
buf[0] = '\0';
- va_start(ap, fmt) ;
- (void)vsnprintf(buf + strlen(buf), sizeof(buf)-strlen(buf), fmt, ap);
+ va_start(ap, fmt);
+ (void)vsnprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), fmt,
+ ap);
va_end(ap);
(void)fputs(buf, stderr);
}
}
-struct map {
- char *legend;
- char test[MAX_PACKET_LENGTH+1];
- size_t testlen;
- int garbage_offset;
- int type;
+struct map
+{
+ char *legend;
+ char test[MAX_PACKET_LENGTH + 1];
+ size_t testlen;
+ int garbage_offset;
+ int type;
};
+/* *INDENT-OFF* */
/*@ -initallelements +charint -usedef @*/
static struct map tests[] = {
/* NMEA tests */
@@ -233,6 +236,7 @@ static struct map tests[] = {
},
};
/*@ +initallelements -charint +usedef @*/
+/* *INDENT-ON* */
static int packet_test(struct map *mp)
{
@@ -240,21 +244,24 @@ static int packet_test(struct map *mp)
int failure = 0;
packet_init(&packet);
- /*@i@*/memcpy(packet.inbufptr = packet.inbuffer, mp->test, mp->testlen);
+ /*@i@*/ memcpy(packet.inbufptr = packet.inbuffer, mp->test, mp->testlen);
packet.inbuflen = mp->testlen;
/*@ -compdef -uniondef -usedef -formatcode @*/
packet_parse(&packet);
if (packet.type != mp->type)
- printf("%2zi: %s test FAILED (packet type %d wrong).\n", mp-tests+1, mp->legend, packet.type);
- else if (memcmp(mp->test + mp->garbage_offset, packet.outbuffer, packet.outbuflen)) {
- printf("%2zi: %s test FAILED (data garbled).\n", mp-tests+1, mp->legend);
+ printf("%2zi: %s test FAILED (packet type %d wrong).\n",
+ mp - tests + 1, mp->legend, packet.type);
+ else if (memcmp
+ (mp->test + mp->garbage_offset, packet.outbuffer,
+ packet.outbuflen)) {
+ printf("%2zi: %s test FAILED (data garbled).\n", mp - tests + 1,
+ mp->legend);
++failure;
} else
- printf("%2zi: %s test succeeded.\n", mp-tests+1, mp->legend);
+ printf("%2zi: %s test succeeded.\n", mp - tests + 1, mp->legend);
#ifdef DUMPIT
- for (cp = packet.outbuffer;
- cp < packet.outbuffer + packet.outbuflen;
- cp++) {
+ for (cp = packet.outbuffer;
+ cp < packet.outbuffer + packet.outbuflen; cp++) {
if (lexer->type != NMEA_PACKET)
(void)printf(" 0x%02x", *cp);
else if (*cp == '\r')
@@ -286,7 +293,7 @@ int main(int argc, char *argv[])
singletest = atoi(optarg);
break;
case 'v':
- verbose = atoi(optarg);
+ verbose = atoi(optarg);
break;
}
}
@@ -294,7 +301,7 @@ int main(int argc, char *argv[])
if (singletest)
failcount += packet_test(tests + singletest - 1);
else
- for (mp = tests; mp < tests + sizeof(tests)/sizeof(tests[0]); mp++)
+ for (mp = tests; mp < tests + sizeof(tests) / sizeof(tests[0]); mp++)
failcount += packet_test(mp);
exit(failcount > 0 ? 1 : 0);
}
diff --git a/www/client-howto.txt b/www/client-howto.txt
index 34fe74eb..d9114015 100644
--- a/www/client-howto.txt
+++ b/www/client-howto.txt
@@ -9,7 +9,7 @@ http://gpsd.berlios.de/client-howto.txt[]
== Introduction ==
This document is a guide to interfacing client applications with GPSD.
-It surveys the available binding and their use cases. It also explains
+It surveys the available bindings and their use cases. It also explains
some sharp edges in the client API which, unfortunely, are fundamental
results of the way GPS sensor devices operate, and suggests tactics
for avoiding being cut.
@@ -170,10 +170,11 @@ of every client that has issued a ?WATCH.
In order to make this work, gpsd has a packet sniffer inside it that
does autobauding and packet-protocol detection. Normally the packet
-sniffer will achive sync in well under a second, but it can take
-longer if your serial traffic is degraded by dodgy cables or
-electrical noise, or if the GPS is configured to run at an unusual
-speed/parity/stopbit configuration.
+sniffer will achive sync in well under a second (my measured times
+range from 0.10 to 0.53 sec at 4800bps), but it can take longer if
+your serial traffic is degraded by dodgy cables or electrical noise,
+or if the GPS is configured to run at an unusual speed/parity/stopbit
+configuration.
The real point here is that the delay is *variable*. The client
library, and your application, can't assume a neat lockstep of
diff --git a/www/faq.html b/www/faq.html
index 0c53a5af..e92b66d1 100644
--- a/www/faq.html
+++ b/www/faq.html
@@ -67,6 +67,7 @@ GPSD Frequently Asked Questions
<ul>
<li><a href='#bug-reporting'>How do I report bugs in GPSD?</a><br/>
<li><a href='#nodata'>I get no data from my GPS</a></h1>
+<li><a href='#startup'>Why does getting a fix take so long after powerup?</li>
<li><a href='#timelag'>Why does GPS time lag wall time by 11-15 seconds?</a></li>
<li><a href='#speed'>Why does my receiver report wildly fluctuating speed?</a><br/>
<li><a href='#gpsdrive'>Why do I get implausibly low speeds when using gpsdrive?</a><br/>
@@ -287,7 +288,7 @@ the version.</p>
<p>This answer may apply if you have followed the Quick Start
procedure on the manual page but <code>gpsd</code> reports no data.</p>
-<p>Check for the obvious thing &mdash; a disconnected or loose cable<
+<p>Check for the obvious thing &mdash; a disconnected or loose cable
&mdash; first. Make sure you specified the device your GPS is
actually plugged into.</p>
@@ -311,6 +312,38 @@ product=0×7523</code>. Do not copy those hex numbers slavishly, they
are examples. To get the right numbers, you will need to dig up the
vendor and product ID of your USB-serial converter device.</p>
+<h1 id="startup">Why does getting a fix take so long after powerup?</h1>
+
+<p>On a Linux machine, the <code>gpsd</code> daemon normally takes
+between 0.1 and 0.6 seconds to handshake with your hardware. After
+that you will receive GPS reports within a second of when the sensor
+issues them. GPSD itself adds <a
+href="http://gpsd.berlios.de/performance.html">no measurable
+latency</a>, but RS-323 transmission time to <code>gpsd</code> can be
+significant; you can cut this time by increasing the baud rate.</p>
+
+<p>Longer handshake delays have been reported from other platforms.
+Under OpenBSD, time to handshake with some binary GPSes (including
+SiRFs) can be up to two minutes. This seems to reflect some bad
+interaction between the autobauding code in <code>gpsd</code> and the
+operating system's tty layer; when <code>gpsd</code> is compiled to
+use a fixed port speed, handshake times drop to a fraction of a
+second.</p>
+
+<p>If you are starting a GPS for the first time, or after it has been
+powered off for more than two weeks, this is a 'cold start'; it needs
+to get a new satellite ephemeris to do its job. The satellites
+broadcast this information very slowly (at 50bps) on a fixed schedule,
+and it can take up to 20 minutes.</p>
+
+<p>Warm start on a modern GPS with a good skyview (4 or more sats
+visible) normally takes about 30 seconds. (Vendor spec sheets fib by
+quoting this time only, leaving out the cold-start lag to fetch
+ephemeris.) If it's taking longer, the first thing to suspect is that
+your skyview is poor. Especially if you're indoors.</p>
+
+<p>The best advice is: go outside and be patient for a few minutes.</p>
+
<h1 id="timelag">Why does GPS time lag wall time by 11-15 seconds?</h1>
<p>Your GPS may have dropped its leap-second offset. You can tell you
diff --git a/www/future.html b/www/future.html
index d720f0c1..24cf2995 100644
--- a/www/future.html
+++ b/www/future.html
@@ -73,19 +73,26 @@ poses some significant deployment challenges as well.</p>
<p>Over the next few releases we're going to be preoccupied with
<a href="protocol-transition.html">managing the transition to the
-new protocol.</a>. See that document is our tentative release schedule:</p>
+new protocol.</a>. See that document for our tentative release schedule:</p>
<p>For more on specific tasks planned for upcoming releases, see our
<a href="TODO">file</a>.</p>
<h2 id="hosting">Changing hosting sites</h2>
-<p>We're presently (March 2010) hosted at <a
+<p>We're presently (April 2010) hosted at <a
href="http://developer.berlios.de">berlios.de</a>, but find that it
has become extremely flaky of late (logins failing due to broken SSL
certs is the most recent symptom). We plan to change sites some time
in 2010.</p>
+<h2 id="buildsys">Changing build systems</h2>
+
+<p>Our build is presently autotools-based. We may move to scons in
+2010. Autotools is a festering pile of hacks, and will become a
+serious liability if David Ludlow's Windows port actually
+finishes.</p>
+
<h2 id="api_cleanup">Client API cleanup</h2>
<p>This is not a near-term project.</p>
diff --git a/www/gpsd1.gif b/www/gpsd1.gif
deleted file mode 100644
index 64cfbd2b..00000000
--- a/www/gpsd1.gif
+++ /dev/null
Binary files differ
diff --git a/www/gpsd1.png b/www/gpsd1.png
index dfd9079b..dfc8e921 100644
--- a/www/gpsd1.png
+++ b/www/gpsd1.png
Binary files differ
diff --git a/www/gpsd2.gif b/www/gpsd2.gif
deleted file mode 100644
index b95f5e4e..00000000
--- a/www/gpsd2.gif
+++ /dev/null
Binary files differ
diff --git a/www/gpsd2.png b/www/gpsd2.png
index 10681faf..3896f218 100644
--- a/www/gpsd2.png
+++ b/www/gpsd2.png
Binary files differ
diff --git a/www/hacking.html b/www/hacking.html
index aa6718b0..cebf116c 100644
--- a/www/hacking.html
+++ b/www/hacking.html
@@ -110,8 +110,7 @@ file in the source distribution.</p>
</ol>
<li><a href="#designahead">Future Protocol Directions</a></li>
<ol>
-<li><a href="#nonpvt">Non-TPV Data</a></li>
-<li><a href="#protov4">Design Sketch for GPSD-NG, the Next-Generation GPSD Protocol</a></li>
+<li><a href="#proposed">Proposed sentences</a></li>
</ol>
<li><a href="#blindalleys">Blind alleys</a></li>
<ol>
@@ -1140,7 +1139,7 @@ water depth and temperature via NMEA DPT and MTW sentences). JSON
gives a natural way to add ad-hoc fields, and we expect to
exploit that in the future.</p>
-<h2>Proposed sentences:</h2>
+<h2 id="proposed">Proposed sentences:</h2>
<p>Chris Kuethe has floated the following list requests for
discussion:</p>
diff --git a/www/history.html b/www/history.html
index 52d41a40..ab22c067 100644
--- a/www/history.html
+++ b/www/history.html
@@ -158,7 +158,7 @@ configuration tools; <code>gpsmon</code> dates from this time
<p>In 2007-2008 the GPSD project got its first new competition since
1.x days, a project called Gypsy positioned directly against what the
author believes to be our design mistakes. We discuss it <a
-href="gypsy.html">here.</a>.</p>
+href="gypsy.html">here</a>.</p>
<p>In July and August 2009 ESR <a
href="protocol-evolution.html">redesigned the GPSD command
diff --git a/www/index.html.in b/www/index.html.in
index 13009905..2a2e6718 100644
--- a/www/index.html.in
+++ b/www/index.html.in
@@ -197,20 +197,27 @@ list</a> here. Note: because of the way this website is maintained,
these files may reflect the state of the repository tip (development
version) rather than the latest released stable version.</p>
-<h1 id='downloads'>Downloads and packages</h1>
+<h1 id='downloads'>Repository, Downloads and Packages</h1>
-<p>Look in the <a
-href="http://developer.berlios.de/project/showfiles.php?group_id=2116">download</a>
-directory for tarballs of all released versions. Access to the
-bleeding-edge developer version is supported <a
-href="http://developer.berlios.de/git/?group_id=2116">via git</a>.
-The main project page is <a
-href='http://developer.berlios.de/projects/gpsd/'>here on
-berlios.de</a>.</p>
+<dl>
+<dt><a href='http://developer.berlios.de/projects/gpsd/'>Project page</a>
+<dd>The main project page on Berlios</dd>
+
+<dt><a
+href="http://developer.berlios.de/project/showfiles.php?group_id=2116">Releases</a>
+<dd>Where to get release tarballs</dd>
+
+<dt><a href="http://developer.berlios.de/git/?group_id=2116">Browse Code</a></dt>
+<dd>Developer access to master git repository</dd>
+
+<dt><a
+href="http://git.debian.org/?p=users/bzed/mirror/gpsd.git">Debian mirror</a></dt>
+<dd>Debian mirror, updated every 7 minutes.</dd>
+</dl>
<p>If you are using a Debian-based distribution (including Ubuntu) you
can probably install <code>gpsd</code> through your regular package
-manager or by tying <code>"sudo apt-get gpsd"</code> at the command
+manager or by typing <code>"sudo apt-get gpsd"</code> at the command
line.</p>
<h1 id='mailing-lists'>Mailing Lists</h1>
@@ -447,10 +454,6 @@ href='http://www.wigle.net'>JiGLE</a> can still get GPS data from
netstumbler. This program is not genetically related to
<code>gpsd</code>.</p>
-<p>There is an interesting alpha-stage proposal called <a
-href='http://www.gpster.net/locod.html'>locod</a> that aims to
-integrate location information from GPSes and other sources.</p>
-
<p><a
href='http://users.hol.gr/~dzach/gpsfeed/index.html'>gpsfeed+</a> is a
program that simulates the output of a GPS in motion, and can be used
diff --git a/www/protocol-evolution.txt b/www/protocol-evolution.txt
index 6535db79..f51ca894 100644
--- a/www/protocol-evolution.txt
+++ b/www/protocol-evolution.txt
@@ -1,6 +1,6 @@
= GPSD-NG: A Case Study in Application Protocol Evolution =
Eric S. Raymond <esr@thyrsus.com>
-v1.3, August 2009
+v1.4, April 2010
== Introduction ==
@@ -310,8 +310,8 @@ of a 'W+R+' command.
Even had I not anticipated parsing JSON arguments in gpsd, I try to
limit malloc use in the client libraries as well. Before the
-new-protocol implementation only used two calloc(3) calls, in very
-careful ways. Now they use none at all.
+new-protocol implementation the client library only used two calloc(3)
+calls, in very careful ways. Now they use none at all.
So my next challenge was to write and verify a tiny JSON parser that
is driven by sets of fixed-extent structures - they tell it what shape
@@ -324,7 +324,7 @@ comments (but not including 165 LOC of unit-test code).
== Un-channeling: the power ==
Both gpsd and its C client library could now count on parsing JSON;
-that gave me my infrastructure. And an extremely strong one one, too;
+that gave me my infrastructure. And an extremely strong one, too;
the type ontology of JSON is rich enough that I'm not likely to ever
have to replace it. Of course this just opened up the next question -
now that I can readily pass complex objects between gpsd and its
@@ -348,8 +348,9 @@ devices so gpsd sees them as serial devices. Because X also uses pty
devices for virtual terminals, the device names that a gpsd instance
running under gpsfake sees may depend on random factors like the
number of terminal emulators I have open. This is a problem when
-regression-testing! At some point, this issue is going to require me
-to write a configuration command that suppresses device display.
+regression-testing! I thought this issue was going to require me
+to write a configuration command that suppresses device display; I
+ended up writing a sed filter in my regression-test driver instead.
Now we come back to our previous example:
@@ -452,14 +453,12 @@ in combination with the increasing use of metaprotocols.
Second, I noted *a shift from lockstep conversational interfaces to
event streams*.
-The big change in the second protocol version was watcher
-mode. One of the possibilities this opens up (and, in fact, it's
-a possibility that the C client library packages for you) is that
-you can put the report interpreter into an asychronous thread that
-magically updates a C struct for you every so often, without
-the rest of your program having to know or care how that is being
-done (except possibly by waiting a mutex to ensure it doesn't read
-a partially-updated state).
+The big change in the second protocol version was watcher mode. One
+of the possibilities this opens up is that you can put the report
+interpreter into an asychronous thread that magically updates a C
+struct for you every so often, without the rest of your program having
+to know or care how that is being done (except possibly by waiting a
+mutex to ensure it doesn't read a partially-updated state).
Analogous developments have been visible in other Internet protocols
over roughly the same period. Compare, for example, POP3 to IMAP. The
@@ -590,5 +589,3 @@ I have found JSON pleasant to work with, liberating, and
thought-provoking; hence this paper. I will certainly reach for this
Swiss-army knife first thing, next time I have to design an
application protocol.
-
-
diff --git a/www/upstream-bugs.html b/www/upstream-bugs.html
index 14e279a8..2679f47a 100644
--- a/www/upstream-bugs.html
+++ b/www/upstream-bugs.html
@@ -161,7 +161,7 @@ but the nature of the workaround only makes ther bug more mysterious.</p>
<p>We've had one report (in march 2009) of the NTPSHM feature
clobbering altitude reports, on a Technologic TS-5500 board running a
-customized 2.4.34 kernel using a <code>gpsd</code> built with 2.95.3.
+customized 2.4.34 kernel using a <code>gpsd</code> built with GCC 2.95.3.
When NTPSHM was disabled, altitude was reported correctly.</p>
<p>Shared memory was bug-plagued on older Linux kernels; one notorious
diff --git a/www/writing-a-driver.xml b/www/writing-a-driver.xml
index c0325b1a..00053795 100644
--- a/www/writing-a-driver.xml
+++ b/www/writing-a-driver.xml
@@ -16,6 +16,15 @@
<revhistory>
<revision>
+ <revnumber>1.9</revnumber>
+ <date>13 Apr 2010</date>
+ <authorinitials>er</authorinitials>
+ <revremark>
+ Updated by esr; added event_triggermatch and the new
+ ntp_offset member.
+ </revremark>
+ </revision>
+ <revision>
<revnumber>1.8</revnumber>
<date>16 Sep 2009</date>
<authorinitials>er</authorinitials>
@@ -611,6 +620,10 @@ called in the following circumstances:</para>
<listitem><para>When the main auto-baud hunt loop in the daemon offers
a new speed to probe at, with event argument 'event_wakeup'.</para></listitem>
+<listitem><para>When the driver has a trigger string and the NMEA driver
+sees it, 'event_triggermatch' fires. An 'event_switch_driver' should
+follow immediately.</para></listitem>
+
<listitem><para>
Whenever <application>gpsd</application> first achieves packet lock
with a device, with event type 'identified'.
@@ -707,6 +720,13 @@ possible, assemble your packet in
<structfield>session->msgbuflen</structfield>; this will allow
gpsmon to display the control messages it sends for you.</para>
+<!-- added by ESR, 2009 -->
+<para><structfield>.ntp_offset</structfield> points to code to compute
+an offset to be added, additionally to that in
+<filename>ntp.conf</filename> (if any) whe shipping time notifications
+to NTP. If multiple sentences set TIME_IS, this will differ by
+sentence type; it should differ by baud rare, as well. </para>
+
</sect1>
<sect1><title>Details of the driver parser</title>
diff --git a/www/xgps-sample.html b/www/xgps-sample.html
index 9fb964ec..aa7b28de 100644
--- a/www/xgps-sample.html
+++ b/www/xgps-sample.html
@@ -3,7 +3,7 @@
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
-<title>Title</title>
+<title>The xgps client</title>
<link rev="made" href="mailto:esr@snark.thyrsus.com" />
<link rel="stylesheet" href="main.css" type="text/css" media='all'/>
<meta name="MSSmartTagsPreventParsing" content="TRUE" />
diff --git a/xgps b/xgps
index 7f6247f6..4dba7fea 100755
--- a/xgps
+++ b/xgps
@@ -466,7 +466,10 @@ class Base:
def set_satlist_field(self, row, column, value):
"Set a specified field in the satellite list."
- self.satlist.set_value(self.row_iters[row], column, value)
+ try:
+ self.satlist.set_value(self.row_iters[row], column, value)
+ except IndexError:
+ sys.stderr.write("xgps: channel = %d, MAXCHANNELS = %d\n" % (row, gps.MAXCHANNELS))
def delete_event(self, widget, event, data=None):
gtk.main_quit()
@@ -582,9 +585,10 @@ class Base:
# I/O monitoring and gtk housekeeping
- def watch(self, daemon):
+ def watch(self, daemon, device):
"Set up monitoring of a daemon instance."
self.daemon = daemon
+ self.device = device
gobject.io_add_watch(daemon.sock, gobject.IO_IN, self.handle_response)
gobject.io_add_watch(daemon.sock, gobject.IO_ERR, self.handle_hangup)
gobject.io_add_watch(daemon.sock, gobject.IO_HUP, self.handle_hangup)
@@ -594,6 +598,8 @@ class Base:
if self.daemon.poll() == -1:
self.handle_hangup(source, condition)
if self.daemon.valid & gps.PACKET_SET:
+ if self.device and self.device != self.daemon.data["device"]:
+ return True
self.rawdisplay.set_text(self.daemon.response.strip())
if self.daemon.data["class"] == "SKY":
self.update_skyview(self.daemon.satellites)
@@ -646,18 +652,24 @@ if __name__ == "__main__":
'm':gps.client.deg_ddmm,
's':gps.client.deg_ddmmss}[degreefmt]
- if len(arguments) == 0:
- host = "localhost"
- else:
- host = arguments[0]
+ (host, port, device) = ("localhost", "2947", None)
+ if len(arguments):
+ args = arguments[0].split(":")
+ if len(args) >= 1:
+ host = args[0]
+ if len(args) >= 2:
+ port = args[1]
+ if len(args) >= 3:
+ device = args[2]
base = Base(deg_type=degreefmt)
base.set_units(unit_system)
try:
daemon = gps.gps(host=host,
+ port=port,
mode=gps.WATCH_ENABLE|gps.WATCH_JSON|gps.WATCH_SCALED,
verbose=debug)
- base.watch(daemon)
+ base.watch(daemon, device)
base.main()
except socket.error:
w = gtk.MessageDialog(type=gtk.MESSAGE_ERROR,